CSS Grid is a two-dimensional layout system that lets you build complex, grid-based designs without fighting the box model. It adapts beautifully to different screen sizes, which makes it a flexible way to organize content and build responsive sites.
Why reach for it?
- Simple but powerful layouts — intricate grids with minimal markup.
- More control — fine-grained placement and sizing vs. older techniques.
- Responsive without the hassle — no extra JavaScript or libraries.
- Cleaner code — stylesheets stay organized and maintainable.
- Better for everyone — source order stays logical, which helps assistive tech.
Grid containers and grid items
The model is a grid container (any element with display: grid) and its grid items (the direct children). You place items with grid lines using grid-column and grid-row.
CSS.grid-container {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 12px;
}
.item1 { grid-column: 1 / 2; grid-row: 1 / 2; }
.item2 { grid-column: 2 / 3; grid-row: 1 / 2; }
.item3 { grid-column: 1 / 2; grid-row: 2 / 3; }
.item4 { grid-column: 2 / 3; grid-row: 2 / 3; }
Structure with grid-template-areas
The most readable feature: name regions, then draw the layout as a blueprint. Perfect for a dashboard.
CSS.dashboard {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 50px 1fr 50px;
grid-template-areas:
"aside header"
"aside main"
"aside footer";
min-height: 100vh;
gap: 24px;
}
.header { grid-area: header; }
.aside { grid-area: aside; }
.main { grid-area: main; }
.footer { grid-area: footer; }
Spanning cells with grid-row and grid-column
Give start / end line numbers to make an item span multiple tracks — the basis of any varied card grid.
CSS.grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 100px);
gap: 15px;
}
.item-a { grid-column: 1 / 3; grid-row: 1 / 2; }
.item-c { grid-column: 1 / 2; grid-row: 2 / 4; }
.item-e { grid-column: 4 / 5; grid-row: 2 / 4; }
Make it responsive
Redefine tracks and areas inside a media query to collapse the dashboard into a single column on phones.
CSS@media (max-width: 767px) {
.dashboard {
grid-template-columns: 1fr;
grid-template-rows: auto;
grid-template-areas:
"header"
"aside"
"main"
"footer";
gap: 15px;
}
}
Polishing the design
Layout is the skeleton — a few CSS touches give a dashboard life:
- Backgrounds to separate regions visually.
- Borders & radius to frame cards.
- Type scale for a clear hierarchy.
- Shadows for depth.
- Transitions for hover and state changes.
- Spacing so content can breathe.
CSS.card {
border: 1px solid #ccc;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0,0,0,.1);
transition: all .3s ease-in-out;
}
.card:hover {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(0,0,0,.15);
}
Wrapping up
Grid's container/item model makes arrangement intuitive, grid-template-areas keeps complex layouts readable, and media queries let one blueprint adapt to any device. For deeper dives: CSS-Tricks' Complete Guide, MDN, and the CSS Grid Garden game. Happy reading!