flex 布局仅支持一维排列,无法原生实现二维行列定位;grid 则提供原生行列坐标系,直接支持跨行跨列、响应式布局与语义化结构。

Flex 布局天生只管一条线上的排列,不是它“做不好”二维,而是它的设计目标压根不包含行列交叉定位。
Flex 的主轴 + 交叉轴本质是一条线的两个方向
flex-direction 决定主轴(row 或 column),所有子项默认沿这条线排开;交叉轴只是垂直于它的辅助对齐线,不能定义“第几行第几列”。你无法用 flex 直接声明“这个元素占两行三列”,因为没有行号、列号、起始位置这些概念。
-
align-items只能整体控制交叉轴对齐方式(如center),不能单独指定某个子项在交叉轴上的偏移 -
justify-content只作用于主轴,对交叉轴换行后的行间距(align-content)仅在多行时生效,且无法控制单行内各子项的垂直位置 - 子项高度不一致时,
flex-wrap换行依赖实际渲染高度计算,第二行首项容易被第一行高卡片“顶下去”,造成视觉错行
二维需求强行用 Flex 会迅速陷入嵌套与 hack 泥潭
一旦需要跨行、等高对齐、固定行列数、响应式列数自适应,你就得靠多层 display: flex 嵌套 + flex-basis + calc() + margin 拼凑,结构脆弱、调试困难。
- 想让某卡片横跨两行?必须额外包一层容器,设
display: flex; flex-direction: column,再手动分配flex: 1—— DOM 层级膨胀,语义丢失 - 侧边栏折叠后主内容撑满?Flex 需 JS 切类名 + 多个
@media控制flex-direction和flex-basis;Grid 只需改一行grid-template-columns: 0fr 1fr -
order属性无法跨容器重排:如果子项被包裹在.column里,它们就和外部兄弟元素不在同一排序上下文中,order对它们无效
Grid 的二维原生能力让同类问题变得直白
Grid 提供行列坐标系:grid-row、grid-column、grid-area 是直接定位指令,不依赖嵌套或高度计算。
-
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr))一行搞定响应式列数,不用写一堆媒体查询 -
grid-column: 2 / span 2; grid-row: 1 / span 2明确声明跨两行两列,无需额外容器 -
grid-template-areas让布局意图一目了然,HTML 结构可保持语义优先,不为视觉妥协 - gap 与子项高度无关,不会因某张卡片内容变高而破坏整行对齐
真正卡住人的往往不是写不出来,而是写出来之后不敢动——改个断点要通读三页 CSS,加个新模块就得重算所有 flex-basis 和 min-width。一维问题用 Flex,二维问题交给 Grid,不是非此即彼,而是各司其职。混用时最容易忽略的是:Grid 容器里的子项再设 display: flex 是合理分层,但反过来,在 Flex 容器里给子项加 grid-column 就是无效代码,浏览器直接忽略。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











