网站
引入
Grid 用来处理二维布局,也就是同时控制行和列。
它很适合页面骨架、图片网格、后台面板、复杂卡片列表等布局。
正文
定义
定义
CSS Grid 是二维网格布局模型,用于把容器划分为行和列,并把子元素放入指定的网格区域中。
Flexbox 更像是一行或一列的弹性排列。
Grid 更像是先画好表格,再把内容放到不同格子里。
基础语法
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 16px;
}这会创建一个三列网格,每列宽度平均。
<div class="grid">
<div>1</div>
<div>2</div>
<div>3</div>
</div>.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 12px;
}常见概念
| 概念 | 说明 |
|---|---|
| 网格容器 | 设置了 display: grid; 的元素 |
| 网格项目 | 网格容器的直接子元素 |
| 网格线 | 行和列的分割线 |
| 网格轨道 | 一行或一列 |
| 网格单元格 | 行列交叉形成的格子 |
| 网格区域 | 一个或多个单元格组成的区域 |
容器常见属性
| 属性 | 作用 |
|---|---|
display: grid; | 创建 grid 容器 |
grid-template-columns | 定义列 |
grid-template-rows | 定义行 |
gap | 设置行列间距 |
justify-items | 控制项目在单元格内的水平对齐 |
align-items | 控制项目在单元格内的垂直对齐 |
grid-template-areas | 使用命名区域定义布局 |
定义列
.grid {
display: grid;
grid-template-columns: 200px 1fr 1fr;
}这里第一列是固定 200px,后两列平均分配剩余空间。
fr 单位
fr 是 Grid 中常见的弹性单位,表示可用空间的一份。
.grid {
display: grid;
grid-template-columns: 1fr 2fr;
}这里第二列会是第一列的两倍。
repeat()
repeat() 可以减少重复写法。
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
}这等同于:
.grid {
grid-template-columns: 1fr 1fr 1fr;
}minmax()
minmax() 用来设置一个范围。
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 16px;
}这个写法很适合响应式卡片列表。
每张卡片最小 240px,空间足够时自动分配剩余宽度。
行列间距 gap
.grid {
display: grid;
gap: 16px;
}也可以分别设置行间距和列间距。
.grid {
row-gap: 16px;
column-gap: 24px;
}项目位置
可以让某个项目跨多列或多行。
.featured {
grid-column: span 2;
}.featured 会横跨两列。
也可以指定起止网格线。
.sidebar {
grid-column: 1 / 2;
}
.content {
grid-column: 2 / 4;
}命名区域 grid-template-areas
命名区域适合页面骨架布局。
<div class="page">
<header class="header">头部</header>
<aside class="sidebar">侧边栏</aside>
<main class="main">主体</main>
<footer class="footer">底部</footer>
</div>.page {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
gap: 16px;
}
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.main {
grid-area: main;
}
.footer {
grid-area: footer;
}这种写法能很直观地看出页面结构。
对齐方式
.grid {
display: grid;
justify-items: center;
align-items: center;
}常见对齐属性:
| 属性 | 作用 |
|---|---|
justify-items | 控制项目在单元格内的水平方向对齐 |
align-items | 控制项目在单元格内的垂直方向对齐 |
justify-content | 控制整个网格在容器内的水平方向位置 |
align-content | 控制整个网格在容器内的垂直方向位置 |
例子
响应式卡片网格
<div class="cards">
<article class="card">卡片 1</article>
<article class="card">卡片 2</article>
<article class="card">卡片 3</article>
</div>.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 16px;
}
.card {
padding: 16px;
border: 1px solid #dddddd;
}这个布局会根据容器宽度自动调整列数。
后台页面布局
.dashboard {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr;
gap: 16px;
}
.dashboard-header {
grid-column: 1 / 3;
}头部横跨两列,下面是侧边栏和主体内容。
特点
- Grid 适合二维布局
- 可以同时控制行和列
fr用于按比例分配剩余空间repeat()可以简化重复列或行minmax()很适合响应式网格grid-template-areas适合页面区域布局
注意事项
- Grid 容器的直接子元素才是 grid 项目
- 简单的一行排列不一定要用 Grid,Flexbox 可能更直接
- 命名区域中的每一行字符串列数要一致
- Grid 很适合整体布局,Flexbox 很适合局部一维对齐
理解
可以把 Grid 理解为先在页面上画出行和列,再把元素放进格子里。
它解决的是二维布局问题,特别适合需要同时管理横向和纵向关系的页面。
如果只是让几个元素排成一行,Flexbox 更轻;如果要做完整页面骨架或卡片网格,Grid 更清楚。
引出
学完 Grid 后,可以结合 CSS 响应式设计,做出能适配不同屏幕宽度的页面布局。