CSS & front-end
Container queries: componenten die zich aanpassen aan hun ruimte
Media queries kijken naar het scherm, container queries naar het blok eromheen. Waarom dat verschil je componenten eindelijk echt herbruikbaar maakt.
In het kort
- Container queries laten een component reageren op de grootte van zijn container in plaats van het viewport.
- Je maakt een element een container met container-type: inline-size en schrijft regels met @container.
- Een container kan zichzelf niet bevragen; de stijlen gelden voor zijn nakomelingen.
- Eenheden als cqi schalen mee met de container en werken goed samen met clamp().
- Media queries blijven nodig voor de paginalayout en gebruikersvoorkeuren.
Met container queries laat je een component reageren op de breedte van zijn eigen container in plaats van op de breedte van het scherm. Een kaart kan zo smal en gestapeld zijn in een zijbalk, en breed met afbeelding naast tekst in de hoofdkolom, met precies dezelfde CSS. Alle grote browsers ondersteunen container queries op basis van grootte inmiddels, dus je kunt ze vandaag gebruiken.
In dit artikel lees je hoe container queries werken, wanneer je ze inzet in plaats van media queries, en welke valkuilen je moet kennen.
Het probleem met media queries
Media queries zijn gebouwd rond het viewport: “als het scherm breder is dan 768 pixels, doe dan dit”. Dat werkt prima voor de grote lijnen van een layout. Maar componenten weten niet waar ze terechtkomen. Dezelfde productkaart kan in een grid van vier kolommen staan, in een zijbalk of in een brede uitgelichte sectie. Op een breed scherm is de kaart in die zijbalk nog steeds smal, maar de media query denkt dat er ruimte genoeg is.
De oplossing was jarenlang: extra modifier-classes, varianten per plek of JavaScript dat de breedte meet. Allemaal omwegen. Container queries lossen dit op in CSS zelf.
Zo werken container queries
Het werkt in twee stappen. Eerst maak je van een element een container. Daarna schrijf je regels voor de kinderen van die container op basis van zijn afmetingen.
.card-wrapper {
container-type: inline-size;
container-name: card;
}
.card {
display: grid;
gap: 1rem;
}
@container card (min-width: 28rem) {
.card {
grid-template-columns: 12rem 1fr;
}
}
Wat hier gebeurt:
container-type: inline-sizemaakt het element een container voor de inline-as, in een gewone Nederlandse of Engelse tekst dus de breedte.container-nameis optioneel, maar handig als je geneste containers hebt. Zonder naam kijkt@containernaar de dichtstbijzijnde voorouder die een container is.- De regel binnen
@containergeldt pas als de container minstens 28rem breed is, ongeacht hoe breed het scherm is.
Je kunt ook de shorthand gebruiken: container: card / inline-size;.
Belangrijke regel: een container kan zichzelf niet bevragen
De stijlen in een @container-blok gelden voor de nakomelingen van de container, niet voor de container zelf. Wil je de buitenste kaart stylen, zet de container dan op een wrapper eromheen. Dat is precies waarom het voorbeeld een .card-wrapper heeft.
Container query-eenheden
Naast de queries zelf krijg je nieuwe eenheden die relatief zijn aan de container. Daarmee schalen typografie en spacing mee met het component.
| Eenheid | Betekenis | Typisch gebruik |
|---|---|---|
cqi |
1% van de inline-grootte (meestal breedte) | Vloeiende koppen binnen een kaart |
cqb |
1% van de block-grootte (meestal hoogte) | Alleen bij containers met container-type: size |
cqw / cqh |
1% van breedte of hoogte | Fysieke variant van cqi/cqb |
cqmin / cqmax |
De kleinste of grootste van cqi en cqb | Elementen die in beide richtingen moeten passen |
Een praktische combinatie is font-size: clamp(1.25rem, 4cqi + 0.5rem, 2.25rem);. De kop groeit mee met de kaart, maar wordt nooit onleesbaar klein of absurd groot.
Container queries of media queries?
Container queries vervangen media queries niet. Ze hebben elk hun eigen taak:
- Media queries gebruik je voor de paginalayout: het aantal kolommen van de hoofdgrid, de navigatie die inklapt, voorkeuren zoals
prefers-reduced-motionenprefers-color-scheme. - Container queries gebruik je voor componenten die op verschillende plekken terechtkomen: kaarten, teasers, formulierblokken, prijstabellen, widgets.
Een vuistregel die we zelf hanteren: als je bij het schrijven van een media query denkt “behalve als dit component in de zijbalk staat”, dan wil je een container query.
Container queries combineren ook mooi met :has(). Daarmee kun je een component laten reageren op zowel zijn ruimte als zijn inhoud, bijvoorbeeld een andere layout als er wel of geen afbeelding in de kaart staat. Hoe dat werkt, lees je in CSS :has() in de praktijk.
Valkuilen en aandachtspunten
sizevraagt om een vaste hoogte. Metcontainer-type: sizebevraag je ook de hoogte, maar dan bepaalt de inhoud niet meer de hoogte van de container. Zonder expliciete hoogte klapt hij in. Gebruik dus vrijwel altijdinline-size.- Containment heeft gevolgen. Een container met
inline-sizekrijgt zijn breedte niet meer van zijn inhoud. In een flexbox of grid zonder expliciete breedte kan een container daardoor smaller worden dan je verwacht. - Style queries zijn nog niet overal. Er bestaan ook queries op custom properties (
@container style(--variant: compact)), maar die worden nog niet door alle browsers ondersteund. Gebruik ze alleen als progressieve verbetering. - Denk aan fallback-stijlen. Schrijf de basisstijl van een component voor de smalste situatie en voeg grotere varianten toe in
@container-regels. Dan blijft het component bruikbaar, wat er ook gebeurt.
Zo pak je het aan
- Kies één component dat op meerdere plekken voorkomt, zoals een kaart of call-to-action-blok.
- Zet een wrapper als container met
container-type: inline-sizeen geef hem een naam. - Schrijf de smalle versie als basis, zonder query.
- Voeg breekpunten toe op componentniveau met
@container. Kies ze op basis van wanneer de inhoud er goed uitziet, niet op basis van apparaatbreedtes. - Vervang vaste lettergroottes door
clamp()metcqiwaar dat zinvol is. - Test het component op elke plek waar het voorkomt, en ruim daarna de oude modifier-classes en media queries op.
Stel: een makelaar heeft woningkaarten op de homepage (drie naast elkaar), op de overzichtspagina (twee naast elkaar) en in een zijbalk (één smalle kolom). Met één container query wisselt de kaart zelf tussen gestapeld en horizontaal, en verdwijnen drie varianten uit de stylesheet.
Wil je direct aan de slag, dan vind je kant-en-klare voorbeelden in onze gratis CSS-snippets. Meer achtergrond over de specificatie staat op MDN.
Waarom dit ertoe doet voor je website
Container queries zijn niet alleen een fijnere manier van werken voor developers. Ze leiden tot minder CSS, minder uitzonderingen en componenten die zich voorspelbaar gedragen. Dat maakt een site makkelijker uit te breiden en te onderhouden, en voorkomt dat een nieuwe pagina het ontwerp breekt. In een maatwerk website bouwen we componenten daarom vanaf het begin zo dat ze overal passen.
Conclusie
Container queries verschuiven de vraag van “hoe groot is het scherm?” naar “hoeveel ruimte heeft dit component?”. Dat is de vraag die je eigenlijk altijd al wilde stellen. Gebruik media queries voor de paginalayout, container queries voor componenten, en combineer ze met clamp() en container-eenheden voor typografie die meeschaalt. Begin klein met één kaart en je merkt snel hoeveel uitzonderingen je kunt schrappen.
Zin om te experimenteren? Duik in het CSS-lab met gratis snippets en bouw je eerste container query vandaag nog.
Veelgestelde vragen
Worden container queries door alle browsers ondersteund?
Container queries op basis van grootte werken in alle grote moderne browsers. Style queries op custom properties hebben nog geen volledige ondersteuning.
Wat is het verschil tussen inline-size en size?
Met inline-size bevraag je alleen de breedte en blijft de hoogte door de inhoud bepaald. Met size bevraag je beide, maar dan heeft de container een expliciete hoogte nodig.
Vervangen container queries media queries?
Nee. Media queries blijven de beste keuze voor de layout van de hele pagina en voor voorkeuren zoals reduced motion, container queries zijn bedoeld voor losse componenten.
Kan ik container queries in WordPress of Bricks gebruiken?
Ja, het is gewone CSS. Je zet container-type op een wrapper-element en voegt de @container-regels toe aan je stylesheet.
