这个问题我被问过很多次,我自己也在项目里反复纠结过。其实不复杂,但需要先理解它们各自解决的是什么问题。
一句话区别
Flexbox 是一维布局——你在一条轴上(横或竖)排列元素。
Grid 是二维布局——你同时控制行和列。
如果你在想"这些元素怎么在一行里排列",用 Flexbox。如果你在想"这个页面怎么分区",用 Grid。
什么时候用 Flexbox
- 导航栏里的图标和链接水平排列
- 按钮组、标签组这类一行内的元素
- 垂直居中一个元素(
align-items: center) - 让某个元素占据剩余空间(
flex: 1)
什么时候用 Grid
- 整个页面的大框架(header / sidebar / main / footer)
- 卡片网格,要求行列对齐
- 复杂的响应式布局
- 需要元素跨越多行多列
我常犯的错误
用 Flexbox 做网格布局。结果每行的卡片高度不一致,或者最后一行对不齐。Grid 的 grid-template-columns: repeat(3, 1fr) 一行搞定,Flexbox 要绕很多弯子。
反过来,用 Grid 做一个简单的水平导航栏,然后发现 Grid 对"让元素自动扩展填充"的处理没有 flex: 1 直观。
结论
两者不是竞争关系,经常同时用。Grid 做大布局,Flexbox 做组件内部的排列。这样想就不会选错了。