The adaptive grid uses CSS container queries to arrange content according to the space available to the grid itself, rather than the viewport. It uses one equal-width column by default. Add one column modifier to use two equal-width columns when the query container's content box reaches the modifier's minimum width.
The wrapper, content, and item classes are required. .adaptive-grid establishes the named query
container, its direct .adaptive-grid-content child receives the grid layout, and each direct
grid child uses .adaptive-grid-item. A CSS container cannot query its own size to style itself,
so the separate inner element makes the component self-contained.
Resize the available content area to see this example switch between one and two columns.
<div class="adaptive-grid adaptive-grid-columns-2">
<div class="adaptive-grid-content">
<div class="adaptive-grid-item border border-radius padding-sm">Item 1</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 2</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 3</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 4</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 5</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 6</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 7</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 8</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 9</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 10</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 11</div>
<div class="adaptive-grid-item border border-radius padding-sm">Item 12</div>
</div>
</div>
Choose exactly one two-column modifier. Do not combine column modifiers on the same grid.
| Modifier | Minimum content-box width |
|---|---|
.adaptive-grid-columns-2 |
400px |
.adaptive-grid-columns-2-min-width-600 |
600px |
.adaptive-grid-columns-2-min-width-800 |
800px |
These are the default pixel thresholds. Borders and padding are outside the queried content box and do not count toward the minimum width.
The same modifier can produce different layouts in the same viewport because each grid queries its own wrapper. The 350px example remains one column, while the 500px example becomes two columns when the viewport is wide enough to apply that width.
<div class="adaptive-grid adaptive-grid-columns-2 width-350">
<div class="adaptive-grid-content">
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 1</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 2</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 3</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 4</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 5</div>
<div class="adaptive-grid-item border border-radius padding-sm">Narrow item 6</div>
</div>
</div>
<div class="adaptive-grid adaptive-grid-columns-2 width-500-tablet">
<div class="adaptive-grid-content">
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 1</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 2</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 3</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 4</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 5</div>
<div class="adaptive-grid-item border border-radius padding-sm">Wide item 6</div>
</div>
</div>
Every track uses minmax(0, 1fr), and direct .adaptive-grid-item children have
min-inline-size: 0. This allows long code, tables, and other intrinsically wide content to
shrink within a track instead of forcing the grid wider than its container. Consumers can apply
an appropriate overflow or wrapping treatment to the content itself.
Consumers compiling Atlas Sass can configure the default gap with $adaptive-grid-gap and the
two-column class and threshold pairs with $adaptive-grid-columns-2-variants.
Use the button groups to apply a column modifier and gap atomics, then use the slider to change this preview's inline size. The slider updates a CSS custom property on the demo parent without changing the viewport. The grid switches to two columns when its queried content box reaches the selected threshold.
Use this interactive example on a wide screen. On narrower screens, the slider is limited to the available space, so larger column thresholds may not be reachable.