在 CSS 布局体系中,Grid(网格布局)的出现填补了二维布局的空白。相较于专注一维排列的 Flexbox,Grid 以 “行列交织” 的思维,直接将容器划分为结构化的网格区域,可同时控制元素的行与列位置,实现复杂且灵活的版面布局。从简单的卡片网格到复杂的仪表盘界面,Grid 都能以极简代码完成,成为现代前端布局的 “终极工具”。本文将系统拆解 Grid 的核心概念与实战技巧,助你掌握二维布局的精髓。
一、Grid 的本质:为什么需要网格布局?
Grid 是 CSS3 引入的二维布局模型,核心优势在于能同时处理 “行” 和 “列” 两个维度的布局逻辑,解决了传统布局与 Flexbox 在复杂二维场景下的局限性:
- 传统布局(浮动、定位):需嵌套多层结构,代码冗余,难以适配动态布局;
- Flexbox:一维布局模型,实现二维布局需嵌套多个弹性容器,逻辑复杂;
- Grid:原生支持二维布局,直接定义容器的行与列,元素可自由放置在任意网格区域,结构清晰且维护性强。
适用场景:电商商品网格、仪表盘布局、杂志版式、响应式多列布局、复杂表单排版等。
二、Grid 的核心概念:构建网格的基础
Grid 布局的核心是 “网格容器” 与 “网格项目”,所有布局操作围绕这两个角色及衍生的网格结构展开。
1. 核心角色
- 网格容器(Grid Container):通过
display: grid或display: inline-grid定义的父元素,其直接子元素自动成为网格项目。/* 块级网格容器:独占一行 */ .container { display: grid; } /* 行内网格容器:与其他行内元素共处一行 */ .inline-container { display: inline-grid; } - 网格项目(Grid Item):网格容器的直接子元素,可被放置在网格的任意单元格中。
- 网格线(Grid Line):划分网格的虚拟线条,包括水平网格线(分隔行)和垂直网格线(分隔列),按从左到右、从上到下的顺序编号(默认从 1 开始)。
- 网格轨道(Grid Track):两条相邻网格线之间的区域,即 “行” 或 “列”,可通过属性定义其尺寸。
- 网格单元格(Grid Cell):行与列交叉形成的最小矩形区域,类似表格的 “单元格”。
- 网格区域(Grid Area):由多个相邻网格单元格组成的矩形区域,可用于放置单个网格项目。
三、容器属性:定义网格的整体结构
网格容器的属性用于划分网格的行 / 列结构、设置间距、控制项目对齐方式,是构建网格布局的核心。
1. 划分行与列:grid-template-rows /grid-template-columns
这两个属性是 Grid 布局的基础,用于定义网格的 “行轨道高度” 和 “列轨道宽度”,支持多种单位(固定值、百分比、弹性单位等)。
基本语法
.container {
display: grid;
grid-template-rows: <轨道尺寸1> <轨道尺寸2> ...; /* 定义行高 */
grid-template-columns: <轨道尺寸1> <轨道尺寸2> ...; /* 定义列宽 */
}
常用尺寸单位
- 固定单位:
px(像素)、em等,用于固定行 / 列尺寸; - 相对单位:
%(相对于容器尺寸)、fr(Grid 专属弹性单位,分配剩余空间); - 关键字:
auto(自动适应内容尺寸)、minmax(最小值, 最大值)(动态适配尺寸范围)。
实用示例
/* 3行2列网格:行高分别为100px、auto、200px;列宽各占50% */
.container {
display: grid;
grid-template-rows: 100px auto 200px;
grid-template-columns: 50% 50%;
}
/* 3列等宽网格:使用fr弹性单位,自动分配剩余空间 */
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 等价于 repeat(3, 1fr) */
}
/* 响应式列宽:最小150px,最大自动适应 */
.container {
display: grid;
grid-template-columns: repeat(3, minmax(150px, auto));
}
重复函数:repeat ()
当多个轨道尺寸相同时,可使用repeat(重复次数, 轨道尺寸)简化代码:
/* 4列,每列宽100px → 等价于 100px 100px 100px 100px */
grid-template-columns: repeat(4, 100px);
/* 重复2组“1fr 2fr” → 等价于 1fr 2fr 1fr 2fr */
grid-template-columns: repeat(2, 1fr 2fr);
2. 设置网格间距:gap
gap(原grid-gap)用于设置网格单元格之间的间距,包括行间距和列间距,不影响网格与容器边缘的距离。
语法与示例
.container {
/* 行间距 20px,列间距 10px */
gap: 20px 10px;
/* 简写:行间距=列间距=15px */
gap: 15px;
}
3. 网格对齐:justify-content /align-content/place-content
当网格整体尺寸小于容器尺寸时,这些属性控制网格区域在容器中的对齐方式(区别于项目在单元格内的对齐)。
| 属性 | 作用维度 | 常用属性值 |
|---|---|---|
justify-content | 水平方向(行轴) | flex-start(默认)、center、flex-end、space-between、space-around |
align-content | 垂直方向(列轴) | 同上 |
place-content | 简写(水平 + 垂直) | place-content: <align-content> <justify-content>,如place-content: center |
示例:网格水平垂直居中
.container {
display: grid;
width: 500px;
height: 400px;
grid-template-columns: 100px 100px;
gap: 20px;
place-content: center; /* 网格在容器中居中 */
}
4. 项目对齐:justify-items /align-items/place-items
当网格项目尺寸小于其所在的网格单元格时,这些属性控制项目在单元格内的对齐方式。
| 属性 | 作用维度 | 常用属性值 |
|---|---|---|
justify-items | 水平方向(行轴) | stretch(默认,拉伸填满)、center、start、end |
align-items | 垂直方向(列轴) | 同上 |
place-items | 简写(水平 + 垂直) | place-items: <align-items> <justify-items>,如place-items: center |
示例:项目在单元格内居中
.container {
display: grid;
grid-template-columns: 150px 150px;
grid-template-rows: 150px 150px;
gap: 20px;
place-items: center; /* 所有项目在单元格内居中 */
}
四、项目属性:控制单个项目的位置与尺寸
网格项目的属性用于调整单个项目的行 / 列位置、占据范围及对齐方式,实现项目的差异化布局。
1. 指定项目位置:grid-row /grid-column
通过指定项目占据的 “网格线范围”,控制项目在网格中的位置和大小,核心语法为:
.item {
/* grid-row: 起始行线 / 结束行线 */
grid-row: 1 / 3; /* 从第1行线到第3行线,占据2行 */
/* grid-column: 起始列线 / 结束列线 */
grid-column: 2 / 4; /* 从第2列线到第4列线,占据2列 */
}
简化写法:span 关键字
使用span 数量表示 “占据多少个轨道”,无需计算结束网格线:
.item {
grid-row: 1 / span 2; /* 从第1行线开始,占据2行 */
grid-column: span 3; /* 从当前列线开始,占据3列 */
}
2. 命名网格区域:grid-area
可先通过容器的grid-template-areas为网格区域命名,再用项目的grid-area指定其所在区域,代码可读性更强。
示例:经典页面布局
/* 容器:命名网格区域 */
.container {
display: grid;
grid-template-rows: 80px 1fr 60px; /* 头部80px,主体自适应,底部60px */
grid-template-columns: 200px 1fr; /* 侧边栏200px,主体自适应 */
grid-template-areas:
"header header" /* 头部占据两列 */
"aside main" /* 侧边栏占1列,主体占1列 */
"footer footer"; /* 底部占据两列 */
height: 100vh; /* 占满视口高度 */
gap: 10px;
}
/* 项目:指定所在区域 */
.header { grid-area: header; background: #f00; }
.aside { grid-area: aside; background: #0f0; }
.main { grid-area: main; background: #00f; }
.footer { grid-area: footer; background: #ff0; }
3. 单个项目对齐:justify-self /align-self/place-self
覆盖容器的justify-items和align-items属性,为单个项目设置独特的单元格内对齐方式:
.special-item {
justify-self: center; /* 水平居中 */
align-self: end; /* 垂直靠下 */
/* 简写:place-self: end center; */
}
五、实战案例:Grid 经典布局实现
1. 响应式商品网格
实现 “大屏 3 列、中屏 2 列、小屏 1 列” 的自适应商品网格:
.goods-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); /* 动态列数,最小250px */
gap: 20px;
padding: 20px;
}
.goods-card {
height: 300px;
background: #eee;
border-radius: 8px;
padding: 15px;
}
auto-fit:自动根据容器宽度调整列数,填充剩余空间;minmax(250px, 1fr):列宽最小 250px,超出部分按 1fr 分配。
2. 复杂仪表盘布局
实现包含 “标题、数据卡片、图表” 的仪表盘界面:
.dashboard {
display: grid;
grid-template-rows: 60px 1fr 1fr;
grid-template-columns: repeat(3, 1fr);
gap: 15px;
padding: 20px;
height: 100vh;
}
.dashboard-title {
grid-column: 1 / -1; /* 从第1列线到最后1列线,占据整行 */
font-size: 24px;
line-height: 60px;
}
.data-card {
background: #fff;
border-radius: 8px;
padding: 15px;
}
.chart-large {
grid-row: 2 / 4; /* 占据第2-3行 */
grid-column: 3 / 4; /* 占据第3列 */
background: #fff;
border-radius: 8px;
}
六、Grid 与 Flexbox 的对比与配合
Grid 与 Flexbox 并非替代关系,而是互补关系,合理搭配能实现更高效的布局:
| 维度 | Grid | Flexbox |
|---|---|---|
| 布局维度 | 二维(行 + 列) | 一维(行或列) |
| 核心思维 | 先定义网格结构,再放元素 | 先放元素,再控制排列方式 |
| 适用场景 | 整体页面布局、网格卡片、复杂排版 | 导航栏、表单对齐、单行列布局 |
| 灵活性 | 结构固定,适合复杂静态布局 | 动态性强,适合内容自适应布局 |
配合示例:用 Grid 实现页面整体布局,内部用 Flexbox 处理局部元素对齐:
/* 页面整体Grid布局 */
.page {
display: grid;
grid-template-areas: "header header" "aside main";
grid-template-rows: 80px 1fr;
grid-template-columns: 200px 1fr;
}
/* 头部导航用Flexbox对齐 */
.header {
grid-area: header;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
}
七、总结:Grid 布局的核心心法
- 先构网格:用
grid-template-rows/grid-template-columns定义容器的行 / 列结构,优先确定整体框架; - 再放元素:通过
grid-row/grid-column或grid-area将项目放置到指定网格区域; - 控间距与对齐:
gap设间距,place-content控网格整体对齐,place-items控项目单元格内对齐; - 灵活搭配:Grid 负责二维整体布局,Flexbox 处理一维局部对齐,发挥各自优势。
Grid 布局以其强大的二维控制能力,彻底改变了复杂布局的实现方式,让 “所见即所得” 的版面设计成为可能。掌握 Grid 不仅能大幅提升布局效率,更能构建出结构清晰、维护性强的响应式界面,是现代前端开发者必须精通的核心技能。

被折叠的 条评论
为什么被折叠?



