Grid 布局基础概念
1. 什么是 Grid 布局
CSS Grid 布局(网格布局)是一种二维布局系统,可以同时控制行和列。
传统布局 vs Grid布局
┌─────────────────┐ ┌─────────────────┐
│ 列1 │ 列2 │ 列3 │ │ ┌───┬───┬───┐ │
├─────────────────┤ │ │ 1 │ 2 │ 3 │ │
│ 行1 │ 行2 │ 行3 │ │ ├───┼───┼───┤ │
└─────────────────┘ │ │ 4 │ 5 │ 6 │ │
Flex 一维 │ ├───┼───┼───┤ │
│ │ 7 │ 8 │ 9 │ │
│ └───┴───┴───┘ │
└─────────────────┘
Grid 二维
2. 核心概念
2.1 Grid 容器
html
<div class="grid">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
2.2 Grid 项目
html
<div class="grid">
<div>这是 Grid 项目</div>
<div>这是 Grid 项目</div>
</div>
2.3 网格线
行网格线: 列网格线:
┌───┬───┐ ┌───┬───┐
1 │ │ │ 1│ │ │
├───┼───┤ ├───┼───┤
2 │ │ │ 2│ │ │
└───┴───┘ └───┴───┘
行号 1,2,3 列号 1,2,3
2.4 网格轨道
- 列轨道:垂直方向的网格线之间的空间
- 行轨道:水平方向的网格线之间的空间
2.5 网格单元格
行和列交叉的区域,一个单元格就是一个 Grid 项目的位置。
2.6 网格区域
由多个单元格组成的矩形区域。
3. 启用 Grid 布局
css
.container {
display: grid;
}
3.1 基础示例
html
<style>
.grid {
display: grid;
gap: 10px;
background: #f0f0f0;
}
.item {
background: #3b82f6;
color: white;
padding: 20px;
text-align: center;
border-radius: 8px;
}
</style>
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
4. 定义网格结构
4.1 grid-template-columns
定义列的数量和宽度:
css
/* 3列,每列 100px */
.grid {
grid-template-columns: 100px 100px 100px;
}
/* 3列,使用 fr 单位(比例)*/
.grid {
grid-template-columns: 1fr 1fr 1fr;
}
/* 混合单位 */
.grid {
grid-template-columns: 100px 1fr 2fr;
}
/* repeat() 函数 */
.grid {
grid-template-columns: repeat(3, 1fr);
}
/* minmax() 函数 */
.grid {
grid-template-columns: minmax(100px, 1fr) 1fr 1fr;
}
/* auto 关键字 */
.grid {
grid-template-columns: auto 1fr auto;
}
4.2 grid-template-rows
定义行的数量和高度:
css
/* 3行,每行 100px */
.grid {
grid-template-rows: 100px 100px 100px;
}
/* 自动高度 */
.grid {
grid-template-rows: auto auto auto;
}
/* 混合单位 */
.grid {
grid-template-rows: 100px 1fr 2fr;
}
4.3 完整示例
html
<style>
.grid {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 100px 200px;
gap: 10px;
}
</style>
<div class="grid">
<div class="item">列1行1</div>
<div class="item">列2行1</div>
<div class="item">列3行1</div>
<div class="item">列1行2</div>
<div class="item">列2行2</div>
<div class="item">列3行2</div>
</div>
5. fr 单位详解
fr(fraction)表示剩余空间的分配比例。
css
/* 剩余空间分成 3 份,第1列占1份,第2列占2份 */
.grid {
grid-template-columns: 1fr 2fr;
}
计算方式:
- 总宽度 = 800px
- 固定宽度元素 = 100px
- 剩余空间 = 700px
- 1fr = 700px / (1+2) = 233.33px
- 第1列 = 233.33px
- 第2列 = 466.67px
6. repeat() 函数
简化重复定义:
css
/* 3列等宽 */
.grid {
grid-template-columns: repeat(3, 1fr);
}
/* 重复模式 */
.grid {
grid-template-columns: repeat(2, 100px 200px);
/* 等价于: 100px 200px 100px 200px */
}
/* auto-fill 和 auto-fit */
.grid {
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
7. minmax() 函数
设置最小和最大尺寸:
css
/* 每列最小 100px,最大 1fr */
.grid {
grid-template-columns: repeat(3, minmax(100px, 1fr));
}
/* 响应式布局 */
.grid {
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
8. 间距
8.1 gap
设置行和列之间的间距:
css
.grid {
gap: 20px; /* 行列间距都是 20px */
row-gap: 20px; /* 只设置行间距 */
column-gap: 10px; /* 只设置列间距 */
}
8.2 示例
html
<style>
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
</style>
9. 练习
练习 1:创建 3x3 网格
创建一个 3 行 3 列的网格,每个单元格 100x100px。
参考答案:
css
.grid {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
gap: 10px;
}
练习 2:响应式网格
创建一个响应式网格,手机版 1 列,平板 2 列,电脑 4 列。
参考答案:
css
.grid {
display: grid;
gap: 20px;
grid-template-columns: 1fr;
}
@media (min-width: 768px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(4, 1fr);
}
}
练习 3:使用 minmax 的响应式网格
一行代码实现响应式网格:
参考答案:
css
.grid {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
10. 总结
| 属性 | 作用 | 示例 |
|---|---|---|
display: grid |
启用 Grid | display: grid |
grid-template-columns |
定义列 | repeat(3, 1fr) |
grid-template-rows |
定义行 | 100px 200px |
gap |
间距 | 20px |
fr 单位 |
比例分配 | 1fr 2fr |
repeat() |
重复模式 | repeat(3, 1fr) |
minmax() |
最小最大尺寸 | minmax(100px, 1fr) |
Grid 布局:项目放置
1. 概述
创建网格后,需要将项目放置到网格中。Grid 提供了多种放置方式,可以精确控制每个项目的位置和大小。
网格线编号:
列线 1 列线 2 列线 3 列线 4
↓ ↓ ↓ ↓
行线1 → ┌───┬───┬───┐
│ │ │ │
行线2 → ├───┼───┼───┤
│ │ │ │
行线3 → ├───┼───┼───┤
│ │ │ │
行线4 → └───┴───┴───┘
2. 网格线编号
Grid 的网格线从 1 开始编号:
列线: 1 2 3 4
行线: 1
2
3
4
2.1 使用网格线放置
css
/* 从第2列线开始,到第4列线结束 */
.item {
grid-column-start: 2;
grid-column-end: 4;
}
2.2 简写属性
css
/* grid-column: start / end */
.item {
grid-column: 2 / 4;
}
/* grid-row: start / end */
.item {
grid-row: 1 / 3;
}
/* 合并简写:grid-area: row-start / col-start / row-end / col-end */
.item {
grid-area: 1 / 2 / 3 / 4;
}
3. span 关键字
使用 span 指定跨越的轨道数量,而不是结束线:
css
/* 跨越2列 */
.item {
grid-column: 2 / span 2;
/* 等价于 grid-column: 2 / 4 */
}
/* 跨越3行 */
.item {
grid-row: 1 / span 3;
}
/* 简写 */
.item {
grid-area: 1 / 2 / span 2 / span 3;
}
4. 命名网格线
4.1 定义命名网格线
css
.grid {
display: grid;
grid-template-columns: [main-start] 1fr [content-start] 2fr [content-end] 1fr [main-end];
grid-template-rows: [header-start] 100px [main-start] 200px [main-end] 100px [footer-end];
}
4.2 使用命名网格线
css
.header {
grid-column: main-start / main-end;
grid-row: header-start / main-start;
}
.main {
grid-column: content-start / content-end;
grid-row: main-start / main-end;
}
5. 命名网格区域
5.1 定义网格区域
使用 grid-template-areas 创建命名的区域:
css
.grid {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 80px 200px 60px;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
5.2 放置项目
html
<div class="grid">
<header class="header">Header</header>
<aside class="sidebar">Sidebar</aside>
<main class="main">Main</main>
<footer class="footer">Footer</footer>
</div>
css
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.main {
grid-area: main;
}
.footer {
grid-area: footer;
}
5.3 点号表示空单元格
css
.grid {
grid-template-areas:
"header header header"
". main main"
"footer footer footer";
/* . 表示该位置为空 */
}
6. 对齐方式
6.1 项目在单元格内对齐
| 属性 | 方向 | 说明 |
|---|---|---|
justify-self |
水平 | 单个项目在单元格内的水平对齐 |
align-self |
垂直 | 单个项目在单元格内的垂直对齐 |
place-self |
两者 | 简写 align-self justify-self |
css
.item {
justify-self: start; /* 左对齐 */
justify-self: end; /* 右对齐 */
justify-self: center; /* 居中 */
justify-self: stretch; /* 拉伸(默认)*/
align-self: start; /* 顶部对齐 */
align-self: end; /* 底部对齐 */
align-self: center; /* 垂直居中 */
align-self: stretch; /* 拉伸(默认)*/
}
6.2 所有项目在网格内对齐
| 属性 | 方向 | 说明 |
|---|---|---|
justify-items |
水平 | 所有项目在单元格内的水平对齐 |
align-items |
垂直 | 所有项目在单元格内的垂直对齐 |
place-items |
两者 | 简写 |
css
.grid {
justify-items: center; /* 所有项目水平居中 */
align-items: center; /* 所有项目垂直居中 */
place-items: center; /* 所有项目居中 */
}
6.3 整个网格的对齐
| 属性 | 方向 | 说明 |
|---|---|---|
justify-content |
水平 | 网格整体在容器中的水平对齐 |
align-content |
垂直 | 网格整体在容器中的垂直对齐 |
place-content |
两者 | 简写 |
css
.grid {
justify-content: start; /* 左对齐 */
justify-content: center; /* 居中 */
justify-content: end; /* 右对齐 */
justify-content: space-between; /* 两端对齐 */
justify-content: space-around; /* 环绕对齐 */
justify-content: space-evenly; /* 均匀对齐 */
}
7. 自动放置
7.1 默认行为
Grid 项目按 HTML 顺序自动放置:
css
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* 项目自动按行填充 */
}
7.2 grid-auto-flow
控制自动放置的方向:
css
/* 按行填充(默认)*/
.grid {
grid-auto-flow: row;
}
/* 按列填充 */
.grid {
grid-auto-flow: column;
}
/* 行填充,但尽量填满空白 */
.grid {
grid-auto-flow: row dense;
}
/* 列填充,但尽量填满空白 */
.grid {
grid-auto-flow: column dense;
}
8. 隐式网格
8.1 定义隐式网格尺寸
当项目超出定义的网格时,会自动创建隐式网格:
css
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 100px 100px; /* 只定义了2行 */
/* 额外行的默认高度 */
grid-auto-rows: 80px;
/* 额外列的默认宽度 */
grid-auto-columns: 100px;
}
8.2 隐式网格与显式网格
显式网格(定义的行/列) 隐式网格(自动生成)
┌────┬────┬────┐ ┌────┬────┬────┐
│ 1 │ 2 │ 3 │ │ 7 │ 8 │ 9 │
├────┼────┼────┤ ├────┼────┼────┤
│ 4 │ 5 │ 6 │ │ 10 │ 11 │ 12 │
└────┴────┴────┘ └────┴────┴────┘
9. 完整示例
9.1 经典网页布局
html
<style>
.grid {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 80px 1fr 60px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
gap: 10px;
min-height: 100vh;
}
.header {
grid-area: header;
background: #3b82f6;
padding: 20px;
}
.sidebar {
grid-area: sidebar;
background: #10b981;
padding: 20px;
}
.main {
grid-area: main;
background: #f59e0b;
padding: 20px;
}
.footer {
grid-area: footer;
background: #6b7280;
padding: 20px;
}
</style>
<div class="grid">
<header class="header">Header</header>
<aside class="sidebar">Sidebar</aside>
<main class="main">Main Content</main>
<footer class="footer">Footer</footer>
</div>
9.2 卡片画廊
html
<style>
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
padding: 20px;
}
.card {
background: white;
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* 第一个卡片跨越2列 */
.card:first-child {
grid-column: span 2;
}
/* 第三个卡片跨越2行 */
.card:nth-child(3) {
grid-row: span 2;
}
</style>
<div class="gallery">
<div class="card">卡片1</div>
<div class="card">卡片2</div>
<div class="card">卡片3</div>
<div class="card">卡片4</div>
<div class="card">卡片5</div>
<div class="card">卡片6</div>
</div>
10. 练习
练习 1:放置项目
将下面 HTML 中的项目放置到指定位置:
- 项目 A:占据第 1-2 行,第 1-2 列
- 项目 B:占据第 1-2 行,第 3-4 列
- 项目 C:占据第 3 行,第 1-4 列
html
<div class="grid">
<div class="a">A</div>
<div class="b">B</div>
<div class="c">C</div>
</div>
参考答案:
css
.grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 100px);
gap: 10px;
}
.a {
grid-column: 1 / 3;
grid-row: 1 / 3;
}
.b {
grid-column: 3 / 5;
grid-row: 1 / 3;
}
.c {
grid-column: 1 / 5;
grid-row: 3 / 4;
}
练习 2:使用命名区域
创建布局:
- 顶部:标题(header)
- 左侧:导航(nav)
- 右侧:内容(content)
- 底部:页脚(footer)
参考答案:
css
.grid {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 80px 1fr 60px;
grid-template-areas:
"header header"
"nav content"
"footer footer";
}
.header { grid-area: header; }
.nav { grid-area: nav; }
.content { grid-area: content; }
.footer { grid-area: footer; }
11. 总结
| 属性 | 作用 | 示例 |
|---|---|---|
grid-column-start/end |
指定列开始/结束线 | grid-column: 2 / 4 |
grid-row-start/end |
指定行开始/结束线 | grid-row: 1 / 3 |
grid-area |
合并简写 | grid-area: 1/2/3/4 |
span |
跨越轨道数 | grid-column: 2 / span 2 |
grid-template-areas |
命名区域 | "header header" |
justify-self |
项目水平对齐 | center |
align-self |
项目垂直对齐 | center |
grid-auto-flow |
自动放置方向 | row dense |
grid-auto-rows |
隐式行高度 | 100px |
Grid 布局:高级特性
1. 子网格 subgrid
subgrid 允许子网格继承父网格的轨道定义,创建更复杂的嵌套布局。
1.1 基础用法
css
/* 父网格 */
.parent {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
/* 子网格继承父网格的列定义 */
.child {
display: grid;
grid-template-columns: subgrid;
grid-column: span 2;
}
1.2 完整示例
html
<style>
.grid {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
gap: 10px;
}
.card {
display: grid;
grid-template-columns: subgrid;
grid-column: span 2;
background: #f0f0f0;
padding: 10px;
border-radius: 8px;
}
/* 卡片内部元素自动对齐父网格的列 */
.card-header {
grid-column: 1 / 2;
}
.card-content {
grid-column: 2 / 3;
}
</style>
<div class="grid">
<div class="card">
<div class="card-header">标题</div>
<div class="card-content">内容与标题对齐</div>
</div>
</div>
1.3 同时使用行和列 subgrid
css
.card {
display: grid;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
grid-row: span 2;
grid-column: span 2;
}
2. 网格命名区域高级用法
2.1 重复区域名称
多个单元格可以使用相同名称,创建合并区域:
css
.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 100px 200px 100px;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
2.2 空区域使用点号
css
.grid {
grid-template-areas:
"header header header"
". main main"
"footer footer footer";
}
2.3 响应式区域
css
.grid {
display: grid;
grid-template-columns: 1fr;
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
}
@media (min-width: 768px) {
.grid {
grid-template-columns: 200px 1fr;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
}
3. 层叠与 z-index
Grid 项目可以重叠,使用 z-index 控制层叠顺序。
3.1 重叠示例
html
<style>
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 100px);
gap: 10px;
}
.item1 {
grid-column: 1 / 4;
grid-row: 1 / 4;
background: rgba(59, 130, 246, 0.5);
z-index: 1;
}
.item2 {
grid-column: 2 / 3;
grid-row: 2 / 3;
background: rgba(239, 68, 68, 0.5);
z-index: 2;
}
</style>
<div class="grid">
<div class="item1">背景层</div>
<div class="item2">前景层</div>
</div>
4. masonry 布局(实验性)
瀑布流布局,项目按列排列,高度自适应。
4.1 基本语法
css
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: masonry;
}
4.2 浏览器支持
目前需要启用实验性标志:
- Firefox:
layout.css.grid-template-masonry-value.enabled
4.3 替代方案:使用 auto-fill
css
/* 使用 minmax 实现类似效果 */
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
5. 多列对齐详解
5.1 水平对齐 (justify-content)
css
.grid {
display: grid;
grid-template-columns: 100px 100px;
justify-content: start; /* 左对齐 */
justify-content: end; /* 右对齐 */
justify-content: center; /* 居中 */
justify-content: space-between; /* 两端对齐 */
justify-content: space-around; /* 环绕对齐 */
justify-content: space-evenly; /* 均匀对齐 */
}
5.2 垂直对齐 (align-content)
css
.grid {
display: grid;
grid-template-rows: 100px 100px;
align-content: start; /* 顶部对齐 */
align-content: end; /* 底部对齐 */
align-content: center; /* 居中 */
align-content: space-between;
align-content: space-around;
align-content: space-evenly;
}
5.3 完整对齐示例
html
<style>
.grid {
display: grid;
grid-template-columns: 100px 100px;
grid-template-rows: 100px 100px;
justify-content: center;
align-content: center;
height: 500px;
background: #f0f0f0;
}
</style>
<div class="grid">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
6. 自动填充 vs 自动适配
6.1 auto-fill
尽可能多地创建轨道,即使为空:
css
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
6.2 auto-fit
创建轨道但会折叠空轨道:
css
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
6.3 对比
auto-fill(保留空轨道) auto-fit(折叠空轨道)
┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐
│ 1 │ 2 │ │ │ │ 1 │ 2 │ │ │
└────┴────┴────┴────┘ └────┴────┴────┴────┘
空轨道保留 空轨道折叠,内容拉伸
7. 网格动画
Grid 布局支持平滑过渡动画。
7.1 网格重排动画
html
<style>
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
transition: all 0.3s ease;
}
.grid.expanded {
grid-template-columns: repeat(4, 1fr);
}
.item {
background: #3b82f6;
padding: 20px;
transition: all 0.3s ease;
}
</style>
<button onclick="toggle()">切换</button>
<div class="grid" id="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
<script>
function toggle() {
document.getElementById('grid').classList.toggle('expanded');
}
</script>
7.2 项目位置动画
css
.item {
transition: all 0.3s ease;
}
.item.moved {
grid-column: 3 / 4;
grid-row: 2 / 3;
}
8. 性能优化
8.1 避免过度使用 grid-template-areas
复杂的区域定义会影响渲染性能,简单布局使用网格线更高效。
8.2 使用 contain 属性
css
.grid {
contain: layout;
}
8.3 减少重排
批量修改网格属性,而不是逐个修改:
javascript
// ✅ 推荐
grid.style.gridTemplateColumns = 'repeat(4, 1fr)';
// ❌ 避免
for (let i = 0; i < 4; i++) {
grid.style.gridTemplateColumns += ' 1fr';
}
9. 响应式网格高级技巧
9.1 容器查询 + Grid
css
.card-container {
container-type: inline-size;
}
.card-grid {
display: grid;
gap: 1rem;
grid-template-columns: 1fr;
}
@container (min-width: 400px) {
.card-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@container (min-width: 600px) {
.card-grid {
grid-template-columns: repeat(3, 1fr);
}
}
9.2 视口单位 + Grid
css
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
gap: 1rem;
}
10. 综合实战
10.1 现代博客布局
html
<style>
.blog {
display: grid;
grid-template-columns: 1fr 3fr 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
min-height: 100vh;
gap: 20px;
}
.header {
grid-area: header;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 2rem;
text-align: center;
}
.nav {
grid-area: nav;
background: #f3f4f6;
padding: 1rem;
border-radius: 8px;
}
.main {
grid-area: main;
background: white;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.aside {
grid-area: aside;
background: #f3f4f6;
padding: 1rem;
border-radius: 8px;
}
.footer {
grid-area: footer;
background: #1f2937;
color: white;
padding: 1rem;
text-align: center;
}
@media (max-width: 768px) {
.blog {
grid-template-columns: 1fr;
grid-template-areas:
"header"
"nav"
"main"
"aside"
"footer";
}
}
</style>
<div class="blog">
<header class="header">博客标题</header>
<nav class="nav">导航菜单</nav>
<main class="main">主要内容区域</main>
<aside class="aside">侧边栏</aside>
<footer class="footer">页脚信息</footer>
</div>
10.2 仪表盘布局
html
<style>
.dashboard {
display: grid;
grid-template-columns: 260px 1fr 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"sidebar header header"
"sidebar main main"
"sidebar footer footer";
min-height: 100vh;
}
.sidebar {
grid-area: sidebar;
background: #1e293b;
color: white;
padding: 1rem;
}
.header {
grid-area: header;
background: white;
padding: 1rem;
border-bottom: 1px solid #e2e8f0;
}
.main {
grid-area: main;
padding: 1rem;
background: #f8fafc;
}
.footer {
grid-area: footer;
background: white;
padding: 1rem;
border-top: 1px solid #e2e8f0;
text-align: center;
}
.stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
margin-bottom: 1rem;
}
.stat-card {
background: white;
padding: 1rem;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
</style>
<div class="dashboard">
<aside class="sidebar">侧边栏菜单</aside>
<header class="header">顶部栏</header>
<main class="main">
<div class="stats">
<div class="stat-card">统计卡片1</div>
<div class="stat-card">统计卡片2</div>
<div class="stat-card">统计卡片3</div>
</div>
</main>
<footer class="footer">页脚</footer>
</div>
11. 练习
练习 1:响应式照片墙
创建照片墙布局:
- 手机:1列
- 平板:2列
- 电脑:3列
- 第一张照片占据 2 列
参考答案:
css
.gallery {
display: grid;
gap: 10px;
grid-template-columns: 1fr;
}
.gallery > :first-child {
grid-column: span 1;
}
@media (min-width: 768px) {
.gallery {
grid-template-columns: repeat(2, 1fr);
}
.gallery > :first-child {
grid-column: span 2;
}
}
@media (min-width: 1024px) {
.gallery {
grid-template-columns: repeat(3, 1fr);
}
.gallery > :first-child {
grid-column: span 2;
}
}
练习 2:卡片重叠效果
创建 3 张卡片,它们重叠部分区域,形成层叠效果。
参考答案:
css
.stack {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: 1fr;
}
.stack > * {
grid-column: 1 / 2;
grid-row: 1 / 2;
transition: transform 0.3s;
}
.stack > :first-child {
z-index: 3;
transform: translate(0, 0);
}
.stack > :nth-child(2) {
z-index: 2;
transform: translate(10px, 10px);
}
.stack > :nth-child(3) {
z-index: 1;
transform: translate(20px, 20px);
}
.stack > *:hover {
transform: translate(0, 0);
z-index: 10;
}
12. 总结
| 特性 | 说明 | 示例 |
|---|---|---|
| subgrid | 子网格继承父网格 | grid-template-columns: subgrid |
| 命名区域 | 定义布局区域 | grid-template-areas |
| 重叠 | 网格项目重叠 | 使用相同 grid-area |
| masonry | 瀑布流布局 | grid-template-rows: masonry |
| auto-fill | 自动填充轨道 | repeat(auto-fill, ...) |
| auto-fit | 自动适配轨道 | repeat(auto-fit, ...) |
| 容器查询 | 根据容器大小响应 | @container |
13. 资源推荐
- CSS Grid Garden - 游戏式学习
- Grid by Example - 示例大全
- A Complete Guide to Grid - 完整指南