第28课:Grid 网格布局(上)——容器属性:grid-template-columns/rows、fr 单位、gap、隐式网格
CSS Grid 是二维布局的终极解决方案。Flexbox 擅长处理一维排列(要么行、要么列),而 Grid 允许你同时控制行和列,在二维平面上精确地放置元素。它是构建页面整体框架、复杂卡片网格、仪表板布局的首选工具。本节课将从零开始,深入讲解 Grid 容器上的核心属性:如何定义网格轨道、fr 单位的弹性分配、gap 间距控制、以及隐式网格的自动生成机制。
1. 开启 Grid 布局:display: grid 与 display: inline-grid
将一个元素设置为 Grid 容器,所有直接子元素自动成为 Grid 项目。
1 | .container { |
| 值 | 容器自身行为 | 子元素行为 | 典型场景 |
|---|---|---|---|
display: grid |
容器为块级元素,独占一行。 | 子元素成为 Grid 项目。 | 页面主体布局。 |
display: inline-grid |
容器为行内块元素,可与其他元素同行。 | 子元素同上。 | 内嵌的小型网格(少见)。 |
一旦设置 display: grid,子元素的 float、display: inline-block、vertical-align 等属性将完全失效。
2. 定义网格轨道:grid-template-columns 与 grid-template-rows
网格轨道(Grid Track) 是网格中任意两条相邻网格线之间的空间——即列或行。
2.1 基本语法:固定轨道
1 | .grid { |
此网格共有 3 列 × 2 行。网格项目将依次填充这些单元格:第 1 个项目在左上角,第 2 个在右邻列,依次排列。若项目数超过 6 个,多余的会生成隐式行(见第 5 节)。
2.2 fr 单位:弹性比例的剩余空间
fr(fraction)是 Grid 布局的精髓——它表示网格容器中可用空间的一个份数。它与 Flexbox 的 flex-grow 类似,但作用于整个轨道。
1 | .grid { |
fr 与固定尺寸的混合:
1 | .grid { |
fr 的计算逻辑:
- 先减去所有固定轨道(如
px、%)和gap的总尺寸。 - 剩余空间按
fr数值比例分配。
示例:容器宽度 1000px,列定义 200px 1fr 2fr,gap: 20px(两个列间距,共 40px)。剩余空间 = 1000 - 200 - 40 = 760px。
- 第二列:
760 × 1 / 3 ≈ 253.33px - 第三列:
760 × 2 / 3 ≈ 506.67px
2.3 repeat() 函数:批量定义轨道
当需要定义多个等宽列时,repeat() 可避免重复书写。
1 | .grid { |
2.4 auto 关键字:内容自适应
auto 让轨道的尺寸根据其内部内容自动调整。
1 | .grid { |
**对比 1fr 与 auto**:
auto:尺寸 = 内容所需的最小宽度。内容短则列窄,内容长则列宽。1fr:尺寸 = 剩余空间的比例份额,与内容宽度无关。
2.5 minmax() 函数:尺寸区间约束
minmax(min, max) 定义一个闭区间,轨道的实际尺寸将落在 [min, max] 之间。
1 | .grid { |
典型场景:minmax(200px, 1fr) 确保列宽不小于 200px(防止内容过度压缩),但可以更大。
3. 间距控制:gap、row-gap、column-gap
Grid 布局中,gap(原 grid-gap,现标准已统一为 gap)设置轨道之间的间距。它仅作用于轨道之间,不会在网格容器边缘添加额外空间。
1 | .grid { |
| 属性 | 旧名称 | 作用 | 简写语法 |
|---|---|---|---|
row-gap |
grid-row-gap |
行与行之间的间距。 | gap: <row-gap> |
column-gap |
grid-column-gap |
列与列之间的间距。 | gap: <row-gap> <column-gap> |
注意:gap 也适用于 Flexbox。现代开发中应统一使用 gap,废弃带 grid- 前缀的旧属性。
4. 网格线命名:[line-name]
可以为网格线显式命名,方便后续使用 grid-column / grid-row 定位项目。
1 | .grid { |
col-start和col-end分别命名了第一列前和最后一列后的网格线。- 一条线可以有多个名字,空格分隔:
[col-start sidebar-start]。
5. 隐式网格:grid-auto-rows 与 grid-auto-columns
当 Grid 项目的数量超出显式定义的网格轨道时,浏览器会自动创建新的行或列,这些自动生成的轨道称为隐式网格(Implicit Grid)。隐式轨道的尺寸由 grid-auto-rows 和 grid-auto-columns 控制。
1 | .grid { |
没有设置 grid-auto-rows 时,隐式行的高度默认为 auto——即由内容高度决定。
1 | <div class="grid"> |
5.1 grid-auto-flow:控制自动放置方向
默认情况下,Grid 项目按先行后列的顺序自动填充(逐行填满再换行)。grid-auto-flow 可改变这一行为。
| 值 | 行为 |
|---|---|
row |
默认值。逐行填充,填满一行后换到下一行。 |
column |
逐列填充。 |
row dense |
逐行填充,并使用“稠密”算法:若前面有空隙,后项可填补。 |
column dense |
逐列填充,同样尝试填补空隙。 |
1 | .grid { |
注意:dense 模式可能打乱项目的视觉顺序,影响可访问性(键盘导航和屏幕阅读器仍按 DOM 顺序)。使用时应谨慎。
6. 综合示例:响应式卡片网格(无需媒体查询)
使用 auto-fit 和 minmax() 可构建完全响应式的网格,项目自动换行并伸缩,无需任何媒体查询。
1 | <style> |
auto-fit 与 auto-fill 的区别:
auto-fit:若容器空间有剩余,已存在的列会拉伸填满,空轨道塌陷为 0。auto-fill:即使内容不足以填满一行,也会保留空轨道(可导致右侧留白)。
| 关键字 | 行为 |
|---|---|
auto-fit |
列数不变,存在列拉伸。适合卡片网格。 |
auto-fill |
尽可能多生成列,即使列是空的。适合需要精确轨道数量的场景。 |
课后练习
一、概念自测(选择题 / 填空题)
(单选)
grid-template-columns: 1fr 2fr 1fr的意思是?
A. 三列等宽。
B. 第一列 100px,第二列 200px,第三列 100px。
C. 剩余空间按 1:2:1 的比例分配。
D. 三列宽度分别为容器宽度的 25%、50%、25%。(单选) 以下关于
auto-fit和auto-fill的说法,正确的是?
A.auto-fill会在空间富余时拉伸已存在列。
B.auto-fit会保留空轨道导致右侧留白。
C.auto-fit使已存在列拉伸填满,空轨道塌陷。
D. 两者完全等价,仅名称不同。(填空) 要设置 Grid 容器中行与行的间距为 16px,列与列的间距为 24px,应使用
______。(多选) 以下哪些 CSS 值可以用于
grid-template-columns定义轨道尺寸?
A.200px
B.1fr
C.minmax(150px, 1fr)
D.auto
二、AI 编程任务:编写面向 AI 的提示词
场景:你需要实现一个仪表板布局。要求如下:
- 整体使用 Grid 布局,四行三列。
- 第一行:顶部导航栏,占满所有列(
span 3),高度 60px。 - 第二行:左侧边栏(固定 240px),右侧内容区(
2fr),中间无间隔。 - 第三行:三个统计卡片,等分剩余空间。
- 第四行:页脚,占满所有列,高度 50px。
- 使用网格线命名或区域命名完成。
任务要求:请写出一段完整的中文提示词,发送给 AI,使其生成符合上述要求的 HTML + CSS 代码。提示词中需明确指定 Grid 容器属性、轨道定义、区域命名方式。
三、Agent 模式下的提示词示例
你是一个资深前端开发 Agent。请使用 CSS Grid 构建一个仪表板页面布局。需要创建以下文件:
index.html:包含仪表板的 HTML 结构:<header>、<aside>、<main>、三个<section class="stat">、<footer>。styles/dashboard.css:定义.dashboard为 Grid 容器。使用grid-template-areas命名区域:"header header header"、"sidebar main main"、"stat1 stat2 stat3"、"footer footer footer"。列宽240px 1fr 1fr,行高60px 1fr auto 50px,min-height: 100vh,gap: 16px。各子元素通过grid-area对应区域名。styles/global.css:引入盒模型重置、基础字体和颜色。- 确保代码整洁、注释清晰。在
index.html中正确引入 CSS 文件。
课后练习答案
一、概念自测答案
C
- 解析:
fr是弹性比例单位,按剩余空间比例分配。不是绝对像素值,也不是容器宽度的固定百分比。
- 解析:
C
- 解析:
auto-fit会拉伸已存在列,空轨道塌陷。auto-fill则保留空轨道。
- 解析:
gap: 16px 24px- 解析:
gap简写中第一个值是行间距,第二个值是列间距。
- 解析:
A、B、C、D
- 解析:
px固定值、fr弹性单位、minmax()函数、auto关键字均可用于定义轨道尺寸。
- 解析:
二、AI 编程任务参考答案(提示词示例)
示例提示词:
“请使用 CSS Grid 生成一个仪表板页面布局。要求:
- 容器
.dashboard使用display: grid,grid-template-areas定义四个区域:'header header header'、'sidebar main main'、'stat1 stat2 stat3'、'footer footer footer'。- 列宽
240px 1fr 1fr,行高60px 1fr auto 50px,min-height: 100vh,gap: 16px。- 六个子元素:
.header、.sidebar、.main、.stat1、.stat2、.stat3、.footer,分别用grid-area对应区域名。- 各区域添加简单的背景色和文字以便辨识。
- 代码简洁,注释说明区域命名与网格定义。直接输出完整 HTML 文件。”
三、Agent 模式下的提示词示例
(见上文 Agent 提示词部分)