刚开始学 CSS 的时候,我总是在 Grid 和 Flexbox 之间纠结。用得多了以后发现,其实判断标准只有一条:你是想控制"行"还是想控制"分布"

一句话区分

  • Flexbox:一维布局。内容决定容器,适合"一排东西怎么排"。
  • Grid:二维布局。容器决定内容,适合"整个页面怎么分块"。

典型场景对照

用 Flexbox 的场景

  • 导航栏:logo 在左,菜单在右
  • 按钮组:一排按钮等间距
  • 卡片内部:图标 + 文字垂直居中对齐
  • 垂直居中:display:flex; align-items:center

用 Grid 的场景

  • 整页布局:header / sidebar / main / footer
  • 卡片墙:响应式自适应列数
  • 表单:标签和输入框对齐成两列

一个常用的响应式卡片墙

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 20px;
}

这四行代码实现了:列宽最小 260px,能放几列放几列,剩余空间平分。不需要写任何媒体查询。这是 Grid 最让我惊艳的地方。

嵌套使用才是常态

实际项目里两者几乎总是嵌套的。典型结构是:外层用 Grid 划分区域,每个区域内部用 Flexbox 排列元素。

.layout {
  display: grid;
  grid-template-columns: 1fr 300px;
  gap: 36px;
}
.header-inner {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

结论

不要问"哪个更好",要问"这一层需要一维还是二维"。想清楚了,选择自然就出来了。