Skip to main content

CSS Container Query Examples

Copy-paste container query patterns for responsive components.
Drag the edges to see how components adapt.

Browser Support

Chrome 105+Safari 16+Firefox 110+Edge 105+

Container queries are supported in all modern browsers as of 2023. Safe to use in production with progressive enhancement.

Basic Card Layout

A card that switches from vertical to horizontal layout based on container width.

Interactive Demo

Card Title

This card changes layout based on its container width, not the viewport.

Width: 350px - Drag right edge to resize

CSS Code

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

.card {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  padding: 1rem;
}

@container card (min-width: 400px) {
  .card {
    flex-direction: row;
    align-items: center;
  }

  .card-image {
    width: 150px;
    flex-shrink: 0;
  }
}

Responsive Navigation

Navigation that adapts from icons-only to full labels based on available space.

Interactive Demo

Width: 250px - Drag right edge to resize

CSS Code

.nav-container {
  container-type: inline-size;
}

.nav {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.nav-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.75rem 1rem;
  border-radius: 0.5rem;
  transition: background 0.2s;
}

.nav-item span { display: none; }

@container (min-width: 200px) {
  .nav { flex-direction: row; }
  .nav-item span { display: inline; }
}

@container (min-width: 400px) {
  .nav-item { padding: 0.75rem 1.5rem; }
}

Container-Aware Grid

A grid that changes columns based on container width, perfect for sidebar widgets.

Interactive Demo

Item 1
Item 2
Item 3
Item 4
Item 5
Item 6
Width: 350px - Drag right edge to resize

CSS Code

.grid-container {
  container-type: inline-size;
}

.responsive-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
}

@container (min-width: 300px) {
  .responsive-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@container (min-width: 500px) {
  .responsive-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}

Fluid Typography with cqw

Text that scales with container width using container query units (cqw, cqi).

Interactive Demo

Fluid Text

This text scales proportionally with the container width using cqw units.

Width: 400px - Drag right edge to resize

CSS Code

.text-container {
  container-type: inline-size;
}

.responsive-text {
  font-size: clamp(1rem, 5cqw, 2rem);
  line-height: 1.4;
}

/* Container query units */
.hero-text {
  font-size: 8cqw;  /* 8% of container width */
  padding: 5cqi;    /* 5% of container inline size */
}

@container (min-width: 400px) {
  .responsive-text {
    font-size: 1.25rem;
  }
}

@container (min-width: 600px) {
  .responsive-text {
    font-size: 1.5rem;
  }
}

Adaptive Form Layout

Form that switches from stacked to inline labels based on container space.

Interactive Demo

Width: 350px - Drag right edge to resize

CSS Code

.form-container {
  container-type: inline-size;
}

.form-row {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  margin-bottom: 1rem;
}

.form-row label {
  font-weight: 500;
}

@container (min-width: 400px) {
  .form-row {
    flex-direction: row;
    align-items: center;
  }

  .form-row label {
    width: 120px;
    flex-shrink: 0;
  }

  .form-row input {
    flex: 1;
  }
}

Syntax Quick Reference

Container Properties

PropertyValuesDescription
container-typeinline-size | size | normalEstablishes containment context
container-name<custom-name>Names the container for targeting
container<name> / <type>Shorthand for name and type

Container Query Units

UnitMeaning
cqw1% of container width
cqh1% of container height
cqi1% of container inline size
cqb1% of container block size
cqminSmaller of cqi or cqb
cqmaxLarger of cqi or cqb

Query Syntax

/* Basic query */
@container (min-width: 400px) { ... }

/* Named container */
@container sidebar (max-width: 300px) { ... }

/* Multiple conditions */
@container (min-width: 400px) and (max-width: 800px) { ... }

/* Style queries (experimental) */
@container style(--theme: dark) { ... }