Flex 不适合二维布局,因其缺乏行列统一控制、跨行跨列、自动响应式列数等能力;Grid 才是实现真正二维结构的唯一合理选择,二者应按外层区域划分用 Grid、内层线性排列用 Flex 来分工。

不适合。Flex 是一维布局模型,强行用它实现二维结构(比如多行多列对齐、跨行列、行列比例控制)会陷入嵌套、计算、断点维护的泥潭,代码脆弱且不可扩展。
Flex 换行 flex-wrap: wrap 不等于二维控制
很多人误以为只要加了 flex-wrap: wrap,Flex 就能当 Grid 用。其实它只是“溢出换行”,不是“规划网格”:
- 每行是独立的 Flex 容器,
align-items只作用于当前行,无法让第1行第1个元素和第2行第1个元素在列方向对齐 - 你不能统一设置“所有行高度为
1fr”,也不能让某个元素横跨两行——grid-row: 1 / span 2这种能力 Flex 根本没有 - 列宽必须手动算:
width: calc(100% / 3 - gap)或用flex: 0 0 calc(...),响应式时得配合一堆@media
Grid 才是真正二维结构的唯一合理选择
当你需要明确的行列关系,比如页头+侧边栏+主内容+页脚,或图片墙每行高度一致、卡片跨列、区域语义化命名,display: grid 是唯一干净解法:
-
grid-template-areas直接定义视觉结构,HTML 不用为布局顺序妥协 -
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr))一行搞定响应式列数,不用写多个断点 -
grid-column: 2 / span 1和grid-row: 1 / span 2组合,精准控制跨格,Flex 做不到 - 侧边栏折叠动画用
grid-template-columns: 0fr 1fr+transition,比width+overflow更稳定
Flex 和 Grid 的分工边界很清晰
别试图让 Flex 扛起整个页面骨架,也别用 Grid 去微调按钮内图标+文字的对齐——职责错位是多数布局翻车的根源:
立即学习“前端免费学习笔记(深入)”;
- 用
display: grid划分外层区域(header / main / sidebar / footer) - 在每个区域内部,用
display: flex处理线性排列(如导航菜单、卡片内标题+描述+按钮堆叠) - 如果某块内部还要再分网格(比如表单字段排两列),那它自己再套一层
display: grid,不是往上堆 Flex
真正容易被忽略的是:Grid 的二维性不是“能换行”就算,而是“能同时声明并约束行列轨道”。一旦你发现自己在 Flex 里反复调试 flex-basis、硬塞 min-width、为每行加 wrapper、或者写三段 media query 才让列数变化——说明你已经该切到 Grid 了。


















