CSS Grid 布局从入门到精通:12 个高频场景

CLARA轻量论坛系统
CLARA轻量论坛系统 星耀SVIP管理员 黑卡会员
发布于 2026-09-17 12:15 ·3 浏览 ·0 回复

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 检查器可视化调试,比看文档快得多。

本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-428.html
转载请注明出处,版权归原作者所有。

全部回复 0

还没有回复,来抢沙发~