CSShardCSS

CSS Container Queries

Style elements based on their container size instead of viewport.

01

The problem

You need components that respond to their container size, not just the viewport.

02

The solution

CSS
/* Define a container */
.card-container {
  container-type: inline-size;
  container-name: card;
}

/* Short syntax */
.card-container {
  container: card / inline-size;
}

/* Container query */
@container card (min-width: 400px) {
  .card {
    display: flex;
    flex-direction: row;
  }
  
  .card-image {
    width: 40%;
  }
  
  .card-content {
    width: 60%;
    padding: 24px;
  }
}

@container card (max-width: 399px) {
  .card {
    display: block;
  }
  
  .card-image {
    width: 100%;
    height: 200px;
  }
}

/* Container query units */
.card-title {
  font-size: clamp(1rem, 5cqi, 2rem); /* container query inline */
}

/* Style queries (experimental) */
@container style(--theme: dark) {
  .card {
    background: #1a1a2e;
  }
}

03

See it live

Isolated previewSandboxed
04

Put it to work

Example
<div class="card-container">
  <article class="card">
    <img class="card-image" src="image.jpg" alt="">
    <div class="card-content">
      <h3 class="card-title">Card Title</h3>
      <p>Card description text here.</p>
    </div>
  </article>
</div>

Worth knowing

Container queries enable truly reusable components. Supported in all modern browsers since 2023.