CSS Grid 布局从入门到精通:12 个高频场景
CSS Grid 的核心是父元素划轨道、子元素占格子,掌握轨道、线、区域及 Flex 与 Grid 的选型后,可用 12 个高频场景代码快速实现整页骨架、圣杯三栏、响应式卡片墙、12 栅格和居中,并注意用 minmax(0,1fr) 防止横向溢出、按需选择 auto-fill 或 auto-fit,主流浏览器兼容可放心用于生产。
CSS Grid 的核心只有一句话:父元素划轨道,子元素占格子。记住这句,再套用下面 12 个高频场景的现成代码,90% 的页面布局都能几分钟写完,不必再用嵌套 div 加负 margin 去凑位置。
先搞懂三个词:轨道、线、区域
结论:Grid 把布局从「子元素之间怎么摆」变成「父元素先划出格子,子元素再往格子里坐」,思维一换,写法就简单了。
- 轨道(track):
grid-template-columns/grid-template-rows划出的一列或一行。1fr表示「剩余空间里的一份」,是最常用的单位。 - 线(line):轨道之间的分隔线,从 1 开始编号。
grid-column: 1 / 3就是「从第 1 条线占到第 3 条线」,即跨两列。 - 区域(area):用
grid-template-areas给格子起名字,子元素写grid-area: header直接落座,改布局只改那张「地图」。
选型建议:一维排列(导航条、标签组)用 Flex,二维同时管行和列(整页骨架、卡片墙)用 Grid,两者不冲突——Grid 容器里的子项照样可以是 Flex 容器。兼容性不用纠结,主流浏览器 2017 年就全面支持 Grid,可放心上生产。
场景 1-4:整页骨架,一次写对
1. 侧边栏 + 自适应主内容
.layout { display: grid; grid-template-columns: 260px 1fr; gap: 24px; }
固定列写死像素,主内容用 1fr 吃掉剩余宽度。
2. 圣杯三栏
.layout { display: grid; grid-template-columns: 200px minmax(0, 1fr) 200px; }
结论:所有 fr 列都建议写成 minmax(0, 1fr)。Grid 子项默认 min-width: auto,长表格、长 URL、pre 代码块会把轨道顶宽,横向滚动条就是这么来的;改成 minmax(0, 1fr) 或给子项加 min-width: 0 立刻解决,这是新手踩得最多的坑。
3. 响应式卡片墙(零媒体查询)
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; }
浏览器自动算能放几列,屏幕窄了自动换行,完全不用写 @media。注意 auto-fill 与 auto-fit 的区别:容器很宽、项目很少时,auto-fill 保留空轨道(卡片不被拉宽),auto-fit 折叠空轨道(卡片撑满整行)。不想让最后一行卡片被拉变形,就用 auto-fill。
4. 12 栅格系统
.grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 16px; }
.col-4 { grid-column: span 4; }
比当年浮动方案干净得多,span 4 直接表达「占 4 格」。
场景 5-8:对齐与定位,别再算 margin
5. 水平垂直居中
.center { display: grid; place-items: center; }
结论:place-items: center 是当前最省事的居中方案,两行搞定,且不需要知道子元素尺寸。
6. 单个子项跨行跨列
.feature { grid-column: span 2; grid-row: span 2; }
做图文混排、重点大图卡片时,让某一块占 2×2 个格子即可。
7. 命名区域搭页面
.page {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 220px 1fr;
}
.header { grid-area: header; }
.main { grid-area: main; }
改版式只动这几行字符串,子元素 CSS 一行都不用改。
8. 子项在格子内对齐
justify-self(横向)、align-self(纵向)、place-self(简写)作用于单个子项;justify-items / align-items 作用于全部子项。要单独摆某一张卡片,改前者即可。
场景 9-12:进阶与避坑
9. subgrid 对齐跨行内容。 卡片标题长短不一导致内部元素错位时,用 grid-template-rows: subgrid 让子元素继承父网格的行轨道。Chrome 117+、Safari 16+、Firefox 早已支持,可作渐进增强:不支持时自动退回普通布局。
10. 不等高卡片 / 伪瀑布流。 Grid 目前没有可上生产的原生 masonry(grid-template-rows: masonry 仍是实验特性)。实用做法是 grid-auto-rows: 8px 加按内容高度计算 span,或直接改用 CSS 多列 column-count。
11. 表单标签对齐。
.form { display: grid; grid-template-columns: max-content 1fr; gap: 10px 16px; }
标签列宽度自动取最长标签,输入框左边缘整齐对齐。
12. dense 回填空洞。
.gallery { grid-auto-flow: dense; }
配合不同 span 的项目,dense 会让后面的小项目回填前面留下的空格,照片墙更紧凑。代价是视觉顺序与 DOM 顺序不一致,涉及 tab 焦点顺序时要谨慎使用。
收尾:真正要背的就三条——二维布局用 Grid、fr 列一律写 minmax(0, 1fr)、卡片墙用 repeat(auto-fit, minmax(260px, 1fr))。其余 12 个场景当作模板抄改,遇到不熟悉的属性直接用浏览器开发者工具的 Grid 检查器可视化调试,比看文档快得多。
转载请注明出处,版权归原作者所有。
见习用户






