CSS/Media Queries/Container Queries
Text-Info
- 10min
- mittel
- ● Einstieg in CSS
• CSS/Media Queries
Während Medienabfragen eine Methode zur Abfrage von Aspekten des Browsers oder der Geräteumgebung bieten, in der ein Dokument angezeigt wird (z. B. Abmessungen des Viewports oder Benutzereinstellungen), ermöglichen Containerabfragen das Testen von Aspekten von Elementen innerhalb des Dokuments (z. B. Rahmenabmessungen oder berechnete Stile).
Ein Abfragecontainer wird durch die Angabe der möglichen Abfragetypen unter Verwendung der Eigenschaft container-type (oder der shorthand container) erstellt. Stilregeln, die auf seine Nachkommen angewendet werden, können dann durch Abfragen mit der bedingten Gruppenregel @container konditioniert werden.
- Browserunterstützung
- caniuse.com
Inhaltsverzeichnis
Einsatz
Bei der Erstellung eines responsiven Designs verwenden Sie häufig eine Medienabfrage, um das Layout des Dokuments auf der Grundlage der Viewportbreite zu ändern.
Viele Designs haben jedoch gemeinsame Komponenten, die das Layout in Abhängigkeit von der verfügbaren Breite ihres Containers ändern. Dies muss sich nicht immer auf den Viewport beziehen, sondern auch darauf, wo im Layout die Komponente platziert ist.[1]
Ahmad Shadeed hat sich schon früh mit Containerabfragen beschäftigt und verfügt über eine wachsende Sammlung von Beispielen, die auf alltäglichen Mustern basieren.[2][3]
Anwendungsbeispiel
Cards sind eines der Entwurfsmuster, die für Container Queries geradezu prädestiniert scheinen. Sie sollen sich nicht nur responsiv über die Seitenbreite verteilen; sondern eben auch je nach verfügbarem Platz ihr Aussehen ändern.
container-type
Durch Hinzufügen der Eigenschaft container-type mit einem Größenwert wird ein containment-context für dieses Element erstellt. Das bedeutet, dass der Browser weiß, dass wir diesen Container später abfragen wollen. Sie können dann eine Abfrage schreiben, die sich auf diesen Containment-Kontext bezieht und nicht auf die Viewport-Größe, um Layout-Entscheidungen für eine Komponente zu treffen.
Eine Container-Abfrage wird mit @container erstellt. Damit wird der nächstgelegene containment-context abgefragt. Um die Karte nur dann zweispaltig darzustellen, wenn die Seitenleiste breiter als 40em ist, verwenden wir das folgende CSS:
.card-container {
container-type: inline-size;
}
.card {
}
@container (min-width: 40em){
.card {
display: grid;
grid-template-columns: 2fr 1fr;
}
}
Das Container-Parent mit der Klasse .card-container
erhält mit container-type
den Wert inline-size
.
Mit .card
erhält die Karte selbst (hier nicht dargestellte) Festlegungen.
Mit @container wird nun bei einer Mindestbreite von 40em ein grid erstellt.
container-name
Problematisch wird dies, wenn Sie auf einer Seite mehrere Container erstellen wollen. Hier empfiehlt es sich, dem Container-Parent mit container-name einen Namen zu geben:
.card-container {
container-type: inline-size;
container-type: card;
}
@container card (min-width: 40em){
.card {
display: grid;
grid-template-columns: 2fr 1fr;
}
}
Mit dem in container-name festgelegten Namen card
kann die @container-Abfrage fest mit dem Parent verknüpft werden. Dies schafft Übersicht!
container
container ist die zusammenfassende Eigenschaft von container-type und container-name:
.card-container {
container: card / inline-size;
}
@container card (min-width: 40em){
.card {
display: grid;
grid-template-columns: 2fr 1fr;
}
}
Die container-Eigenschaft erhält als Werte die durch ein /
getrennten Namen und Schlüsselwert.
Mehrspaltiges Layout mit CSS Container Queries
Container-Query-Einheiten
Das CSS Containment Module enthält neben den oben besprochenen Eigenschaften auch zahlreiche neue Einheiten. Wer mit den Einheiten vw, vh etc. für Viewports bereits vertraut ist, wird hier wenig Startschwierigkeiten haben.
Schriftgröße abhängig vom Container ändern
<div class="container">
<div class="card"> … </div>
</div>
.container {
container-type: inline-size;
}
.card {
font-size: clamp(1em,6cqi, 3em);
}
Als Wert für font-size wird in der CSS-Funktion clamp() eine variable Schriftgröße mit einer Mindest- und einer Maximalgröße angegeben. Die mittlere Angabe in clamp() legt den Orientierungspunkt fest. Mit 6cqi gestalten wir eine dynamische Schriftgröße auf Grundlage von 6% der Inline-Größe des Containers.
Polyfill
Mittlerweile (Stand Mai 2023) werden Container Queries von den letzten Versionen der Browser (Anteil: ca. 86%) unterstützt. Für ältere Versionen können Sie einen Polyfill von Chris Coyier verwenden.[4][5]
- GoogleChromeLabs auf github: container-query-polyfill von surma
// Support Test
const supportsContainerQueries = "container" in document.documentElement.style;
// Conditional Import
if (!supportsContainerQueries) {
import("https://cdn.skypack.dev/container-query-polyfill");
}
Siehe auch
Eigenschaften
Container-Einheiten
@-Regeln
Weblinks
Quellen
- ↑ Wann Media Queries an ihre Grenzen stoßen im Blog von kulturbanause
- ↑ css-tricks: iShadeed’s Container Queries Lab Geoff Graham on Sep 1, 2022
- ↑ iShadeed Lab - Container queries
- ↑ css-tricks: A New Container Query Polyfill That Just Works vom 06.01.2022
- ↑ github: GoogleChromeLabs /container-query-polyfill von surma
- csswg: CSS Containment Module Level 3
- MDN: CSS Container Queries
- css-tricks: Next Gen CSS: @container Una Kravets, May 11, 2021
- ishadeed.com: CSS Container Query Units vom 18.09.2021
- smashing-magazine: A Primer On CSS Container Queries Stephanie Eckles, 11.05.2021
deutsch
- kulturbanause: CSS Container Queries mit @container