grid-template-areas需父容器设display: grid,区域名与grid-area值必须大小写、拼写、符号完全一致,每行引号内列数相等,空位用.占位,响应式须整行重写模板。

grid-template-areas 不是用来“快速试错”的,而是用来**按设计意图一次性对齐语义区域**的。只要容器、命名、映射三者对得上,骨架就稳了。
为什么 grid-template-areas 写了却没效果?
最常见原因是漏掉了关键前提:display: grid 必须写在父容器上,不是子元素上。
其他高频失效场景:
-
grid-area值和grid-template-areas里的字符串不完全一致(大小写、空格、下划线都敏感) - 用了中文或带空格的名称,比如
grid-area: "用户列表"—— 这会直接失效,应写成grid-area: user-list -
grid-template-areas每行引号内列数不一致,比如第一行写三个词,第二行只写两个,会触发隐式网格,位置飘移 - 父容器没设
min-height: 100vh或高度约束,导致网格“塌”成一行
怎么用 grid-template-areas 定义三栏经典结构?
先画草图:header 占满顶行,nav 在左,main 居中,sidebar 在右,footer 占满底行。对应代码就是:
.layout {
display: grid;
grid-template-areas: "header header header"
"nav main sidebar"
"footer footer footer";
grid-template-rows: 80px 1fr 60px;
grid-template-columns: 200px 1fr 300px;
min-height: 100vh;
}
然后给子元素贴区域名:
立即学习“前端免费学习笔记(深入)”;
header { grid-area: header; }nav { grid-area: nav; }main { grid-area: main; }-
aside { grid-area: sidebar; }(注意:HTML 标签是aside,但 CSS 里用grid-area: sidebar) footer { grid-area: footer; }
别忘了用 . 表示空白单元格——比如中间某列不想放内容,就写 "nav . main",否则网格结构会错位。
响应式切换时,grid-template-areas 怎么改才不翻车?
移动端把侧边栏挪到主内容下方,不是靠 display: none,而是重写整个区域模板:
@media (max-width: 768px) {
.layout {
grid-template-areas: "header"
"nav"
"main"
"sidebar"
"footer";
grid-template-columns: 1fr;
grid-template-rows: auto auto 1fr auto auto;
}
}
关键点:
- 每个断点下的
grid-template-areas行数 × 列数必须内部一致(比如 5 行 × 1 列),否则网格自动补行/列,行为不可控 - 不要只改
grid-template-columns却不改grid-template-areas,区域会错位甚至被裁掉 - 用 DevTools 的“网格叠加层”功能(右键检查 → “布局”面板勾选 Grid)实时验证区域是否对齐
IE11 兼容不了 grid-template-areas 怎么办?
IE11 完全不支持 grid-template-areas,但支持基础 Grid(grid-column/grid-row)。如果必须兼容:
- 放弃命名区域,改用行列线定位:
header { grid-column: 1 / -1; grid-row: 1; } - 所有区域手动计算起止线,维护成本高,容易出错
- 更现实的做法是加一层降级:用 Flexbox 实现移动端堆叠,Grid 仅用于现代浏览器
真正难的不是写几行 grid-template-areas,而是确保每处命名都像接口契约一样严格——少一个点、多一个空格、大小写不一致,整个骨架就松动了。


















