
CSS Grid布局是一种强大的二维布局系统,允许开发者在网页上创建复杂的布局结构。它提供了精确控制行和列的能力,使得设计响应式和复杂的界面变得更加简单。
一、Grid布局的基本概念
1.1 核心术语
网格容器 (Grid Container):应用了 display: grid 的元素。

网格项 (Grid Items):网格容器的直接子元素。

网格线 (Grid Lines):分隔行和列的线,有数字编号。

网格轨道 (Grid Tracks):网格线之间的空间,包括行和列。

网格单元格 (Grid Cell):行和列交叉形成的最小单位。

网格区域 (Grid Area):由多个网格单元格组成的矩形区域。

2.2. 与Flexbox的区别
特性 | Grid布局 | Flexbox布局 |
|---|---|---|
维度 | 二维 (行和列) | 一维 (行或列) |
主要用途 | 页面整体布局、复杂组件 | 一维列表、导航、卡片 |
内容流向 | 可以同时控制行和列 | 只能控制单一方向 |
二、网格容器属性
属性名 | 描述 |
|---|---|
display | 定义元素为网格容器 |
grid-template-columns | 定义网格的列轨道大小 | 长度值 |
grid-template-rows | 定义网格的行轨道大小 |
grid-template-areas | 定义命名网格区域 | 区域名称 |
grid-template | 简写属性,包含上述三个属性 |
grid-column-gap | 定义列之间的间距 |
grid-row-gap | 定义行之间的间距 |
gap | 简写属性,设置行和列的间距 |
grid-auto-columns | 定义隐式列轨道的大小 |
grid-auto-rows | 定义隐式行轨道的大小 |
grid-auto-flow | 定义自动放置项目的流动方向 |
justify-content | 当网格小于容器时,沿主轴对齐网格 |
align-content | 当网格小于容器时,沿交叉轴对齐网格 |
place-content | 简写属性,同时设置 justify-content 和 align-content |
justify-items | 设置网格项在其单元格内沿主轴的对齐方式 |
align-items | 设置网格项在其单元格内沿交叉轴的对齐方式 |
place-items | 简写属性,同时设置 justify-items 和 align-items |
属性名 | 可能值 |
|---|---|
display | grid |
grid-template-columns | 长度值 | 百分比 | fr | repeat() | minmax() | auto |
grid-template-rows | 同上 |
grid-template-areas | 区域名称 | |
grid-template | grid-template-rows / grid-template-columns |
grid-column-gap | 长度值 |
grid-row-gap | 长度值 |
gap | grid-row-gap grid-column-gap |
grid-auto-columns | 长度值 | 百分比 | fr | auto |
grid-auto-rows | 长度值 | 百分比 | fr | auto |
grid-auto-flow | row | column | dense |
justify-content |
|
align-content | |
place-content | justify-content align-content |
justify-items | start | end | center | stretch |
align-items | start | end | center | stretch | baseline |
place-items | justify-items align-items |
属性名 | 示例 |
|---|---|
display |
|
grid-template-columns |
|
grid-template-rows |
|
grid-template-areas |
|
grid-template |
|
grid-column-gap |
|
grid-row-gap |
|
gap |
|
grid-auto-columns |
|
grid-auto-rows |
|
grid-auto-flow |
|
justify-content |
|
align-content |
|
place-content |
|
justify-items |
|
align-items |
|
place-items |
|
三、网格项属性
属性名 | 描述 |
|---|---|
grid-column-start | 定义网格项的起始列网格线 |
grid-column-end | 定义网格项的结束列网格线 |
grid-row-start | 定义网格项的起始行网格线 |
grid-row-end | 定义网格项的结束行网格线 |
grid-column | 简写属性,设置 grid-column-start 和 grid-column-end |
grid-row | 简写属性,设置 grid-row-start 和 grid-row-end |
grid-area | 定义网格项所在的网格区域 |
justify-self | 覆盖容器的 justify-items,设置单个网格项沿主轴的对齐方式 |
align-self | 覆盖容器的 align-items,设置单个网格项沿交叉轴的对齐方式 |
place-self | 简写属性,同时设置 justify-self 和 align-self |
order | 控制网格项的排列顺序 |
属性名 | 可能值 |
|---|---|
grid-column-start | 网格线编号 | 区域名称 | span 数值 |
grid-column-end | 网格线编号 | 区域名称 | span 数值 |
grid-row-start | 网格线编号 | 区域名称 | span 数值 |
grid-row-end | 网格线编号 | 区域名称 | span 数值 |
grid-column | grid-column-start / grid-column-end |
grid-row | grid-row-start / grid-row-end |
grid-area | 区域名称 | grid-row-start / grid-column-start / grid-row-end / grid-column-end |
justify-self | start | end | center | stretch |
align-self | start | end | center | stretch | baseline |
place-self | justify-self align-self |
order | 整数(默认值为 0) |
属性名 | 示例 |
|---|---|
grid-column-start | grid-column-start: 2; |
grid-column-end | grid-column-end: span 2; |
grid-row-start | grid-row-start: header; |
grid-row-end | grid-row-end: span 3; |
grid-column | grid-column: 1 / span 2; |
grid-row | grid-row: 2 / 4; |
grid-area | grid-area: 1 / 2 / 3 / 4; |
justify-self | justify-self: end; |
align-self | align-self: center; |
place-self | place-self: center end; |
order | order: -1; |
四、属性值说明
关键字 | 描述 |
|---|---|
fr | 份数单位,表示剩余空间的一部分 |
repeat() | 重复模式,避免重复书写相同的值 |
minmax() | 定义一个范围,表示最小值和最大值 |
auto | 根据内容自动调整大小 |
span | 表示跨越的网格线数量 |
dense | 尝试填充网格中的空白区域 |
五、网格容器属性示例
5.1 定义网格
.container {
display: grid;
/* 定义3列,每列宽度100px */
grid-template-columns: 100px 100px 100px;
/* 定义2行,每行高度50px */
grid-template-rows: 50px 50px;
/* 列间距10px,行间距20px */
gap: 20px 10px;
}5.2 灵活的列宽/行高
.container {
display: grid;
/* 3列等宽 */
grid-template-columns: 1fr 1fr 1fr;
/* 或简写 */
grid-template-columns: repeat(3, 1fr);
/* 最小100px,最大自动扩展 */
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
/* 自动填充,不强制换行 */
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
}5.3 网格区域命名
.container {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: 80px 1fr 50px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }5.4 内容对齐
.container {
display: grid;
height: 500px;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(2, 100px);
/* 对齐整个网格 */
justify-content: center; /* 水平方向 */
align-content: center; /* 垂直方向 */
place-content: center; /* 简写 */
/* 对齐网格项 */
justify-items: center; /* 水平方向 */
align-items: center; /* 垂直方向 */
place-items: center; /* 简写 */
}六、网格项属性示例
6.1 定位网格项
.item {
/* 起始和结束网格线 */
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 2;
/* 简写 */
grid-column: 1 / 3;
grid-row: 1 / 2;
/* 起始线 + 跨度 */
grid-column: 1 / span 2;
grid-row: 1 / span 1;
}6.2 对齐单个网格项
.item {
justify-self: center; /* 水平方向 */
align-self: center; /* 垂直方向 */
place-self: center; /* 简写 */
}七、高级特性
7.1 隐式网格
.container {
display: grid;
grid-template-columns: repeat(3, 100px);
/* 显式定义2行 */
grid-template-rows: 100px 100px;
/* 隐式行高 */
grid-auto-rows: 80px;
/* 自动流方向 */
grid-auto-flow: row; /* 默认值 */
}7.2 网格线命名
.container {
display: grid;
grid-template-columns: [col1-start] 1fr [col1-end col2-start] 1fr [col2-end];
grid-template-rows: [row1-start] 100px [row1-end row2-start] 100px [row2-end];
}
.item {
grid-column: col1-start / col2-end;
}7.3 响应式布局示例
.container {
display: grid;
grid-template-columns: 1fr;
gap: 20px;
}
@media (min-width: 768px) {
.container {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.container {
grid-template-columns: repeat(3, 1fr);
}
}八、浏览器支持
Grid布局在现代浏览器中得到广泛支持,包括:
Chrome 57+
Firefox 52+
Safari 10.1+
Edge 16+
可以点击 《Can I Use》查看更多兼容性数据。
对于旧版浏览器,可以使用Flexbox或其他布局方式作为回退方案。
九、最佳实践
从简单开始:先掌握基本的网格定义,再逐步学习高级特性。
使用浏览器开发工具:现代浏览器提供了Grid布局的可视化工具,便于调试。
结合Flexbox:Grid负责整体布局,Flexbox负责内部元素排列。
语义化HTML:保持HTML结构清晰,使用适当的标签。
响应式设计:使用媒体查询和相对单位(fr, %)创建自适应布局。
总结
Grid布局是CSS中最强大的布局系统之一,掌握它可以让你轻松创建各种复杂的网页布局,从简单的卡片网格到复杂的仪表板界面。通过不断练习和实践,你将能够充分利用Grid布局的优势,提升网页设计的效率和质量。