CSS Grid布局的grid-template-areas属性可以给网格区域命名,grid-auto-flow属性可以控制未明确指定位置的子元素自动排列,将两者结合能更灵活地实现复杂布局,减少手动指定每个子元素位置的工作量。

核心属性说明
grid-template-areas
该属性用于定义网格的布局结构,通过字符串的形式给网格区域命名,每个字符串代表一行,字符串中的名称对应网格单元格,相同名称的连续单元格会合并为一个命名区域。语法示例如下:
.container {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 80px 80px 80px;
/* 定义3行3列的网格区域,header占第一行全部,sidebar占第二行第一列,main占第二行第二三列,footer占第三行全部 */
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
grid-auto-flow
该属性控制网格中未明确指定grid-area的子元素的自动放置顺序,默认值是row,即按行依次排列,可选值还有column(按列排列)、dense(紧凑排列,尽量填满前面的空白单元格)。
两者结合的实现步骤
结合使用时,先通过grid-template-areas定义固定的命名区域,再给需要放入固定区域的子元素指定对应的grid-area名称,剩余未指定grid-area的子元素会按照grid-auto-flow的规则自动填充到空白的网格单元格中。
基础示例
下面的示例定义了一个3行3列的网格,固定了header、sidebar、main、footer四个区域,剩余两个空白单元格会自动放置未指定区域的子元素:
<div class="container"> <div class="item header">Header</div> <div class="item sidebar">Sidebar</div> <div class="item main">Main</div> <div class="item footer">Footer</div> <div class="item extra1">额外元素1</div> <div class="item extra2">额外元素2</div> </div>
.container {
display: grid;
grid-template-columns: repeat(3, 120px);
grid-template-rows: repeat(3, 100px);
/* 定义命名区域 */
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
/* 自动放置按行排列 */
grid-auto-flow: row;
gap: 10px;
width: 380px;
background-color: #f0f0f0;
padding: 10px;
}
.item {
background-color: #4a90e2;
color: white;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
}
/* 给固定区域的子元素指定对应的区域名称 */
.header {
grid-area: header;
background-color: #e74c3c;
}
.sidebar {
grid-area: sidebar;
background-color: #2ecc71;
}
.main {
grid-area: main;
background-color: #3498db;
}
.footer {
grid-area: footer;
background-color: #9b59b6;
}
运行上述代码后,extra1和extra2两个元素会自动填充到sidebar和main区域之外的空白单元格中,也就是第二行第一列已经被sidebar占用,第二行第二三列被main占用,所以两个额外元素会填充到第三行已经被footer占用的区域之外的位置?不对,这里footer占了第三行全部三个单元格,所以空白单元格是哪里?哦刚才的grid-template-areas里第三行是footer footer footer,所以3行3列的所有单元格都被命名区域占用了?不对,修改一下grid-template-areas,让有空白单元格:
/* 修改后的grid-template-areas,第三行只给footer占前两列,第三列留空 */ grid-template-areas: "header header header" "sidebar main main" "footer footer .";
这样第三行第三列就是空白单元格,extra1和extra2会按照row的顺序自动填充到空白单元格中,先填第三行第三列,再如果还有更多元素会继续往后生成新的网格单元格放置。
自动放置方向调整
如果将grid-auto-flow设置为column,未指定区域的子元素会按列的顺序自动填充空白单元格:
.container {
/* 其他属性同上,只修改grid-auto-flow */
grid-auto-flow: column;
}
此时空白单元格会按列的顺序被填充,优先填充第一列的空白,再第二列,以此类推。
注意事项
- grid-template-areas中使用的区域名称,在子元素的grid-area属性中必须完全匹配,否则无法放入对应区域。
- 如果命名区域占用的单元格数量超过子元素实际需要的大小,子元素会默认填满整个命名区域,可通过justify-self、align-self调整对齐方式。
- 使用dense值时,自动放置会尽量填满前面的空白单元格,可能会导致元素的视觉顺序和DOM顺序不一致,需要根据实际需求选择是否使用。
CSS_Gridgrid_areagrid_auto_flow网格布局自动放置修改时间:2026-07-08 18:36:29