在 CSS 中,Grid 布局是一种强大的二维布局系统,允许开发者通过行(rows)和列(columns)的组合创建复杂的网页布局。以下是 Grid 布局的核心概念、属性和实用示例:
一、Grid 布局的核心概念
| 概念 | 描述 |
|---|
| Grid 容器 | 通过 display: grid 或 display: inline-grid 定义的父元素。 |
| Grid 项目 | Grid 容器的直接子元素。 |
| 网格线 | 划分行和列的线(隐式或显式命名),用于定位项目。 |
| 网格轨道 | 相邻网格线之间的空间(行或列)。 |
| 网格单元 | 单个行和列交叉形成的区域(类似表格单元格)。 |
| 网格区域 | 由多个网格单元组成的矩形区域,可命名并分配给项目。 |
二、Grid 容器属性
1. 定义行和列
| 属性 | 作用 | 示例 |
|---|
grid-template-columns | 定义列的数量和宽度。 | grid-template-columns: 100px 1fr 2fr; (固定 + 弹性比例) |
grid-template-rows | 定义行的数量和高度。 | grid-template-rows: auto minmax(100px, 200px); (自动 + 最小/最大) |
grid-template-areas | 通过命名区域定义布局结构。 | 见下方示例 |
示例:命名区域布局
.container {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: 80px 1fr 60px;
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; }
2. 间距与对齐
| 属性 | 作用 | 示例 |
|---|
gap | 设置行和列之间的间距(替代旧版 grid-gap)。 | gap: 20px; |
row-gap / column-gap | 单独设置行或列的间距。 | row-gap: 10px; |
justify-items | 控制所有项目在水平方向的对齐方式。 | justify-items: center; |
align-items | 控制所有项目在垂直方向的对齐方式。 | align-items: stretch; |
justify-content | 控制整个网格在容器内的水平对齐方式(当网格总宽度小于容器时)。 | justify-content: space-around; |
align-content | 控制整个网格在容器内的垂直对齐方式。 | align-content: end; |
3. 隐式轨道(自动填充)
| 属性 | 作用 |
|---|
grid-auto-rows | 定义隐式行的高度(当项目超出显式定义的行时)。 |
grid-auto-columns | 定义隐式列的宽度。 |
grid-auto-flow | 控制自动放置项目的流向(默认 row,可选 column、dense)。 |
示例:自动填充响应式列
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 15px;
}
三、Grid 项目属性
| 属性 | 作用 | 示例 |
|---|
grid-column | 指定项目占据的列范围(起始/结束网格线)。 | grid-column: 1 / 3; (跨第1到第3列) |
grid-row | 指定项目占据的行范围。 | grid-row: span 2; (跨2行) |
grid-area | 将项目分配到命名区域或指定行列范围。 | grid-area: header; 或 grid-area: 1 / 1 / 3 / 3; (行起/列起/行终/列终) |
justify-self | 覆盖单个项目的水平对齐方式。 | justify-self: end; |
align-self | 覆盖单个项目的垂直对齐方式。 | align-self: start; |
四、实用布局示例
1. 圣杯布局(Header, Sidebar, Main, Footer)
.container {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 80px 1fr 60px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
height: 100vh;
gap: 10px;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
2. 响应式卡片网格
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
padding: 20px;
}
3. 复杂覆盖布局
.item {
grid-column: 1 / -1;
grid-row: 2;
z-index: 1;
}
五、Grid vs Flexbox
| 特性 | Grid | Flexbox |
|---|
| 维度 | 二维布局(行 + 列) | 一维布局(行 或 列) |
| 控制方向 | 同时定义行和列 | 单一方向(flex-direction) |
| 内容驱动 | 容器主导布局结构 | 项目弹性填充剩余空间 |
| 适用场景 | 整体页面布局、复杂网格 | 组件内部布局、流式内容排列 |
六、浏览器支持与调试
- 兼容性:所有现代浏览器均支持 Grid 布局(查看兼容性)。
- 调试工具:
- 浏览器开发者工具中的 Grid 检查器(Chrome/Firefox)。
- 可视化网格线(通过
grid 容器的 grid 属性)。
总结
CSS Grid 布局通过简洁的语法实现了强大的二维布局能力,适用于从简单卡片到复杂仪表盘的各类场景。掌握以下核心点即可快速上手:
- 容器定义:
display: grid + grid-template-*。
- 轨道控制:
fr 单位、repeat()、minmax()。
- 项目定位:
grid-column、grid-row、grid-area。
- 响应式技巧:
auto-fill、auto-fit 结合媒体查询。