TaskBuild a card that responds to PARENT width, not viewport. .wrapper has container-type: inline-size + width: 280px. .card inside has padding 12px by default. @container (min-width: 250px) makes .card padding 24px + background: #efe.
@container: query the parent, not the viewport
100 XP8 min
Theory
The killer 2023+ feature
.card-container {
container-type: inline-size; /* opt this element in as a query container */
}
.card { padding: 12px; }
@container (min-width: 400px) {
.card { padding: 24px; display: grid; grid-template-columns: 1fr 1fr; }
}Now .card adapts to the SIZE OF ITS PARENT, not the viewport. Same component:
- In a 320px sidebar β compact single-column.
- In a 800px main area β 2-column with bigger padding.
Zero media queries.
container-type values
inline-sizeβ query the parent's WIDTH. The 99% case.sizeβ query both width AND height. Use rarely.normal(default) β opt OUT, this element is not a query container.
Named containers
.sidebar { container-name: sidebar; container-type: inline-size; }
.main { container-name: main; container-type: inline-size; }
@container sidebar (min-width: 200px) { ... }
@container main (min-width: 600px) { ... }Use names when a component might live inside MULTIPLE differently-named containers and you want explicit targeting.
Browser support 2026
All evergreen browsers shipped containers in 2022-23. Safe to use everywhere. Older browsers ignore the @container block β your CSS fallback applies (so make the default styles the "narrow" version, then enhance with @container for wider).
π
Sign up to start coding
Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β card required, cancel anytime.
Sign up β free trial βFirst 10 lessons in each track are free. No card needed for those.