Ich möchte Medienabfragen verwenden, um die Größe von Elementen basierend auf der Größe eines div
Elements zu ändern, in dem sie sich befinden. Ich kann die Bildschirmgröße nicht verwenden, da sie div
nur wie ein Widget auf der Webseite verwendet wird und ihre Größe variieren kann.
Aktualisieren
Anscheinend wird derzeit daran gearbeitet: https://github.com/ResponsiveImagesCG/cq-demos
css
media-queries
Yazz.com
quelle
quelle
Antworten:
Nein, Medienabfragen funktionieren nicht basierend auf Elementen auf einer Seite. Sie sind so konzipiert, dass sie auf Geräten oder Medientypen basieren (daher werden sie als Medienabfragen bezeichnet ).
width
,,height
und andere dimensionsbasierte Medienfunktionen beziehen sich alle auf die Abmessungen des Ansichtsfensters oder des Gerätebildschirms in bildschirmbasierten Medien. Sie können nicht verwendet werden, um auf ein bestimmtes Element auf einer Seite zu verweisen.Wenn Sie Stile abhängig von der Größe eines bestimmten
div
Elements auf Ihrer Seite anwenden müssen , müssen Sie JavaScript verwenden, um Änderungen in der Größe diesesdiv
Elements anstelle von Medienabfragen zu beobachten .quelle
@element
Abfragen. W3C hat einige gute Dokumentationen zum Reim / Grund für@media
Abfragen: w3.org/TR/css3-mediaqueries/#width (dieser Link führt Sie zu dem Abschnitt über Breiten --- Breiten des Medientyps, nicht zu den darin enthaltenen Elementen).Ich habe gerade ein Javascript-Shim erstellt, um dieses Ziel zu erreichen. Werfen Sie einen Blick darauf, wenn Sie möchten, es ist ein Proof-of-Concept, aber seien Sie vorsichtig: Es ist eine frühe Version und benötigt noch etwas Arbeit.
https://github.com/marcj/css-element-queries
quelle
min-width
Attribute erneuert werden; Muss ich manuell eine CSS-Klassenliste schreiben, markierte Elemente, die zurmin-width
Erneuerung aktiviert sind ?Eine Medienabfrage innerhalb eines Iframes kann als Elementabfrage fungieren. Ich habe dies erfolgreich implementiert. Die Idee stammt aus einem kürzlich veröffentlichten Beitrag über Responsive Ads von Zurb. Kein Javascript!
quelle
Dies ist derzeit mit CSS allein nicht möglich, wie @BoltClock in der akzeptierten Antwort geschrieben hat. Sie können dies jedoch mithilfe von JavaScript umgehen.
Ich habe eine Containerabfrage (auch als Elementabfrage bezeichnet) erstellt, um diese Art von Problem zu lösen. Es funktioniert etwas anders als andere Skripte, sodass Sie den HTML-Code Ihrer Elemente nicht bearbeiten müssen. Alles, was Sie tun müssen, ist, das Skript einzuschließen und es wie folgt in Ihrem CSS zu verwenden:
https://github.com/ausi/cq-prolyfill
quelle
Ich bin vor ein paar Jahren auf dasselbe Problem gestoßen und habe die Entwicklung eines Plugins finanziert, das mir bei meiner Arbeit hilft. Ich habe das Plugin als Open Source veröffentlicht, damit auch andere davon profitieren können, und Sie können es auf Github herunterladen: https://github.com/eqcss/eqcss
Es gibt verschiedene Möglichkeiten, wie wir verschiedene Reaktionsstile anwenden können, je nachdem, was wir über ein Element auf der Seite wissen können. Hier sind einige Elementabfragen, mit denen Sie mit dem EQCSS-Plugin in CSS schreiben können:
Welche Bedingungen werden für reaktionsfähige Stile mit EQCSS unterstützt?
Gewichtsabfragen
px
%
px
%
Höhenabfragen
px
%
px
%
Abfragen zählen
Spezielle Selektoren
In EQCSS-Elementabfragen können Sie auch drei spezielle Selektoren verwenden, mit denen Sie Ihre Stile genauer anwenden können:
$this
(die Elemente, die der Abfrage entsprechen)$parent
(die übergeordneten Elemente der Elemente, die der Abfrage entsprechen)$root
(das Stammelement des Dokuments<html>
)Mit Elementabfragen können Sie Ihr Layout aus individuell ansprechenden Designmodulen zusammenstellen, die jeweils ein wenig "Selbstbewusstsein" dafür haben, wie sie auf der Seite angezeigt werden.
Mit EQCSS können Sie ein Widget so gestalten, dass es von 150 Pixel Breite bis 1000 Pixel Breite gut aussieht. Anschließend können Sie dieses Widget mithilfe einer beliebigen Vorlage (auf einer beliebigen Site) und in jeder Seitenleiste auf jeder Seite sicher ablegen
quelle
Aus Layoutsicht ist es möglich, moderne Techniken einzusetzen.
Es wurde (glaube ich) von Heydon Pickering erfunden. Er beschreibt den Prozess hier detailliert: http://www.heydonworks.com/article/the-flexbox-holy-albatross
Chris Coyier nimmt es auf und arbeitet hier eine Demo durch: https://css-tricks.com/putting-the-flexbox-albatross-to-real-use/
Um das Problem zu bekräftigen, unterhalb wir 3 derselben Komponente zu sehen, die jeweils aus drei orange divs markiert
a
,b
undc
.Die Blöcke der zweiten beiden werden vertikal angezeigt, da sie auf den horizontalen Raum beschränkt sind, während die Blöcke der oberen Komponenten 3 horizontal angeordnet sind.
Es verwendet die
flex-basis
CSS-Eigenschaft und CSS-Variablen, um diesen Effekt zu erstellen.Demo
Heydons Artikel besteht aus 1000 Wörtern, die ihn ausführlich erklären, und ich würde es wärmstens empfehlen, ihn zu lesen.
quelle
Die Frage ist sehr vage. Wie BoltClock sagt, kennen Medienabfragen nur die Abmessungen des Geräts. Sie können jedoch Medienabfragen in Kombination mit Abstiegsselektoren verwenden, um Anpassungen vorzunehmen.
Die einzige andere Lösung erfordert JS.
quelle
Ich kann mir nur vorstellen, dass Sie mit CSS das erreichen können, was Sie wollen, indem Sie einen Flüssigkeitsbehälter für Ihr Widget verwenden. Wenn die Breite Ihres Containers ein Prozentsatz des Bildschirms ist, können Sie Medienabfragen verwenden, um abhängig von der Breite Ihres Containers zu formatieren, da Sie jetzt für die Abmessungen jedes Bildschirms wissen, wie groß Ihr Container ist. Angenommen, Sie möchten, dass Ihr Container 50% der Bildschirmbreite ausmacht. Bei einer Bildschirmbreite von 1200 Pixel wissen Sie dann, dass Ihr Container 600 Pixel groß ist
quelle
Ich habe auch an Medienanfragen gedacht, aber dann habe ich Folgendes gefunden:
Erstellen Sie einfach einen Wrapper
<div>
mit einem Prozentwert fürpadding-bottom
:Es wird zu einem führen
<div>
Höhe von 75% der Breite des Behälters (ein Seitenverhältnis von 4: 3).Diese Technik kann auch mit Medienabfragen und ein wenig Ad-hoc-Wissen über das Seitenlayout kombiniert werden, um eine noch feinere Steuerung zu erzielen.
Es ist genug für meine Bedürfnisse. Welches könnte auch für Ihre Bedürfnisse genug sein.
quelle
Sie können den ResizeObserver verwenden API verwenden. Es ist noch in den Anfängen, daher wird es noch nicht von allen Browsern unterstützt (aber es gibt mehrere Polyfills, die Ihnen dabei helfen können).
Grundsätzlich können Sie mit dieser API einen Ereignis-Listener an die Größenänderung eines DOM-Elements anhängen.
Demo 1 - Demo 2
quelle
Bei mir habe ich die maximale Breite des Div festgelegt, daher wird das kleine Widget nicht beeinflusst und die Größe des großen Widgets wird aufgrund des Stils mit maximaler Breite geändert.
quelle
.widget
ist nur ein Beispiel als Klasse für das div des Widgets.