🧠 什么是 CSS Grid?
CSS Grid Layout(网格布局)是 CSS 为网页布局设计的二维系统。它允许你同时处理行和列,将页面分割成行和列交叉的网格区域,然后将元素精确放置到这些区域中。Grid 于 2017 年在所有主流浏览器中得到原生支持,被誉为 CSS 布局的终极解决方案。
Grid 和 Flexbox 并非互斥关系,而是互补关系:Flexbox 擅长一维排列(行或列),适合导航栏、按钮组、小部件等;Grid 擅长二维布局(行和列同时控制),适合页面整体结构、图片画廊、仪表盘等复杂布局。在实际项目中,你往往会同时使用两者。
🔧 Grid 的核心概念
在深入代码之前,先了解几个关键术语:
- Grid Container — 设置了
display: grid的容器元素。 - Grid Item — 容器的直接子元素,它们会成为网格项目。
- Grid Line — 网格的线条,分为列线和行线。从 1 开始编号。
- Grid Cell — 网格中的最小单元(行和列交叉的区域)。
- Grid Track — 两条相邻网格线之间的区域,即一行或一列。
- Grid Area — 一个或多个网格单元格组成的矩形区域。
💡 小贴士: Grid 的线编号从 1 开始,不是从 0。如果你有 3 列,线的编号就是 1、2、3、4(左到右四根线)。理解线的编号是使用 grid-column 和 grid-row 的关键。
1️⃣ display: grid 与基础列定义
创建一个网格容器,然后用 grid-template-columns 定义列的数量和宽度:
.container {
display: grid;
grid-template-columns: 200px 200px 200px; /* 3 列,每列 200px */
gap: 1rem; /* 网格间距 */
}
子元素会自动按顺序填入网格。上面的代码创建了一个三列网格,如果子元素有 6 个,它们会填满前两行。
2️⃣ fr 单位 — 弹性尺寸
fr 是 Grid 独有的弹性单位,代表「剩余空间的一份」。它让网格列可以自适应容器宽度:
.container {
display: grid;
grid-template-columns: 1fr 2fr 1fr; /* 中间列是两侧的 2 倍 */
gap: 1rem;
}
上面的代码创建了 3 列,中间列占可用空间的一半,两侧各占四分之一。fr 和 px、% 可以混用,比如 grid-template-columns: 200px 1fr 1fr 表示第一列固定 200px,剩余空间由后两列等分。
3️⃣ repeat() 与 auto-fill — 响应式简写
使用 repeat() 函数可以简化重复的列定义,结合 auto-fill 可以构建纯 CSS 响应式网格:
.container {
display: grid;
/* 自动填充,每列最小 250px,尽可能多放 */
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1.5rem;
}
这是 Grid 最强大的响应式技巧之一。不需要任何媒体查询,网格会自动根据容器宽度调整列数。当容器变窄时,列数自动减少;容器变宽时,列数增加 — 项目始终保持在 250px 以上。
4️⃣ grid-column 与 grid-row — 合并单元格
Grid 允许项目跨越多个列或多个行,类似于 Excel 的合并单元格:
.header {
grid-column: 1 / -1; /* 从第 1 列线到最后一列线,占满整行 */
}
.sidebar {
grid-row: 2 / 4; /* 从第 2 行线到第 4 行线,跨越 2 行 */
}
.main {
grid-column: 2 / 4; /* 跨越第 2 列到第 4 列 */
}
grid-column: 1 / -1 是一个非常实用的写法,表示「从第一列线到最后一列线」,让元素始终占满整行 — 非常适合做页头或页脚。
5️⃣ grid-template-areas — 可视化的区域命名
如果觉得数字太抽象,可以用 grid-template-areas 给网格区域命名,然后在子元素中用 grid-area 引用:
.layout {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 80px 1fr 60px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
gap: 0;
height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
这种命名方式让布局结构一目了然,特别适合构建页面整体框架。修改布局时只需要调整 grid-template-areas 中的字符串排列,无需修改每个元素的定位代码。
📝 完整实战:博客首页布局
让我们用 Grid + grid-template-areas 构建一个完整的博客首页布局:
<!DOCTYPE html>
<html>
<head>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: system-ui, sans-serif;
min-height: 100vh;
}
.blog-layout {
display: grid;
grid-template-columns: 1fr 300px;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"nav nav"
"main sidebar"
"footer footer";
min-height: 100vh;
gap: 0;
}
nav { grid-area: nav; background: #1f2937; color: white;
padding: 1rem 2rem; }
main { grid-area: main; padding: 2rem; }
aside { grid-area: sidebar; padding: 2rem;
background: #f3f4f6; }
footer { grid-area: footer; background: #1f2937; color: white;
text-align: center; padding: 1rem; }
.article-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
.article-card {
background: white;
border-radius: 0.5rem;
padding: 1.5rem;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
/* 移动端:侧栏下沉 */
@media (max-width: 768px) {
.blog-layout {
grid-template-columns: 1fr;
grid-template-areas:
"nav"
"main"
"sidebar"
"footer";
}
}
</style>
</head>
<body>
<div class="blog-layout">
<nav>我的博客</nav>
<main>
<h1>最新文章</h1>
<div class="article-grid">
<div class="article-card">
<h3>Flexbox 入门</h3>
<p>学习弹性布局的核心概念...</p>
</div>
<div class="article-card">
<h3>CSS Grid 实战</h3>
<p>掌握二维布局系统...</p>
</div>
<div class="article-card">
<h3>响应式设计技巧</h3>
<p>让页面适应所有屏幕...</p>
</div>
</div>
</main>
<aside>
<h3>关于我</h3>
<p>前端开发者,热爱分享技术知识。</p>
</aside>
<footer>© 2026 我的博客</footer>
</div>
</body>
</html>
这个实战示例体现了 Grid 的两大优势:外层用 grid-template-areas 定义页面整体骨架(导航、主栏、侧栏、页脚),内层用 repeat(auto-fill, minmax(...)) 实现自适应卡片网格。移动端只需一个媒体查询切换 grid-template-areas,侧栏就从右侧下沉到主栏下方。
🎯 总结与最佳实践
- 二维布局用 Grid — 当需要同时控制行和列时,Grid 比 Flexbox 更合适。
- 页面骨架用 grid-template-areas — 命名区域让布局直观易懂,修改方便。
- 响应式列表用 auto-fill + minmax — 纯 CSS 实现自适应列数变化。
- 弹性尺寸用 fr — fr 单位比百分比更灵活,不会产生溢出问题。
- Grid + Flexbox 结合使用 — 在实际项目中,Grid 负责整体布局,Flexbox 负责局部排列,两者互补。
CSS Grid 彻底改变了网页布局的方式。掌握了 Grid,你就能以更少的代码实现更复杂的布局,同时保持代码的清晰和可维护性。