The problem
You need components that respond to their container size, not just the viewport.
The solution
/* 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;
}
}See it live
Put it to work
<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.