Introduction
CSS Subgrid lets a child grid item adopt its parent's tracks, so nested content aligns to the outer grid. Before subgrid, you'd manually duplicate track sizes or use workarounds.
Classic example: cards where titles, bodies, and footers align across cards even with different content lengths.
Subgrid is the missing piece that makes CSS Grid truly composable.
Key Concepts
Basic Subgrid
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
}
.card {
display: grid;
grid-row: span 3;
grid-template-rows: subgrid;
}
Column Subgrid
.page {
display: grid;
grid-template-columns: [full-start] 1fr [content-start] minmax(0, 60ch) [content-end] 1fr [full-end];
}
.section {
grid-column: full;
display: grid;
grid-template-columns: subgrid;
}
.section > p { grid-column: content; }
Practical Examples
1. Aligned Card Grid
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
.card {
display: grid;
grid-row: span 4;
grid-template-rows: subgrid;
}
.card__header { align-self: start; }
.card__footer { align-self: end; }
2. Form Layout
.form {
display: grid;
grid-template-columns: auto 1fr;
gap: 0.75rem 1rem;
}
.form-row {
display: grid;
grid-column: 1 / -1;
grid-template-columns: subgrid;
}
3. Full-Bleed Layout
.page {
display: grid;
grid-template-columns:
[full-start] minmax(1rem, 1fr)
[content-start] min(65ch, 100% - 2rem)
[content-end] minmax(1rem, 1fr) [full-end];
}
.page > * { grid-column: content; }
.page > .full-bleed {
grid-column: full;
display: grid;
grid-template-columns: subgrid;
}
Best Practices
- Use grid-row: span N to define track occupation.
- Subgrid inherits parent gap — override if needed.
- Combine with named grid lines.
- Start with row subgrid for card alignment.
- Test with varying content lengths.
Common Pitfalls
- Forgetting grid-row: span N — nothing aligns.
- Using subgrid on a non-grid-item.
- Not accounting for parent gap inheritance.
- Subgrid can't be used with auto-fill/auto-fit on the child.
Browser Support
Chrome 117+, Safari 16+, Firefox 71+ (first!), Edge 117+. ~90% support.
Related Guides
- CSS Grid Best Practices — master grid first
- CSS Flexbox Guide — when flex beats subgrid
- CSS Container Queries — combine with subgrid