Flex vs Grid:常见布局场景怎么选(附决策清单)

一篇讲清 Flex 与 Grid 的实战选择:按一维/二维、内容驱动/区域驱动、组件/页面级布局来判断,并给出常见场景模板、组合写法与上线前检查清单。

23 分钟阅读
CSS
Flex vs Grid:常见布局场景怎么选(附决策清单)

很多人会把 Flex 和 Grid 当成“二选一”,其实更准确的做法是:

  • 组件级排布优先考虑 Flex
  • 页面级网格优先考虑 Grid
  • 一个页面里同时使用两者是常态

这篇文章给你一套可执行判断法,帮你在真实项目里快速决定“这里用 Flex 还是 Grid”。

先记一个核心原则:一维用 Flex,二维用 Grid

  • Flex(1D):主轴方向排布(横向或纵向)
  • Grid(2D):同时控制行和列

当你的需求是“这排卡片怎么对齐/分布”,Flex 往往更省心。 当你的需求是“这整页分几列几行、不同区块怎么占位”,Grid 更自然。

6 个常见场景怎么选

1)导航栏(Logo + 菜单 + 按钮)

优先用 Flex

原因:元素在一条主轴上,通常是左右分布与垂直居中。

.header {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

2)按钮组 / 标签组

优先用 Flex

原因:内容长度变化大,Flex 对内容驱动布局更友好。

3)卡片列表(两列/三列/四列)

优先用 Grid

原因:需要稳定列数和统一间距,Grid 更直接。

.cards {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 16px;
}

4)后台页面骨架(侧栏 + 主区 + 右侧信息)

优先用 Grid

原因:这是典型页面级二维布局,区域关系明确。

5)表单行(标签 + 输入框 + 提示)

小范围用 Flex,复杂表单区块可用 Grid

原因:单行排布是一维;当你要统一多行字段的列宽时,Grid 更合适。

6)营销落地页模块(Hero、卖点、FAQ、Footer)

推荐组合:

  • 页面框架:Grid(控制大区块)
  • 模块内部:Flex(按钮、图文排列)

决策清单(30 秒判断)

你可以按这 5 个问题快速判断:

  1. 我只需要沿一个方向排吗?→ 是:Flex
  2. 我需要同时控制行和列吗?→ 是:Grid
  3. 布局由内容长度决定吗?→ 常见是:Flex
  4. 布局由页面区域决定吗?→ 常见是:Grid
  5. 我需要“卡片自动换列”吗?→ Grid 通常更稳

组合写法示例(真实项目最常见)

.page {
  display: grid;
  grid-template-columns: 240px minmax(0, 1fr);
  min-height: 100vh;
}

.main-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.feature-list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 20px;
}

.cta-row {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}

这段代码的思路是:外层定结构(Grid),内层做编排(Flex)

常见误区

误区 1:一个项目只能用 Flex 或 Grid 其一

错误。两者是互补关系,不是替代关系。

误区 2:所有布局都用 Flex,靠 width/margin 硬凑

短期能跑,后期维护成本会很高;卡片列表与页面骨架更适合 Grid。

误区 3:Grid 很强,所以按钮组也用 Grid

技术上可以,但表达成本更高。按钮组、导航这类一维问题,Flex 更直观。

上线前检查清单

  • 页面级区域是否使用了 Grid 来表达结构关系
  • 模块级一维编排是否使用 Flex 简化实现
  • gap 是否统一,避免 margin 叠加造成不可控间距
  • 移动端下是否验证了换行与列数变化
  • 关键组件(导航、卡片、CTA)是否在 3 个常见宽度下可读可点

FAQ

Q1:我做的是简单官网,需要学 Grid 吗?

需要基础用法。哪怕只用到 repeat() + gap,也能让卡片区与页面骨架更稳定。

Q2:Flex 能不能做两维布局?

可以“勉强做”,但当你要同时控制行列关系时会变复杂。两维问题优先 Grid。

相关阅读