← 返回首页 / CSS Grid 入门教程

🧩 CSS Grid 布局入门教程

CSS Grid Layout 是 CSS 中最强大的二维布局系统。与 Flexbox 的一维排列不同,Grid 让你同时控制行和列,轻松实现复杂的页面结构。本教程带你从概念到实战,彻底掌握 Grid 布局。

CSS3 · 网格布局 · 二维系统

🧪 实时效果演示 — Grid 布局示例

3 列等宽网格 — grid-template-columns: repeat(3, 1fr)

1
2
3
4
5
6

自适应列 — grid-template-columns: 2fr 1fr(主栏:侧栏 = 2:1)

主内容区 (2fr)
侧栏 (1fr)

跨列合并 — 第一个单元格占 2 列

跨两列
3
4
5
6

🧠 什么是 CSS Grid?

CSS Grid Layout(网格布局)是 CSS 为网页布局设计的二维系统。它允许你同时处理行和列,将页面分割成行和列交叉的网格区域,然后将元素精确放置到这些区域中。Grid 于 2017 年在所有主流浏览器中得到原生支持,被誉为 CSS 布局的终极解决方案。

Grid 和 Flexbox 并非互斥关系,而是互补关系:Flexbox 擅长一维排列(行或列),适合导航栏、按钮组、小部件等;Grid 擅长二维布局(行和列同时控制),适合页面整体结构、图片画廊、仪表盘等复杂布局。在实际项目中,你往往会同时使用两者。

🔧 Grid 的核心概念

在深入代码之前,先了解几个关键术语:

💡 小贴士: 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 列,中间列占可用空间的一半,两侧各占四分之一。frpx% 可以混用,比如 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,侧栏就从右侧下沉到主栏下方。

🎯 总结与最佳实践

CSS Grid 彻底改变了网页布局的方式。掌握了 Grid,你就能以更少的代码实现更复杂的布局,同时保持代码的清晰和可维护性。

← 返回所有教程