Container Queries – Anpassung an den umfassenden Container
Mit Container Queries passt sich ein Element an die Breite seines übergeordneten Containers an und nicht wie bei Media Queries an die Breite des Viewports. Das ist perfekt für modulare, wiederverwendbare Komponenten.
Container Queries vs Media Queries
Container Queries ähneln Media Queries, aber sind flexibler, vor allem bei wiederverwendbaren Komponenten in komplexen Layouts. Es gibt zahlreiche Stilelemente, die in unterschiedlichen Umgebungen auftauchen können: z.B. Produktkarten (cards), die im Hauptbereich der Seite, in Sidebars und auf der Produktseite verwendet werden.
- Media Queries (@media) steuern das Layout und Stile basierend auf der Viewport-Größe (also je nach Breite des Browserfensters).
- Container Queries (@container) reagieren auf die Größe des übergeordneten Containers, nicht auf den gesamten Viewport.
Ein Beispiel sind die Auszüge von Blogposts, die in einer Sidebar oder in einem Grid-Layout platziert werden. Auch die Anordnung von Blog-Beiträgen im Raster der Startseite vs Sidebar fällt in diese Kategorie. Meist zeigt das Layout bei schmalen Viewports Karten und auch ihre Inhalte zeilenweise untereinander, und erst bei breiteren Viewpoints werden zwei oder mehr Karten nebeneinander gesetzt.
Bis zwei oder mehr Karten oder Blog-Teaser nebeneinander erscheinen, werden Bilder übergroß: dann ist es effizienter, auch die Inhalte von Karten nebeneinander zu setzen.
Grid – z.B. breiter Bereich der Landing Page
CSS Grid und Subgrid – Zeilen gleicher Höhe
Mit CSS flex und grid ist ein solider Spaltensatz eingezogen. Aber erst jetzt haben flex und grid endlich eine einfache Lösung für ein tägliches Problem: In zwei, drei oder mehr Spalten bilden Überschriften, Texte und Bilder ein Raster.
<div class="post-wrapper"> <div class="post"> <header class="post-header"> <h2 class="post-title"> <a href="/css-grid-und-subgrid/">CSS Grid und Subgrid – Zeilen gleicher Höhe</a> </h2> </header> <div class="postsvg"> <a href="/css-grid-und-subgrid/"> <img src="/wp-content/uploads/2022/09/css-grid-und-subgrid.svg" width="966" height="444" alt="CSS subgrad Spalten mit Zeilen gleicher Höhe"> </a> </div> <div class="postexcerpt"> <p>Mit CSS flex und grid ist ein solider Spaltensatz eingezogen. Aber erst jetzt haben flex und grid endlich eine einfache Lösung für ein tägliches Problem: In zwei, drei oder mehr Spalten bilden Überschriften, Texte und Bilder ein Raster.</p> </div> </div> </div>
Die wichtigsten Regeln und Konzepte für Container Queries
- Ein Container muss explizit mit container-type definiert werden:
/* Container definieren */ .post-wrapper { container-type: inline-size; /* oder: container-type: size, wenn auch die Höhe relevant ist */ padding: 1rem; width: 100%; max-width: 920px; background: gainsboro; }Ein zusätzlicher Wrapper ist eigentlich nicht nötig, solange container-type auf einem Vorfahren gesetzt ist.
inline-size misst die Breite (in Schreibrichtung, also meist horizontal). Container Queries messen nur die Größe des nächsten enthaltenen Containers – nicht des Viewports! - Zusätzlich kann container-name gesetzt werden, um gezielt auf den Container zuzugreifen:
.post-wrapper { container-type: inline-size; container-name: post; } - Die Container Query ähnelte einer @media-Query:
/* Wenn der Container breiter als 400px ist */ @container (min-width: 401px) { .post { display: grid; grid-template-areas: "header header" "image excerpt"; grid-template-columns: 1fr 1fr; gap: 1rem } }oder mit einem Namen
@container post (min-width: 400px) { … } - Container Queries wirkt nur auf Elemente innerhalb des definierten Containers.
Schriftgröße relativ zur Containergröße
Eine praktische Anwendung einer Container-Query ist das Anpassen der Schriftgröße an die Containergröße. Die Schriftgröße soll mit einem größer werdenden Monitor mitwachsen, aber bei einer bestimmten Containerbreite soll das Maximum der Schriftgröße erreicht werden.
section.container {
container-type: inline-size;
}
section.container .conttext {
font-size: clamp(
3.5rem, /* Mindestgröße (~56px) */
min(18vw, 14cqi), /* stärkerer Container-Einfluss */
8rem /* Maximalgröße (~128px) */
);
}
Die Schriftgröße ist flexibel, aber niemals kleiner als 3.5rem und niemals größer als 8rem. Wie die Schriftgröße zwischen Mindest- und Maximalgröße wächst, wird durch min(18vw, 14cqi) geklärt. min bedeutet dabei »Nimm immer den kleineren der beiden Werte«. 18vw reagiert auf die Fensterbreite, 14cqi auf die Containerbreite.
1cqi = 1% der Container-Breite (ohne container-type wäre cqi ungültig). min(18vw, 14cqi) sorgt dafür, dass die Schrift mit dem Bildschirm wächst, sich aber immer am verfügbaren Platz im Container orientiert.
Cards
Das Layout für Produkt-Karten und ebenso für die Auszüge von Blog-Beiträgen setzt Karten / Auszüge untereinander, bis der Platz auf einem größeren Monitor reicht, um zwei oder mehr Karten nebeneinander zu setzen.
Wenn diese Layout-Elemente nicht nur im Hauptbereich der Seite sitzen, sondern auch in Seitenleisten oder Fußleisten erscheinen, kommen ebenfalls Container-Queries zum Zuge.
.content,
.sidebar {
min-width: 120px;
container-type: inline-size;
container-name: cards;
}
/* Ab 520px: 2 Spalten */
@container cards (min-width: 520px) {
.card-grid {
display: flex;
flex-wrap: wrap;
}
.card {
flex: 1 1 calc(50% - 1rem);
}
}
/* Ab 920px: 4 Spalten */
@container cards (min-width: 920px) {
.card {
flex: 1 1 calc(25% - 1rem);
}
}
Die wichtigsten Regeln und Eigenschaft zu Container Queries
| Regel/Eigenschaft | Bedeutung |
|---|---|
container-type |
Aktiviert das Container-Verhalten |
container-name |
Optionaler Name für gezielte Abfragen |
@container |
Container Query-Syntax |
inline-size |
Container-Breite als Grundlage der Messung |
| Nur innere Elemente | Nur Elemente im Container können darauf reagieren |
| Kein JavaScript nötig | Container Queries sind rein CSS-basiert |
Können Container Queries in <img>-Tags für sizes eingesetzt werden?
Ein Clou der Container Queries ist die Anpassung von Bildgröße mit srcset und sizes an den umfassenden Container.
CSS für Container-Query
.cont {
container-type: inline-size;
}
.cont img {
width: 100%;
height: auto;
}
cqi steht für »Container Query Inline size«. Container ist der nächstgelegene Container mit container-type: inline-size. cqi ist also dynamisch und layoutabhängig
<img decoding="async" src="kitties-320x163.webp" srcset="kitties-320x163.webp 320w, kitties-460x234.webp 460w, kitties-720x367.webp 720w, kitties-980x500.webp 980w" sizes="100cqi" width="320" height="163" alt="Image Pack …">
Werden Container Queries die klassischen Media Queries ersetzen?
Immerhin sind Media Queries über 12 Jahre alt, und selbst einfache Internet-Auftritte profitieren von wiederverwendbaren Komponenten. Auf jeden Fall werden @container immer häufiger @media ergänzen.
| Merkmal | @media Query | @container Query |
|---|---|---|
| Was wird geprüft? | Die Größe des Viewports (z. B. width, height, prefers-color-scheme) | Die Größe eines übergeordneten Elements (z. B. container-type: inline-size) |
| Bezieht sich auf... | Das gesamte Fenster / Gerät | Einen Container (z. B. eine Section, Card, Sidebar) |
| Wann verwendet? | Für globale Layout-Anpassungen je nach Bildschirmgröße | Für komponentenspezifische Reaktionen auf die Größe des Containers |
| Beispiel-Anwendung | Grid-Layout auf 3 Spalten ab 768 px Breite | Eine Card zeigt Bild und Text nebeneinander, nur wenn genug Platz innerhalb der Card vorhanden ist |
| Kapselung | Nicht komponentenbasiert (global) | Sehr gut für Komponenten, Design-Systeme und Responsive Components geeignet |
| Support (2025) | Alle Browser | Sehr gut unterstützt (ab Chrome 105, Firefox 110, Safari 16.0) |