</> HTML5Advent
ENFRESDEITPT

// css · Web Platform Advent #8

CSS Container Queries: Komponenten nach ihrem Container stylen, nicht nach dem Viewport

container-type, @container und container-name erklärt. Wie sich Container Queries von Media Queries unterscheiden und warum sie Komponenten wirklich wiederverwendbar machen.

Flache Icons eines Desktop-Monitors, eines Tablets, eines Laptops und eines Smartphones unterschiedlicher Größe

Container Queries lassen ein Element auf die Größe seines übergeordneten Containers reagieren statt auf die Größe des gesamten Viewports. Das ist das fehlende Teil, das eine Komponente endlich wiederverwendbar macht: dieselbe Karte kann in einer schmalen Seitenleiste auf eine Weise und in einer breiten Hauptspalte auf eine andere Weise layouten — auf derselben Seite, bei derselben Bildschirmbreite.

Warum Media Queries nicht ausreichten

Eine Media Query stellt nur eine Frage: wie breit ist der Viewport? Aber eine Komponente weiß nicht, wie breit der Viewport ist — sie weiß, wie viel Platz ihr gegeben wurde. Eine Karte, die in eine 300px breite Seitenleiste fällt, und dieselbe Karte in einer 900px breiten Rasterzelle brauchen unterschiedliche Layouts, obwohl die Viewport-Breite identisch ist. Container Queries lösen genau das.

Schritt 1: einen Containment-Kontext deklarieren

Du fragst einen Container ab, also musst du zuerst ein Element mit container-type als Container markieren:

.card-wrapper {
  container-type: inline-size;
}

inline-size bedeutet „lass mich die inline (meist horizontale) Dimension abfragen" — die häufigste Wahl. size fragt beide Dimensionen ab, und normal schaltet das Containment ab.

Schritt 2: mit @container abfragen

Jetzt kann sich jeder Nachfahre von .card-wrapper an die Breite des Wrappers anpassen:

.card {
  display: grid;
  gap: 1rem;
}

@container (min-width: 400px) {
  .card {
    grid-template-columns: 150px 1fr;
  }
}

Wenn der Wrapper mindestens 400px breit ist, wechselt die Karte zu einem zweispaltigen Layout. Setze dasselbe Markup irgendwo auf die Seite und es passt sich dort an, wo es landet — ohne Media Queries auf Seitenebene.

A smartphone resting on top of a tablet and a laptop, three screens of different sizes
Dieselbe Komponente muss oft sehr unterschiedlich viel Platz ausfüllen. Container Queries lassen sie sich an ihren Slot anpassen statt an das Gerät.

Container benennen

Wenn Container verschachtelt sind, gib ihnen mit container-name Namen, damit eine Query den richtigen anvisiert:

.layout { container: layout / inline-size; } /* name / type shorthand */

@container layout (min-width: 600px) {
  .card { /* responds to .layout, not a closer container */ }
}

Container-Query-Einheiten

Container Queries schalten außerdem Einheiten frei, die sich auf den Container statt auf den Viewport beziehen: cqw (1 % der Container-Breite), cqh, cqi (inline) und cqb (block). Fluide Typografie, die mit ihrem Container skaliert, wird zum Einzeiler:

.card h2 {
  font-size: clamp(1rem, 5cqi, 2rem);
}

Container Queries vs. Media Queries

Media QueryContainer Query
MisstViewport / GerätNächster dimensionierter Vorfahre
Setup nötigKeinescontainer-type auf einem Elternteil
Am besten fürLayout auf SeitenebeneWiederverwendbare Komponenten
Einheitenvw, vhcqw, cqi, ...

Browser-Support

Size-Container-Queries werden in aktuellem Chrome, Edge, Firefox und Safari unterstützt. Sie sind kein Ersatz für Media Queries — nutze Media Queries für die Gesamtstruktur der Seite und Container Queries für Komponenten, die portierbar sein müssen. Beide arbeiten gut zusammen.

Der mentale Wandel ist klein, aber kraftvoll: hör auf zu fragen „wie groß ist der Bildschirm?" und fang an zu fragen „wie viel Platz hat diese Komponente?". Genau diese eine Änderung macht die Komponenten eines Designsystems wirklich überall einsetzbar.