第十一章 · 11.3 节
Subgrid
6.4 节讲过,Grid 容器的子元素默认只是"占据"若干个网格单元,子元素内部再想用 Grid 布局,就是一套全新的、跟父网格无关的轨道系统。subgrid 让子网格可以直接"继承"父网格的行/列轨道,从而实现跨嵌套层级的对齐。
没有 subgrid 时的痛点
最常见的场景:一排卡片,每张卡片内部都有标题、正文、底部按钮,希望所有卡片的标题顶部对齐、按钮底部对齐——但每张卡片内容长度不同。如果每张卡片各自建立一套 Grid,它们的行高只能各自撑开,无法跨卡片对齐。
subgrid 语法
把子元素的 grid-template-columns(或 rows)设为 subgrid,它就不再定义自己的轨道尺寸,而是直接复用父网格对应范围内的轨道:
.gallery { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: auto auto auto; } .card { grid-row: span 3; /* 占据 3 行 */ display: grid; grid-template-rows: subgrid; /* 复用父网格的 3 行轨道,而不是自己重新计算 */ }
关键区别
subgrid 不产生新的轨道尺寸定义,行/列的大小完全由最外层的父网格决定;子元素只是声明"我要对齐到父网格的这几条线"。卡片列表对齐示例
DEMO · 三张卡片,标题/正文/按钮通过 subgrid 跨卡片对齐(不支持 subgrid 的浏览器会退化为普通网格)
标题
一行正文
标题较长换行
这里正文内容明显更长一些,占据更多行,用来测试跨卡片对齐效果如何
标题
中等长度的正文内容
使用要点
| 要点 | 说明 |
|---|---|
| 继承范围 | 子元素必须先用 grid-column/grid-row 占据父网格中的若干条轨道,subgrid 才能对齐到这个范围内 |
| gap 是否继承 | subgrid 默认继承父网格的 gap,也可以在子元素上覆盖自己的 gap |
| 浏览器支持 | 主流浏览器已支持,但项目若需兼容旧版本,应准备"退化为普通网格"的降级方案,并用 @supports (grid-template-columns: subgrid) 做特性检测 |