grid-template-areas 必须与 grid-area 配合使用且需父容器同时定义 grid-template-columns 和 grid-template-rows 才生效;仅设 grid-area 而缺上述三者之一,元素退回文档流,computed 值为 auto 或 none。

grid-template-areas 必须和 grid-area 成对出现才生效
只写 grid-area: header,但父容器没定义 grid-template-areas,布局完全不会变——元素会退回文档流,像普通块一样从上到下堆叠。DevTools 里看到 grid-area 的 computed 值是 auto 或 none,基本就是这个原因。
实操建议:
-
grid-template-areas必须写在父容器(即设了display: grid的元素)上,用引号包裹每行字符串,例如:grid-template-areas: "header header" "sidebar main" "footer footer" - 每行引号内单词数必须一致(即列数固定),空格分隔区域名,
.表示空单元格 - 子元素必须显式写
grid-area: header(不加引号、大小写完全一致、不能有空格或符号) - 区域名只能含字母、数字、短横线(
-)或下划线(_),比如user-sidebar合法,top bar或1nav非法
为什么 grid-template-areas 比 grid-column / grid-row 更稳
用 grid-column: 1 / 3 这类线号定位,一旦增删一行定义,后续所有项的行列编号全偏移;而 grid-template-areas 把结构“画”出来,改某一块区域不影响其他命名区域,尤其适合后台仪表盘这类固定功能区布局。
常见翻车点:
立即学习“前端免费学习笔记(深入)”;
- 写
grid-template-areas: "header header" "nav main",但忘了给<nav></nav>元素加grid-area: nav→ 它就卡在第一行左起第二格,不是你想要的导航栏位置 - 响应式时在媒体查询里只改
grid-template-columns,却误删了grid-template-areas→ 整个命名系统失效,所有区域退回到默认流 - 混用
grid-area和grid-column:后者会直接覆盖前者,导致区域挂载失败
响应式下保持区域名不变,只调轨道尺寸
别在不同断点里重写整套 grid-template-areas 字符串——它不支持局部更新,一改就全崩。真正可靠的做法是:区域名一套到底,只通过 grid-template-columns 和 grid-template-rows 调整轨道大小。
例如:
- 小屏:
grid-template-columns: 1fr,所有区域垂直堆叠 - 中屏:
grid-template-columns: 250px 1fr,sidebar固宽,main自适应 - 大屏:
grid-template-rows: 64px auto 48px,显式控制header/main/footer高度,防内容撑开错位
只要每行区域名数量匹配当前列数,"header header" "sidebar main" "footer footer" 就能在所有断点下继续生效。
容易被忽略的显式行列定义
display: grid 本身不构成网格——没写 grid-template-columns 和 grid-template-rows,浏览器只生成单列隐式网格,所有项目挤在第一列里,看着像没生效。
必须同时满足三个条件,命名区域才能动起来:
- 容器设
display: grid - 容器设
grid-template-areas(字符串矩阵) - 容器设
grid-template-columns和grid-template-rows(否则区域名无处落脚)
比如 grid-template-areas: "header header" "sidebar main" 是 2 行 2 列,那 grid-template-columns 至少得定义两个轨道,grid-template-rows 至少两个——少一个,整个 grid-template-areas 声明就被静默丢弃。



















