📊 第六章:CSS Grid 网格布局

掌握二维布局的终极解决方案

6.1 Grid 容器与项目

CSS Grid 是一种二维布局模型,用于同时控制行和列的布局。

Grid 布局由两个主要部分组成:

基本 Grid 示例

1
2
3
4
5
6
.grid-basic {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-template-rows: 100px 100px;
    gap: 10px;
}

6.2 定义行列

grid-template-columns 和 grid-template-rows

用于定义网格的列和行。

.container {
    display: grid;
    grid-template-columns: 200px 1fr 1fr;
    grid-template-rows: 100px 200px;
}

fr 单位

fr 单位表示可用空间的一部分,是 Grid 布局中最常用的单位。

.container {
    display: grid;
    grid-template-columns: 1fr 2fr 1fr; /* 1:2:1 比例 */
}

repeat() 函数

用于重复创建相同大小的列或行。

.container {
    display: grid;
    grid-template-columns: repeat(3, 1fr); /* 3 列,每列 1fr */
    grid-template-rows: repeat(2, 100px); /* 2 行,每行 100px */
}

minmax() 函数

用于设置最小值和最大值。

.container {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

6.3 间隙控制

.container {
    display: grid;
    gap: 20px; /* 行列间隙相同 */
    row-gap: 10px; /* 行间隙 */
    column-gap: 20px; /* 列间隙 */
}

6.4 区域命名与布局

grid-template-areas 是 Grid 布局中最强大的特性之一,可以直观地定义布局结构。

grid-template-areas 示例

Header
Content
.grid-areas {
    display: grid;
    grid-template-areas: 
        "header header header"
        "sidebar content content"
        "footer footer footer";
    grid-template-rows: 100px 200px 100px;
    gap: 10px;
}

.grid-areas .header {
    grid-area: header;
}

.grid-areas .sidebar {
    grid-area: sidebar;
}

.grid-areas .content {
    grid-area: content;
}

.grid-areas .footer {
    grid-area: footer;
}

6.5 项目定位

grid-column 和 grid-row

用于控制 Grid 项目的位置和大小。

.item {
    grid-column: 1 / 3; /* 从第 1 列开始,到第 3 列结束 */
    grid-row: 1 / 2; /* 从第 1 行开始,到第 2 行结束 */
}

/* 简写形式 */
.item {
    grid-area: 1 / 1 / 2 / 3; /* 行开始 / 列开始 / 行结束 / 列结束 */
}

6.6 隐式网格与自动填充

auto-fill vs auto-fit

.container {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}

.container {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
auto-fill vs auto-fit:
- auto-fill - 尽可能多地创建列,即使是空的
- auto-fit - 只创建需要的列,空列会被压缩

6.7 实战案例

杂志式布局

.magazine-layout {
    display: grid;
    grid-template-columns: 2fr 1fr;
    grid-template-rows: auto 1fr auto;
    grid-template-areas: 
        "header header"
        "main sidebar"
        "footer footer";
    gap: 20px;
    height: 100vh;
}

仪表盘

.dashboard {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 20px;
}

.dashboard-card {
    background: white;
    padding: 20px;
    border-radius: 8px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

图片墙

.photo-gallery {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 10px;
}

.photo-item:nth-child(3) {
    grid-column: span 2;
    grid-row: span 2;
}

动手练习

练习 1:Grid 基础

  1. 创建一个 3x3 的网格布局
  2. 使用不同的单位定义列宽(px, fr, %)
  3. 设置不同的行高
  4. 测试 gap 属性

练习 2:响应式网格

  1. 创建一个响应式卡片网格
  2. 使用 repeat(auto-fit, minmax(...)) 实现自适应
  3. 在不同屏幕尺寸下测试布局

练习 3:复杂布局

  1. 使用 grid-template-areas 创建一个包含 header、sidebar、content 和 footer 的布局
  2. 为不同屏幕尺寸定义不同的布局
  3. 添加响应式设计