CSS Subgrid: Use Parent Grid Tracks Inside Nested Grid Layouts
CSS subgrid lets a nested grid reuse the track sizes of its parent grid, so inner content can line up perfectly with outer columns or rows. It is especially useful for cards, forms, articles, and dashboards where consistent alignment matters across nested layout levels.
Quick answer: A subgrid is a grid item that becomes a grid container, but instead of defining its own track sizes it inherits row tracks, column tracks, or both from its parent grid. Use subgrid when nested content must align to the same grid lines as the parent.
Difficulty: Intermediate
You'll understand this better if you know: basic CSS Grid syntax, how grid tracks work, and how nested elements behave in normal layouts.
1. What Is CSS Subgrid?
CSS subgrid is a value for grid-template-columns and grid-template-rows that allows a child grid to borrow the track definitions of its parent grid. Instead of creating a separate set of rows or columns, the nested grid aligns itself to the same grid lines as the outer layout.
- It works only inside a parent grid container.
- It can inherit columns, rows, or both.
- It is designed for alignment, not for replacing every nested grid.
- It keeps nested content visually aligned with the outer grid structure.
Without subgrid, nested grids usually need their own track sizes, which can make alignment drift when content changes. With subgrid, the parent layout stays in control.
2. Why CSS Subgrid Matters
Many layouts need consistent alignment across multiple nesting levels. For example, a product card may contain an image, title, and button, while the card itself sits inside a larger page grid. If each nested component defines its own columns, the edges often stop lining up cleanly.
Subgrid matters because it solves that exact problem with less duplication. It helps you:
- keep labels, fields, and content aligned in forms;
- match card internals to page-wide column rhythms;
- preserve consistent spacing across repeated components;
- reduce the need to repeat track sizes in child layouts.
It is not meant for every nested layout. If the inner component does not need to line up with the outer grid, a regular grid is often simpler.
3. Basic Syntax or Core Idea
To create a subgrid, make the child element a grid container and set its tracks to subgrid. The parent must already be a grid container.
Subgrid on columns
This example shows a child grid that inherits the parent's columns.
.page {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
gap: 1rem;
}
.card {
display: grid;
grid-template-columns: subgrid;
}In this case, .card does not define its own column widths. It uses the parent's column tracks, so its children align with the same vertical grid lines.
Subgrid on rows
You can also inherit row tracks when vertical alignment matters more than horizontal alignment.
.layout {
display: grid;
grid-template-rows: auto 1fr auto;
}
.panel {
display: grid;
grid-template-rows: subgrid;
}Here, the nested grid shares the parent's row structure, which is useful when inner content must align with headers, content areas, and footers.
4. Step-by-Step Examples
Example 1: Aligning a card's content with a page grid
Suppose a page uses three columns and each card needs its text and actions to line up with that same rhythm. The child card can inherit the columns from the page.
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
.card {
display: grid;
grid-template-columns: subgrid;
grid-column: 1 / -1;
}This is useful when a card spans the full page width but still needs its inner elements aligned to the same column boundaries as the parent grid.
Example 2: Form labels and inputs lined up across nested groups
Forms often contain nested groups such as address sections or preference groups. Subgrid helps labels line up across the whole form instead of restarting alignment inside each section.
.form {
display: grid;
grid-template-columns: 12rem 1fr;
gap: 0.75rem 1rem;
}
.address-group {
display: grid;
grid-template-columns: subgrid;
grid-column: 1 / -1;
}The nested group inherits the label/input column split, so field labels stay perfectly aligned across sections.
Example 3: Subgrid for rows in a media layout
Sometimes the goal is not column alignment but equal row rhythm across nested elements. Subgrid can keep captions, metadata, and buttons aligned vertically.
.media-list {
display: grid;
grid-template-rows: auto auto auto;
}
.media-item {
display: grid;
grid-template-rows: subgrid;
}The item follows the same row structure as the list, which helps keep repeating content visually consistent.
Example 4: Mixing subgrid with independent placement
Subgrid does not prevent you from placing children manually. The nested grid still supports normal grid placement rules.
.shell {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.widget {
display: grid;
grid-template-columns: subgrid;
}
.widget h2 {
grid-column: 1 / 3;
}The nested element aligns to the parent grid, but you can still choose how far each child spans.
5. Practical Use Cases
- Design systems where repeated components must share a consistent column rhythm.
- Forms where labels, fields, and help text need to line up across sections.
- Article layouts where side notes, headings, and body text must stay aligned.
- Dashboard cards that share a global grid but contain nested content blocks.
- Data views such as comparison panels or pricing tables with strict alignment requirements.
If a layout is mostly self-contained, subgrid may be unnecessary. It shines when the parent and child must cooperate on alignment.
6. Common Mistakes
Mistake 1: Using subgrid without a parent grid
Subgrid only works when the parent element is actually a grid container. If the parent is not using CSS Grid, the child cannot inherit tracks.
Problem: The child declares subgrid, but there is no grid container above it, so the layout has nothing to inherit from.
.parent {
display: block;
}
.child {
display: grid;
grid-template-columns: subgrid;
}Fix: Make the parent a grid container and define its tracks before using subgrid in the child.
.parent {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
}
.child {
display: grid;
grid-template-columns: subgrid;
}The corrected version works because the child now has a real grid to inherit from.
Mistake 2: Expecting a subgrid to create new track sizes
Some developers try to use subgrid as if it were another way to define custom track widths. It is not. It copies the parent tracks instead of replacing them.
Problem: The child is expected to have its own independent columns, but subgrid intentionally reuses the parent's column structure.
.parent {
display: grid;
grid-template-columns: 200px 1fr;
}
.child {
display: grid;
grid-template-columns: subgrid;
}Fix: Use a normal grid when the child needs its own track sizes, or keep subgrid only when alignment is the goal.
.child {
display: grid;
grid-template-columns: 200px 1fr;
}The fixed version works because it gives the child its own explicit track definition.
Mistake 3: Forgetting that gaps and line placement still matter
Subgrid inherits tracks, but you still need the child to span the right range in the parent. If the grid item does not span the relevant columns or rows, the subgrid has no useful space to work with.
Problem: The nested grid is too narrow because it only spans one parent track, so it cannot align multiple inner items across the full layout.
.parent {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.child {
display: grid;
grid-template-columns: subgrid;
grid-column: 2 / 3;
}Fix: Span the full set of parent tracks that the subgrid needs to align with.
.child {
display: grid;
grid-template-columns: subgrid;
grid-column: 1 / -1;
}The corrected version works because the subgrid now spans the parent area it is meant to align with.
7. Best Practices
Practice 1: Use subgrid only for shared alignment
If the child layout has no reason to match the parent grid lines, a separate grid is simpler. Reserve subgrid for places where alignment is part of the design.
.component {
display: grid;
grid-template-columns: subgrid;
}This keeps the layout predictable and avoids overusing a feature that exists for a specific purpose.
Practice 2: Prefer explicit parent tracks
A subgrid is only as useful as the parent grid it inherits. Define the parent tracks clearly so nested layouts have a stable structure to follow.
.page {
display: grid;
grid-template-columns: minmax(1rem, 1fr) minmax(0, 70rem) minmax(1rem, 1fr);
}A clear parent grid makes the subgrid behavior easier to understand and maintain.
Practice 3: Use subgrid for reusable components that must align
When a component appears multiple times and must line up with the surrounding layout, subgrid helps keep consistency without copying track definitions into every component.
.article-card {
display: grid;
grid-template-columns: subgrid;
}This improves consistency across repeated UI blocks and reduces duplicated layout values.
8. Limitations and Edge Cases
- Support is newer than basic CSS Grid, so older browsers may not understand subgrid.
- Subgrid works only for the axis you declare; column and row inheritance are separate.
- It inherits track sizing, but the child still participates in normal grid placement and spanning rules.
- Gaps are shared with the parent grid behavior, which can affect the final spacing of nested items.
- Auto-placement can feel different because the nested grid is tied to parent lines instead of starting a fresh track system.
If you need broad compatibility, confirm browser support before depending on subgrid for critical layout alignment.
9. Practical Mini Project
Here is a small but complete example of a product comparison card layout. The outer grid defines the main page columns, and each card uses subgrid so the title, description, and price line up consistently.
.catalog {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 1rem;
}
.product {
display: grid;
grid-template-columns: subgrid;
grid-column: span 1;
padding: 1rem;
border: 1px solid #ccc;
}
.product h2,
.product p,
.product strong {
grid-column: 1 / -1;
}This example shows the main idea: the cards themselves can sit in a larger grid, but the card content still follows the same line structure as the parent layout.
10. Key Points
- Subgrid lets a nested grid inherit row tracks, column tracks, or both from its parent.
- It is mainly a layout alignment tool, not a replacement for normal grid containers.
- The parent must already be a grid and must define the tracks being inherited.
- It is especially helpful for forms, cards, articles, and design-system components.
- Use it when nested content needs to line up with outer grid lines.
11. Practice Exercise
- Create a parent grid with three equal columns.
- Build a child section that spans all three columns and uses subgrid.
- Place a heading, description, and button inside the child so they align to the parent columns.
Expected output: The inner content should line up with the same vertical grid lines as the parent, without redefining the columns.
Hint: Make sure the child is also a grid container and that it spans the parent area you want it to inherit.
.parent {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
.child {
display: grid;
grid-template-columns: subgrid;
grid-column: 1 / -1;
}
.child h2,
.child p,
.child button {
grid-column: 1 / -1;
}The solution works because the child inherits the parent's column tracks and uses them for its own internal alignment.
12. Final Summary
CSS subgrid is a powerful Grid Level 2 feature that makes nested layouts align to the same track structure as their parent. Instead of repeatedly defining nearly identical columns or rows in every component, you let the parent own the layout rhythm and let children reuse it.
That makes subgrid especially valuable in forms, cards, and content-heavy interfaces where visual alignment matters. It is not a universal replacement for regular nested grids, but when you need a child element to follow the same grid lines as its parent, it is the cleanest tool for the job.
Next, try applying subgrid to one repeated component in an existing layout and compare how much track-sizing code you can remove while keeping alignment consistent.