CSS Tutorial 0/203 lessons ~6 min read Lesson 139

    Container Queries

    container queries container queries (@container) apply styles based on a parent container's size — not the viewport. staff engineers use

    Course progress0%
    Focus
    27 guided sections
    Practice signal
    Examples included
    Career prep
    Interview Q&A included

    Introduction

    Container queries (@container) apply styles based on a parent container's size — not the viewport. Staff engineers use them when components live in sidebar, main, and modal contexts where viewport media queries pick wrong layout. Define container-type: inline-size (or size) on ancestor, query with @container (min-width: …).

    Container queries complete responsive component design — the component is responsive to its context, not the window.

    Business problem

    Business pressure: Product card looks correct full-width on mobile but broken in 240px dashboard widget — viewport is desktop-wide. Container queries fix component-local responsive without prop-drilling breakpoint classes from parent.

    • DS quality: One card component, all contexts.
    • Micro-frontends: Unknown parent width in federated shell.
    • Editor: CMS columns of varying width.

    Why this feature exists

    Platform history: Element queries dreamed for years; container queries shipped Chromium 105+, Safari 16+, Firefox 110+ (2023).

    • Problem solved: Viewport queries for component internals.
    • Modern role: container-type + @container + container query units cqw.

    Browser rendering perspective

    Rendering impact: Container size changes trigger contained subtree style recalc — smaller blast radius than viewport resize if containment set. container-type creates size containment — may affect layout in subtle ways — test overflow.

    • Containment: size containment clips overflow — document padding on container.

    Internal browser workflow

    Setup: ancestor container-type → child @container rules → optional container-name for named queries.

    Feature deep dive

    Product card example:

    css
    .card-container { container-type: inline-size; container-name: card; }
    .card { display: flex; flex-direction: column; gap: 0.5rem; }
    @container card (min-width: 28rem) {
    .card { flex-direction: row; align-items: center; }
    .card__media { width: 40%; }
    }
    @container (min-width: 20rem) {
    .card__title { font-size: 1.25rem; }
    }

    Syntax

    container-type: inline-size (width only), size (width+height — strict containment). Units: cqw, cqh, cqi container query units.

    Examples

    Named container chain:

    css
    .sidebar { container-type: inline-size; container-name: sidebar; }
    @container sidebar (max-width: 15rem) {
    .nav { flex-direction: column; }
    }

    Real-world use

    Shopify Polaris exploring container queries for admin cards. Design system articles 2023–2024 adopt @container for card, table, and nav patterns. WordPress block themes use container queries in block layouts.

    Real production example

    Pattern: DS components document required container-type on parent wrapper in Storybook.

    Enterprise use case

    Enterprise: Dashboard widgets standardize on container queries — grid cell width varies.

    Accessibility considerations

    A11y: Layout change at container width must not trap focus — modal card layout switch still keyboard accessible.

    Performance considerations

    Performance: Many nested containers — profile resize; avoid deep container-type on every wrapper.

    SEO considerations

    SEO: Content in narrow containers still indexed — ensure not display:none at default container size.

    Scalability considerations

    Scale: Fallback @media for browsers without @container — @supports (container-type: inline-size).

    Common production issues

    Failures: Forgot container-type — queries never fire. size containment clips dropdown menus.

    Debugging guide

    Debug: Chrome DevTools → container badge on elements; inspect container size vs query.

    Best practices

    • container-type on direct layout parent of responsive component.
    • Storybook stories in multiple container widths.
    • @supports fallback for legacy browsers.

    Anti-patterns

    • container-type: size everywhere — overflow bugs.
    • Duplicate viewport @media and @container for same rule without reason.

    Trade-offs

    • Container queries: contextual components.
    • Viewport queries: page-level layout still appropriate.

    Architecture review questions

    • DS components document container requirements?
    • Fallback strategy for @container?

    Interview questions

    When container query vs media query?(Advanced)

    Media query for page shell — nav, sidebar visibility. Container query when component layout depends on parent width — card in grid cell, widget in dashboard, CMS column. Component should not know viewport.

    Follow-up: container-type inline-size vs size?

    Hands-on exercise

    Exercise: Card with @container layout switch; Storybook at 200px and 400px container widths.

    Staff engineer notes

    • Container queries shift responsive testing to component stories — not only viewport presets.

    Common pitfalls

    • size containment breaking position:absolute popovers.

    Try it yourself

    Edit the CSS panel — the preview updates live. Use DevTools Performance and Accessibility panels to validate.

    Try it yourself

    Preview

    Summary

    Container queries enable components to adapt to parent container dimensions — essential for dashboards, CMS columns, and design system components in variable contexts.

    Key takeaways

    • @container responds to parent size, not viewport.
    • container-type on ancestor required.
    Ready to mark this lesson complete?Track your journey across the entire course.