CSS Grid is the most powerful layout system on the web. While most developers know the basics, the advanced features — named lines, subgrid, auto-placement, and minmax() — unlock layouts that would otherwise require JavaScript. Firefox has first-class Grid support and the best grid inspector in any browser's DevTools.
Named Grid Lines
Instead of counting column numbers, name your lines:
.layout { display: grid; grid-template-columns: [sidebar-start] 240px [sidebar-end main-start] 1fr [main-end aside-start] 280px [aside-end]; grid-template-rows: [header-start] auto [header-end content-start] 1fr [content-end footer-start] auto [footer-end]; min-height: 100vh; } .sidebar { grid-column: sidebar-start / sidebar-end; grid-row: content-start / footer-end; } .main { grid-column: main-start / main-end; grid-row: content-start / content-end; } Grid Template Areas
Visual layout declaration — arguably the most readable grid syntax:
.page { display: grid; grid-template-areas: "header header header" "sidebar main aside " "footer footer footer"; grid-template-columns: 200px 1fr 250px; grid-template-rows: auto 1fr auto; min-height: 100vh; } .header { grid-area: header; } .sidebar { grid-area: sidebar; } .main { grid-area: main; } .aside { grid-area: aside; } .footer { grid-area: footer; } /* Responsive: stack on mobile */ @media (max-width: 768px) { .page { grid-template-areas: "header" "main" "aside" "sidebar" "footer"; grid-template-columns: 1fr; } } Auto-Placement and dense Packing
.gallery { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 150px; gap: 8px; grid-auto-flow: row dense; /* Fill gaps with smaller items */ } .featured { grid-column: span 2; grid-row: span 2; } /* Grid automatically places items to fill gaps */ grid-auto-flow: dense packs items into gaps, useful for masonry-style layouts.
minmax() and fit-content()
/* Column that's at least 200px but grows up to 1fr */ .sidebar { width: minmax(200px, 1fr); } /* Used in grid tracks */ .grid { grid-template-columns: minmax(200px, 300px) /* sidebar: between 200-300px */ 1fr /* main: rest of space */ minmax(150px, auto); /* aside: at least 150px, auto otherwise */ } /* fit-content(): don't exceed the content's natural width */ .nav { grid-template-columns: fit-content(200px) 1fr; } Repeat with auto-fill and auto-fit
Responsive grids without media queries:
/* auto-fill: creates as many columns as fit */ .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; } /* auto-fit: same but collapses empty tracks */ /* When you have 3 items in a 6-column grid: */ /* auto-fill: [item][item][item][empty][empty][empty] */ /* auto-fit: [item][item][item] (each stretches to fill) */ .cards-fit { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); } This creates a responsive card grid with NO media queries.
Subgrid
CSS Subgrid (Firefox supports this since Firefox 71!) lets nested elements align to the parent grid:
.parent { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: auto auto; gap: 16px; } .card { display: grid; grid-row: span 2; /* Participate in parent's column tracks */ grid-template-rows: subgrid; } .card-title { /* aligned to row 1 of parent */ } .card-body { /* aligned to row 2 of parent */ } Without subgrid, card titles and bodies couldn't align across cards. With subgrid, all cards in the same row have aligned content.
Grid and Flexbox Together
Grid handles 2D layout; Flexbox handles 1D alignment within grid cells:
.grid-layout { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; } .card { /* Each cell is a flex container for vertical alignment */ display: flex; flex-direction: column; } .card-body { flex: 1; /* Pushes footer to bottom */ } .card-footer { margin-top: auto; } Firefox Grid Inspector
Firefox DevTools has the best CSS Grid inspector:
- Open DevTools (F12)
- Go to the Layout panel
- Under Grid section, click the grid icon next to any grid element
- The overlay shows:
- Grid lines with numbers and names
- Track sizes (computed values)
- Gap areas
-
grid-areanames
The Firefox grid overlay is interactive — you can see exact pixel measurements by hovering over cells.
Intrinsic Sizing Keywords
.grid { grid-template-columns: min-content /* shrinks to smallest non-overflow width */ max-content /* expands to fit all content without wrapping */ fit-content(200px) /* max-content but no wider than 200px */ 1fr; /* remaining space */ } min-content and max-content are computed by the browser based on actual content — useful for sidebar/label columns that should be exactly as wide as their contents.
The place-items and place-content Shorthands
.grid { display: grid; /* Align items within their cell */ justify-items: center; /* horizontal */ align-items: center; /* vertical */ place-items: center; /* both */ /* Align the grid tracks within the container */ justify-content: space-between; align-content: start; place-content: start space-between; /* align-content justify-content */ } Practical: Full-Page App Layout
.app { display: grid; grid-template: "topbar topbar " 56px "sidebar content" 1fr / 240px 1fr; height: 100dvh; overflow: hidden; } .topbar { grid-area: topbar; overflow: hidden; } .sidebar { grid-area: sidebar; overflow-y: auto; } .content { grid-area: content; overflow-y: auto; } This creates a sticky topbar, scrollable sidebar, and main content area — the classic SPA layout — in ~10 lines of CSS with no JavaScript.

