CSS Grid 布局超详细零基础教程(从原理到实战)
Grid 是 CSS 最强大的二维布局系统,唯一同时支持「行+列」双向精准控制的布局方案。相比 Flex 一维布局,Grid 天生适配多行多列规整布局,无需浮动、无需百分比计算、无需复杂适配,是页面整体布局、卡片网格、后台架构的最优解。
本文全程新手友好,无晦涩术语,循序渐进讲清所有核心知识点、属性用法、取值技巧、常见坑,附带可直接复制运行的完整代码。
一、核心认知:Grid 到底是什么?
1. 核心定位
Flex:一维布局 —— 只能沿单一方向排列(横/竖),换行只是伪多行,无法统一管控列对齐
Grid:二维布局 —— 同时定义行、列,把容器分割成规整网格单元格,子元素精准落在网格内
2. 必备基础术语(新手必记)
网格容器(Grid Container):设置了
display: grid的父元素,所有布局规则都定义在它身上网格项(Grid Item):网格容器的直接子元素,自动适配网格布局,孙子元素不生效
网格线(Grid Line):分割行列的横竖线条(列线、行线),用于定位和跨格
网格单元格(Grid Cell):横竖网格线围成的最小单个格子
网格轨道(Grid Track):单个行/列的整体空间
网格间距(Gap):格子之间的空白间距,替代传统 margin,无重叠、更规整
二、Grid 快速入门:最简初始化代码
Grid 布局只需两步启用,无需额外复杂配置:
父元素开启网格布局
定义列、行的尺寸规则
完整基础示例(可直接运行)
<style>
/* 网格容器 */
.grid-box {
/* 开启标准网格布局(独占一行) */
display: grid;
/* 定义3列,每列平分剩余空间 */
grid-template-columns: repeat(3, 1fr);
/* 定义2行,高度自适应内容 */
grid-template-rows: auto auto;
/* 统一设置行列间距 */
gap: 15px;
/* 辅助样式,方便观察 */
background: #f5f5f5;
padding: 15px;
}
/* 网格项样式 */
.grid-item {
background: #409eff;
color: #fff;
text-align: center;
padding: 20px 0;
border-radius: 4px;
}
</style>
<div class="grid-box">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
</div>效果:自动生成3列2行 规整网格,6个元素自动填满格子,间距均匀、列宽完全一致。
补充:display: inline-grid 行内网格,容器不独占一行,可和同行元素并排,极少用。
三、Grid 核心属性大全(容器属性)
Grid 90% 的场景都靠容器属性实现,掌握以下属性即可应对99%的布局需求。
1. 定义列:grid-template-columns
控制网格每一列的宽度,写几个值就代表几列。
常用取值(新手必掌握)
固定像素:
grid-template-columns: 100px 200px 100px→ 三列固定宽度fr 等分单位(Grid 神器):
fr代表「剩余空间份数」,自动均分、自适应容器百分比:
grid-template-columns: 30% 40% 30%→ 按比例分配auto:自适应内容宽度
minmax(最小值, 最大值):限制尺寸范围,实现自适应
高频实用写法
/* 3列等宽(最常用) */ grid-template-columns: repeat(3, 1fr); /* 左右固定、中间自适应(经典布局) */ grid-template-columns: 200px 1fr 200px; /* 2列:最小200px,自动放大 */ grid-template-columns: repeat(2, minmax(200px, 1fr)); /* 不等分比例:1:2:1 */ grid-template-columns: 1fr 2fr 1fr;
小知识:repeat(次数, 规则) 是简写语法,避免重复写代码,简洁高效。
2. 定义行:grid-template-rows
控制网格每一行的高度,取值规则和列完全一致。只定义前几行,超出行数高度默认自适应。
/* 2行,第一行固定80px,第二行自适应 */ grid-template-rows: 80px auto; /* 3行等高均分 */ grid-template-rows: repeat(3, 1fr);
3. 网格间距:gap(终极简写)
设置格子之间的间距,不叠加、不塌陷、无需margin,是Grid布局的优势之一。
/* 上下间距10px,左右间距20px */ gap: 10px 20px; /* 行列统一间距15px(最常用) */ gap: 15px; /* 单独设置 */ row-gap: 10px; /* 行间距 */ column-gap: 20px; /* 列间距 */
4. 网格对齐(全局对齐)
分为「格子内容对齐」和「整体网格对齐」,新手极易混淆,清晰区分如下:
① 单元格内元素对齐(控制每一个格子里的内容)
justify-items:水平对齐(左/中/右)align-items:垂直对齐(上/中/下)
通用取值:start 默认、center 居中、end 靠后、stretch 拉伸填满(默认)
/* 所有格子内容水平+垂直居中(一键居中神器) */ justify-items: center; align-items: center;
② 整体网格对齐(网格总尺寸 < 容器尺寸时生效)
justify-content:整体网格水平对齐align-content:整体网格垂直对齐
适用场景:行列用固定px宽度,网格整体没填满容器时,调整网格整体位置。
5. 自动填充:auto-fill / auto-fit(响应式神器)
无需媒体查询,一键实现自动适配列数,屏幕宽就多排,屏幕窄就少排。
/* 自动填充:每列最小250px,自动增减列数 */ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
核心区别:
auto-fill:剩余空间保留空白,填充空格子
auto-fit:剩余空间分配给现有格子,自动拉伸铺满
日常开发 优先用 auto-fit,布局更饱满美观。
四、Grid 项目属性(子元素专属)
用来控制单个网格项的位置、跨格、大小,实现不规则复杂布局。
1. 跨列 / 跨行(最常用)
/* 当前元素跨2列 */ grid-column: span 2; /* 当前元素跨2行 */ grid-row: span 2;
实战场景:轮播大图、通栏标题、侧边栏跨行等高布局。
2. 精准定位网格线
网格线从1开始计数,可精准指定元素从第几根线到第几根线。
/* 列:从第1根线到第3根线(跨2列) */ grid-column: 1 / 3; /* 行:从第2根线到第4根线(跨2行) */ grid-row: 2 / 4;
3. 单个元素独立对齐
覆盖容器全局对齐规则,单独设置某个格子的对齐方式:
justify-self: center; /* 单个元素水平居中 */ align-self: center; /* 单个元素垂直居中 */
五、Grid 区域布局(最直观的可视化布局)
Grid 最强功能之一:用文字画布局,直观易懂,专门用于页面整体架构(头部、侧边、主体、底部)。
完整后台布局示例(可直接复用)
<style>
.layout {
display: grid;
/* 3列布局 */
grid-template-columns: 200px 1fr;
/* 3行布局 */
grid-template-rows: 60px 1fr 40px;
/* 可视化定义区域 */
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
/* 占满屏幕高度 */
height: 100vh;
margin: 0;
gap: 10px;
}
/* 子元素绑定区域 */
.header { grid-area: header; background: #1989fa; }
.sidebar { grid-area: sidebar; background: #333; color: #fff; }
.main { grid-area: main; background: #f5f5f5; }
.footer { grid-area: footer; background: #eee; }
</style>
<div class="layout">
<div class="header">头部导航</div>
<div class="sidebar">侧边栏</div>
<div class="main">主体内容</div>
<div class="footer">底部版权</div>
</div>优势:代码即布局图,一眼看懂页面结构,修改布局只需修改grid-template-areas 文字,无需调整定位。
六、Grid 核心取值精讲(新手必懂)
1. fr 单位(重中之重)
fr = fraction(分数),只分配剩余空白空间,不挤压固定尺寸元素。
示例:200px 1fr 2fr
第一列固定200px
剩余空间分为3份,第二列占1份,第三列占2份
完美解决「固定+自适应」布局,比百分比、auto 更精准。
2. minmax() 函数
语法:minmax(最小值, 最大值),给尺寸设置上下限,杜绝布局塌陷。
/* 列宽最小200px,最大不限,自适应拉伸 */ minmax(200px, 1fr)
七、新手高频误区 & 避坑指南
误区1:Grid 子元素还需要浮动/定位
❌ 错误:开启 Grid 后,子元素 自动脱离普通文档流,浮动、clear、vertical-align 全部失效,无需额外设置。
误区2:分不清 justify-items 和 justify-content
✅ 口诀:items 管格子内部,content 管整体网格
绝大多数场景,新手只用 justify-items / align-items 即可。
误区3:Grid 可以替代所有 Flex 布局
❌ 没必要:单行单列线性布局(导航、按钮组)优先 Flex,代码更简洁;多行多列、整体页面布局优先 Grid。
误区4:auto-fill 和 auto-fit 混用出错
✅ 总结:想要留白用 auto-fill,想要铺满用 auto-fit,响应式卡片一律 auto-fit。
八、Grid 实战场景总结(开发直接套用)
1. 通用卡片网格(商品、图片、列表)
.card-wrap {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
}无需媒体查询,自动适配手机/平板/电脑端。
2. 经典后台管理布局
使用 grid-template-areas 区域布局,结构清晰、维护简单。
3. 不规则图文混排
通过 span 跨列/跨行实现大图、小图、文字组合的复杂布局,比 Flex 简单10倍。
九、Grid vs Flex 最终选型口诀
一行/一列、线性排列 → 用 Flex
多行多列、规整网格、页面整体架构 → 用 Grid
复杂跨格、不规则布局、自适应网格 → 必用 Grid
实战最优解:外层Grid搭框架,内层Flex排内容
十、极简核心属性速查表
/* 容器核心属性 */ display: grid; // 开启网格 grid-template-columns: 列尺寸; // 定义列 grid-template-rows: 行尺寸; // 定义行 gap: 间距; // 格子间距 justify-items: center; // 水平居中 align-items: center; // 垂直居中 grid-template-areas: 区域布局; // 可视化布局 /* 子项核心属性 */ grid-column: span 2; // 跨2列 grid-row: span 2; // 跨2行 grid-area: 区域名; // 绑定布局区域