CSS layout in 2026 is a different world than the float-and-clearfix era. Grid, Flexbox, container queries, subgrid, and the upcoming masonry spec give you precise control without the brittleness of older techniques. Senior frontend interviews probe whether you understand the modern layout primitives and when to reach for each.
Flexbox: 1D layout
Flexbox arranges items along a single axis (row or column). Use it when:
- You have a list of items in one direction
- Items can wrap if needed
- You want fine control over alignment along the cross-axis
Common patterns:
- Header layout: logo left, nav center, account right
- Pill list with wrapping
- Card with header + body + footer (column flex)
- Centering:
display: flex; align-items: center; justify-content: center
Grid: 2D layout
Grid arranges items in rows and columns simultaneously. Use it when:
- You have a true grid layout (cards in a 4-column responsive grid)
- You need precise control over both axes
- Items need to span multiple rows or columns
- You want to define named grid areas
Common patterns:
- App layout: sidebar + header + main + footer
- Card grid:
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)) - Form layout with aligned labels and inputs
The “auto-fit” vs “auto-fill” question
Both let columns repeat to fill the container. The difference:
- auto-fit: empty columns collapse; items expand to fill
- auto-fill: empty columns persist; items keep their width
For card grids, auto-fit is usually what you want.
Container queries
Container queries let an element style itself based on its container’s size, not the viewport. Production-ready in all evergreen browsers as of 2024.
.card-container {
container-type: inline-size;
}
@container (min-width: 600px) {
.card { display: flex; }
}
Use case: a card that displays in column layout in a sidebar but row layout in the main content area, regardless of viewport size.
Subgrid
Subgrid lets a nested grid inherit its parent’s grid lines. Production in Firefox since 2019, Safari since 2023, Chromium since 2023.
Use case: a card has internal sections that need to align across cards in the same row. Subgrid lets you express this without flat hacks.
Aspect ratio
The aspect-ratio property reserves space for an element with a known shape. Useful for images and videos that load asynchronously — prevents layout shift.
.video-thumbnail {
aspect-ratio: 16 / 9;
}
Modern centering
Centering used to be a meme. Now:
.center {
display: grid;
place-items: center;
}
Three lines. Works for any single child.
Logical properties
Use margin-block, padding-inline, border-block-start instead of margin-top, etc. Logical properties respect writing direction (RTL, vertical scripts) automatically.
Cascade layers
@layer lets you organize CSS into explicit precedence layers. Helpful for managing third-party CSS vs your own:
@layer reset, base, components, utilities;
All else equal, later layers win. Specificity wars become much rarer.
Common mistakes
- Using flexbox for true 2D layouts (use grid)
- Using grid for simple 1D layouts (overkill, use flex)
- Hardcoding viewport-based breakpoints when container queries fit better
- Not using
gap— still seeing margins on every other child - Forgetting
min-width: 0on flex/grid items containing long content
Frequently Asked Questions
When should I drop CSS-in-JS for plain CSS?
For most sites, plain CSS or Tailwind is faster and simpler. CSS-in-JS shines for design-system encapsulation; for component apps without a design system, often net-negative.
Is the CSS masonry spec ready?
Not yet in 2026 — Safari has it, Chromium is debating syntax. Use JS-based masonry for production until consensus.
How do I handle RTL layouts?
Use logical properties throughout. Set dir=”rtl” on the html element. Test in browser RTL mode.