这个问题我被问过很多次,我自己也在项目里反复纠结过。其实不复杂,但需要先理解它们各自解决的是什么问题。

一句话区别

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 做组件内部的排列。这样想就不会选错了。