grid是原生二维布局模型,可同时通过grid-template-rows和grid-template-columns定义行列坐标系,支持跨行跨列定位及单元格内独立对齐;flexbox为一维模型,仅能单向排列,无行列耦合约束。

因为 Grid 是为二维空间原生设计的,Flexbox 从底层就不支持“同时控制行和列”的对齐逻辑——这不是功能缺失,而是模型边界决定的。
grid-template-rows 和 grid-template-columns 能同时生效
Grid 容器里,grid-template-rows 和 grid-template-columns 是并行定义的两个轴,浏览器会据此生成完整的行列坐标系。比如:
.dashboard {
display: grid;
grid-template-columns: 240px 1fr 300px;
grid-template-rows: 60px 1fr 80px;
}
这直接划分出一个 3 列 × 3 行的网格,每个子元素可被精确定位到某个单元格(甚至跨格)。而 Flexbox 没有 flex-template-rows 这种概念,flex-direction: row 或 column 只能二选一,无法共存。
justify-items / align-items 控制的是“单元格内”对齐,不是“容器内”
在 Grid 中,justify-items: center 是让所有网格项在其所在单元格里水平居中;align-items: end 是让它们在单元格里底部对齐。这两个属性作用域是二维的:既依赖列轨道,也依赖行轨道。
Flexbox 的 justify-content 和 align-items 是单轴语义:justify-content 总是主轴方向(由 flex-direction 决定),align-items 总是交叉轴方向——它没有“单元格”这个中间层级,所有子项共享同一根交叉轴,无法实现“第2行左对齐、第3行右对齐”这种差异化控制。
grid-column / grid-row 支持跨行跨列的绝对定位
要让一个统计卡片横跨两列、纵跨三行,只需:
.card-stats {
grid-column: 1 / -1;
grid-row: 2 / 5;
}
这个写法本质是在二维坐标系中画矩形区域。Flexbox 没有等效机制:order 只能调顺序,flex-basis 只能设宽度,flex-wrap 换行后第二行第一项的位置完全由前一行剩余空间决定,无法指定“必须落在第2行第1列”。
常见错误现象:用多层 display: flex 嵌套模拟网格,结果某项高度撑开后,同级其他项不自动等高,或换行错位——这不是写法问题,是 Flexbox 模型本身不提供行列耦合约束。
Grid 容器上写 justify-content 会被忽略
很多人把 Flex 的习惯带到 Grid 里,在 Grid 容器上写 justify-content: center,发现没效果。这是因为 Grid 的主轴对齐由 justify-content(容器级)或 justify-self(项目级)控制,但前提是你没同时设置 grid-template-columns ——一旦显式定义了列轨道,justify-content 就退化为“轨道外空白分配”,不再影响项目位置。
真正该用的是:
-
justify-items:控制所有项目在各自单元格内的行内对齐 -
align-items:控制所有项目在各自单元格内的块对齐 -
place-items:简写,如place-items: center
容易被忽略的关键点:Grid 的对齐体系是分层的(容器 → 单元格 → 项目),而 Flexbox 是扁平的(容器 → 项目)。混用时,别在外层 Grid 容器上堆 Flex 属性;真要内部对齐,让网格项自己设 display: flex。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











