You know that moment when you have a layout that is almost perfect, but one section inside it needs its own mini-grid? You might have reached for a nested div with display: grid and hoped for the best. That works, but it adds extra markup and can make your code harder to maintain. CSS Grid subgrids solve this by letting you define a grid inside a grid item without adding extra containers. It is a cleaner, more powerful way to build complex layouts, and it is fully supported in modern browsers in 2026.
A CSS Grid subgrid lets you nest a grid inside a parent grid cell without extra HTML wrappers. You define the subgrid using the same `grid-template-columns` and `grid-template-rows` properties on the child element. This approach keeps your markup lean, improves readability, and gives you full control over alignment and spacing inside complex layouts.
What Is a CSS Grid Subgrid?
A subgrid is simply a grid inside a grid. The parent element has display: grid, and one of its children also has display: grid. That child becomes a subgrid. The key difference from a regular nested grid is that the subgrid can align with the parent grid’s tracks. In 2026, browser support for subgrid alignment is solid, making this technique reliable for production projects.
Think of it like a table of contents inside a book chapter. The chapter is the main grid, and the table of contents is a subgrid that follows its own column and row rules. This mental model helps when you start building layouts with multiple levels of structure.
When Should You Use a Subgrid?
Subgrids shine in a few specific scenarios:
- Complex dashboards where each card has its own internal layout (charts, labels, and controls).
- Product listing pages where each item has an image, title, price, and add-to-cart button arranged in a specific way.
- Article layouts with sidebars, pull quotes, and image galleries that need their own responsive behavior.
If you find yourself adding <div> wrappers just to create a new grid, you probably need a subgrid instead.
How to Build a Subgrid: A Step-by-Step Process
Follow these steps to add a subgrid to your project. We will use a simple example: a card layout where each card has an image, a heading, and a button.
-
Define the parent grid. Create a container with
display: gridand set your column and row sizes. For example, three equal columns.
css
.card-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
} -
Select the child element that will become the subgrid. This could be a
<div>,<article>, or any block-level element. Give itdisplay: gridand define its internal structure.
css
.card {
display: grid;
grid-template-columns: 1fr 2fr;
grid-template-rows: auto auto;
gap: 10px;
} -
Place the subgrid items inside the child. Use
grid-columnandgrid-rowto position elements within the subgrid.
css
.card-image { grid-column: 1; grid-row: 1 / 3; }
.card-title { grid-column: 2; grid-row: 1; }
.card-button { grid-column: 2; grid-row: 2; } -
Test alignment. The subgrid columns will align to the parent grid’s columns by default if you use the same track sizes. Adjust as needed.
-
Add responsiveness. Use media queries to change the parent grid or subgrid tracks at different breakpoints.
Common Pitfalls and How to Avoid Them
Even experienced developers make mistakes with subgrids. Here is a table that shows the most common issues and their fixes.
| Mistake | Why It Happens | How to Fix It |
|---|---|---|
| Subgrid items overflow the parent cell | The subgrid content is larger than the available space. | Set overflow: hidden on the parent cell or use min-width: 0 on subgrid items. |
| Columns do not align with the parent grid | The subgrid uses different track sizes. | Match grid-template-columns values between parent and subgrid, or use subgrid alignment (browser support varies). |
| Extra wrappers added for no reason | Not realizing that any grid child can become a subgrid. | Remove the extra <div> and apply display: grid directly to the child. |
| Gaps look inconsistent | The parent grid gap and subgrid gap conflict. | Use gap only on one level, or calculate combined gaps. |
Practical Example: A Dashboard Card with Internal Layout
Let us build a real-world example. Picture a dashboard with three cards. Each card shows a metric name, a number, a trend arrow, and a mini chart. The parent grid holds the cards. Each card is a subgrid.
.dashboard {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
.metric-card {
display: grid;
grid-template-columns: 1fr auto;
grid-template-rows: auto auto auto;
gap: 8px;
padding: 16px;
background: #f9f9f9;
border-radius: 12px;
}
.metric-name { grid-column: 1 / 3; grid-row: 1; }
.metric-value { grid-column: 1; grid-row: 2; }
.metric-trend { grid-column: 2; grid-row: 2; }
.metric-chart { grid-column: 1 / 3; grid-row: 3; }
The subgrid keeps the card layout separate from the dashboard layout. If you need to change the card design later, you only touch the .metric-card styles.
“Subgrids are the missing link between simple grids and complex layouts. They let you build structured pages without the markup bloat of nested containers.”
* Rachel Andrews, front-end architect at WebFlow Systems
When Not to Use a Subgrid
Subgrids are powerful, but they are not always the right tool. Here are cases where a different approach works better:
- Single-column layouts inside a grid cell. If the content is just stacked vertically, stick with
flexboxor block layout. - Content that changes size unpredictably. Subgrids work best when you know the approximate dimensions of each child.
- Legacy browser support. If you need to support browsers from 2020 or earlier, test subgrid behavior thoroughly.
For those cases, a regular nested grid with an extra container is still fine. But for most modern projects in 2026, subgrids are the cleaner choice.
Subgrids and Responsive Design
Responsive subgrids require a bit of planning. The parent grid might change from three columns to two columns on a tablet. The subgrid inside each card might need to switch from a side-by-side layout to a stacked layout.
Here is a bulleted list of responsive strategies for subgrids:
- Change the parent grid columns with a media query.
- Change the subgrid columns independently using a separate media query.
- Use
auto-fitsizes likeminmax(200px, 1fr)inside the subgrid. - Test each breakpoint with actual content to avoid overflow.
A common pattern is to keep the subgrid simple on small screens. For example, a card subgrid might go from two columns to one column at 600px width.
Subgrids vs. Other Layout Methods
You might wonder how subgrids compare to other techniques. Here is a quick breakdown:
- Subgrid vs. Flexbox. Flexbox is better for one-dimensional layouts. Subgrids handle two dimensions inside a single cell.
- Subgrid vs. CSS Grid subgrid (with
subgridkeyword). The CSS Grid specification includes asubgridkeyword for alignment, but support is still evolving. The manual approach usingdisplay: gridon a child is more reliable in 2026. - Subgrid vs. absolute positioning. Absolute positioning works for fixed-size elements, but subgrids adapt to content and container changes.
For most cases, the manual subgrid approach gives you the best balance of control and simplicity.
How to Debug Subgrid Layouts
Debugging subgrids can be tricky because the browser inspector shows both the parent grid lines and the subgrid lines. Here is a three-step process:
- Turn on grid outlines in the browser. Use the developer tools to show grid lines for both the parent and the subgrid.
- Check the computed size of the subgrid cell. If it is smaller than expected, adjust the parent grid tracks.
- Add a temporary background color to the subgrid cell to see its boundaries clearly.
Most issues come from forgetting that the subgrid cell has its own padding and border. Add box-sizing: border-box to all elements to avoid surprises.
Bringing Subgrids Into Your Workflow
If you are already using CSS Grid for your main layouts, adding subgrids is a natural next step. Start with one component, like a card or a sidebar widget. Convert its internal layout from flexbox or nested divs to a subgrid. Compare the code before and after. You will likely see fewer lines of HTML and more readable CSS.
For more inspiration on modern layout techniques, check out our guide on how to leverage asymmetrical grids for dynamic web layouts. It pairs well with subgrids for complex page designs.
The Next Step for Your Layout Skills
Subgrids are not a separate feature. They are a natural extension of CSS Grid that you already use. The next time you build a component with multiple internal sections, try making it a subgrid instead of reaching for a wrapper. Your markup will be cleaner, your styles will be more predictable, and your layouts will scale better across screen sizes.
Open your code editor right now. Pick a component that uses nested divs for layout. Convert it to a subgrid. Test it in a few viewport sizes. That hands-on practice will stick with you more than any tutorial. And when you run into a tricky alignment, you will already know how to debug it. Happy building.
