grid-template-areas 须配合 display: grid 使用,字符串格式严格(引号统一、每行词数一致、用点占位、命名仅限字母数字下划线),响应式需重写整条字符串并同步调整 grid-template-columns,区域名须与 grid-area 值完全匹配。

能简化,但只在结构语义稳定、区域划分明确的场景下成立;它不减少代码行数,而是把布局逻辑从分散的 grid-row/grid-column 挪到一处可读的字符串里。
grid-template-areas 必须配合 display: grid 才生效
很多人写了 grid-template-areas 却没效果,根本原因是父容器漏了 display: grid。CSS Grid 的所有区域定义都依赖这个声明,缺了就完全不解析字符串。
- 必须显式写
display: grid,inline-grid也行,但不能靠继承或 flex 带来“顺带支持” - 如果用了
grid-template简写(如grid-template: "header" / 1fr),它内部已隐含display: grid,但单独写grid-template-areas时绝不能省 - 检查是否被其他规则覆盖:比如某个 reset.css 把
display设为block,会直接废掉整套区域定义
字符串格式稍错,整条声明就静默失效
grid-template-areas 对空格、引号、点号极其敏感,浏览器不报错,但也不渲染——元素直接回退到文档流或默认网格位置。
- 所有行必须用同一种引号包裹,
"header main"✅,'header main'✅,但混用"header main" 'footer'❌ - 每行单词数必须一致,缺位统一用
.(英文句点),不能留空格、不能写null、不能省略,"header . aside"✅,"header aside"❌(第二行少一个词) - 区域名只能含字母、数字、下划线,
user_avatar✅,user-avatar❌,UserAvatar❌(大小写必须和grid-area值逐字符一致)
响应式切换必须重写整块字符串,不能局部补丁
想在小屏把 aside 从右侧挪到底部?不能只改一行,也不能在媒体查询里加个新区域——必须重写整个 grid-template-areas 值,且所有子元素的 grid-area 名称保持不变。
立即学习“前端免费学习笔记(深入)”;
- 桌面端:
grid-template-areas: "header header" "main aside" - 移动端:
grid-template-areas: "header" "main" "aside"—— 注意这里变成三行,每行一个词,列数从 2 变成 1,所以grid-template-columns也得同步调成1fr - 常见翻车点:在
@media里只写grid-template-areas: "header" "main" "aside",却忘了父容器原本的grid-template-columns: 200px 1fr还在生效,结果aside被挤成极窄一列
grid-area 值必须和模板中出现的字符串完全匹配
哪怕多一个空格、大小写错一位、下划线写成连字符,对应元素就会“消失”——不是隐藏,是脱离区域分配,回退到默认网格流位置,可能叠在别处或跑出视口。
-
.sidebar { grid-area: sidebar; }✅,.sidebar { grid-area: "sidebar"; }❌(引号多余) -
grid-template-areas: "nav main"时,nav元素写grid-area: Nav;❌(首字母大写不匹配) - 多个同名区域(如
"header header" "main main")会各自独立存在,不会自动合并;若只给一个header元素设grid-area: header,它只会填第一个header区域
真正省事的地方在于:当你需要整体调换板块顺序(比如把侧边栏从左移到右、把 footer 提到 main 上方),只需改字符串,不用动 HTML、不用重算行列线编号、也不用调整每个元素的 grid-row。但前提是——你愿意为每个断点维护一套完整、格式严丝合缝的区域地图。


















