先记住这个答案
grid-template 只合并三个显式网格属性:行轨模板、列轨模板和命名区域。subgrid 则是子网格在某一轴上沿用父网格轨道的值,通常写在 grid-template-columns 或 grid-template-rows 中;在符合语法的简写轨道位置也可以出现。它并不意味着整个模板自动继承,另一轴仍可独立定义。
grid-template只覆盖三个显式模板属性subgrid用在行轴或列轴轨道列表- 子网格仅继承自己跨过的父轨道
grid还会重置隐式网格属性
简写的三项内容
做两行两列页面时,grid-template: 80px 1fr / 200px 1fr 的斜线前是行轨,后面是列轨。它会把命名区域设置为 none。如果使用带引号的区域图语法,则每行字符串后可以跟该行尺寸,斜线后再写列尺寸。这种语法适合版式图较小的页面;复杂项目用三个长属性往往更好读。
.parent {
display: grid;
grid-template-columns: 120px 1fr 120px;
}
.card {
grid-column: 1 / -1;
display: grid;
grid-template-columns: subgrid;
grid-template-rows: auto auto;
}
/* card 的三列与父级所跨的三列对齐 */这里 .card 是父网格的一个项目,同时也是子网格容器。它横跨父网格三列,所以其子元素可沿三条父轨道对齐;两行仍由它自己定义。若 .card 只跨后两列,子网格只拿到那两列,不会复制父网格的全部三列。
与 grid 简写的边界
grid-template 不负责隐式行高、隐式列宽和自动放置流向。grid 简写则还覆盖这些属性,未写出时也会把它们重置为初始值。修改页面模板时,若此前设置了 grid-auto-rows,用 grid-template 更容易保留该设定。
还要区分值与属性:subgrid 是轨道列表的值,不是写在 grid-template-areas 中的区域名字。区域图要求矩形名称分布;子网格要求对应的元素本身已经是父网格项目,才能谈继承父级轨道。
最容易误用的是在已有 grid-template-areas 的容器上,后写一条只指定行列的 grid-template。简写会同时给区域模板赋初始值,先前的区域图可能失效;只想改列时写 grid-template-columns 更稳。子网格同理:subgrid 放在某一轴的轨道值里,另一轴是否继承需要单独写,不能从一个关键词推断整个嵌套网格都会同步。
容易答错的地方
- 认为设置
subgrid会继承父网格所有轴 - 行与列要分别决定。只写
grid-template-columns: subgrid,行轨仍由子网格自己计算或定义。 - 认为
grid-template会重置自动行高 - 它只覆盖显式模板三项,自动行高是
grid-auto-rows,不在此简写内。
面试官还会怎么问?
子网格能超出父项目跨过的列吗?
子网格沿用的是父项目覆盖的那段轨道;需要更多列,应先调整父项目的跨度。
grid-template: none 会怎样?
三个显式模板属性都归为 none,之后轨道可由内容和隐式网格规则创建。
什么时候用 grid-template,什么时候用长属性?
模板行列和区域需要一起呈现时简写直观;只改一个轴时长属性更清楚,也避免意外清掉区域图。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。