ToolHub
View All Posts

CSS Flexbox 与 Grid:何时使用哪种布局

CSS Flexbox 和 CSS Grid 是现代 CSS 中最强大的两个布局系统。虽然它们有时可以产生相似的结果,但它们是针对不同问题设计的根本不同的工具。为每种情况选择正确的布局方式使你的 CSS 更清晰、更易维护、更可预测。本指南提供了详细的比较和实用的代码示例,让你能够自信地做出布局决策。

什么是 CSS Flexbox?

CSS 弹性盒布局,通常称为 Flexbox,是一种一维布局模型。它擅长沿单个轴(水平行或垂直列)分配空间。Flexbox 使容器内的项目能够弹性伸缩、增长、收缩和基于可用空间自行对齐。

Flexbox 旨在解决传统 CSS 中出了名困难的常见布局问题:垂直居中元素、在兄弟元素之间均匀分配空间以及在不更改 HTML 的情况下重新排序内容。在 Flexbox 出现之前,开发者依赖浮动、inline-block 技巧和表格布局来实现这些效果。

Flexbox 核心概念

Flexbox 示例:导航栏

.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 24px;
  height: 64px;
}

.navbar__logo {
  flex-shrink: 0;
}

.navbar__links {
  display: flex;
  gap: 16px;
  list-style: none;
}

此导航栏使用 Flexbox 通过 justify-content: space-between 将 logo 推到左侧,链接推到右侧。项目通过 align-items: center 垂直居中。这是一个经典的一维布局,Flexbox 是自然选择。

什么是 CSS Grid?

CSS Grid 布局是一种二维布局系统。它同时处理行和列,让你精确控制网格结构中元素的位置和大小。Grid 让你定义显式轨道、区域和放置规则,用最少的代码创建复杂布局。

Grid 专为页面级布局和复杂组件结构而设计,在这些场景中你需要控制两个维度。它引入了命名网格区域、auto-fill 和 auto-fit 以及显式行列尺寸等概念,使以前不可能的布局变得简单直接。

Grid 核心概念

Grid 示例:页面布局

.page {
  display: grid;
  grid-template-columns: 250px 1fr;
  grid-template-rows: 64px 1fr 48px;
  grid-template-areas:
    "header  header"
    "sidebar content"
    "footer  footer";
  min-height: 100vh;
}

.page__header  { grid-area: header; }
.page__sidebar { grid-area: sidebar; }
.page__content { grid-area: content; }
.page__footer  { grid-area: footer; }

此页面布局使用命名网格区域创建经典的侧边栏布局。页眉和页脚跨越两列,而侧边栏和内容并排放置。这种二维结构正是 Grid 真正出彩的地方。

Flexbox 与 Grid:并排对比

特性FlexboxGrid
维度一维(行或列)二维(行和列)
内容驱动是,项目决定布局否,先定义布局结构
对齐主轴 + 交叉轴块轴 + 行内轴
Gap 支持是(gap 属性)是(gap 属性)
项目放置顺序(源码顺序)显式(任意网格位置)
重叠不直接支持通过网格放置支持
响应式使用 flex-wrap使用 auto-fit/auto-fill
最佳用途导航、工具栏、卡片内容页面布局、画廊、仪表盘

何时使用 Flexbox

当你的布局问题主要是一维的时候,Flexbox 是正确的选择。以下是最常见的场景:

1. 导航栏和菜单

导航本质上是一行(或一列)项目。Flexbox 在项目之间分配空间,优雅地处理溢出,并使项目垂直对齐变得简单。gap 属性替代了旧的基于 margin 的菜单项间距。

2. 居中内容

.centered {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

这个三行居中解决方案是最受喜爱的 Flexbox 模式之一。在 Flexbox 出现之前,垂直居中需要涉及 table-cell、绝对定位加 transform 或 line-height 技巧的 hack。Flexbox 使其变得毫不费力。

3. 卡片内容对齐

当卡片有标题、描述和操作按钮,且你希望按钮始终固定在底部而不管内容长度时,Flexbox 可以优雅地处理:

.card {
  display: flex;
  flex-direction: column;
}

.card__content {
  flex: 1;
}

内容区域上的 flex: 1 使其增长以填充可用空间,将按钮推到卡片底部。无论卡片包含多少文本都有效。

4. 表单行布局

需要在一行中排列并可调整大小的表单元素,如搜索输入框和提交按钮,非常适合 Flexbox。输入框可以增长以填充可用空间,而按钮保持其自然大小。

5. 媒体对象

经典的媒体对象模式(左侧图片,右侧文本)是 Flexbox 的自然匹配。图片保持其自然宽度,而文本填充剩余空间。

何时使用 CSS Grid

当你的布局需要同时控制行和列,或者需要在定义的结构中精确放置项目时,Grid 是正确的选择。

1. 整页布局

带有页眉、侧边栏、内容区域和页脚的页面级布局是典型的 Grid 用例。命名网格区域使布局可读且可维护:

.layout {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-areas:
    "header"
    "content"
    "sidebar"
    "footer";
}

@media (min-width: 768px) {
  .layout {
    grid-template-columns: 1fr 300px;
    grid-template-areas:
      "header  header"
      "content sidebar"
      "footer  footer";
  }
}

注意响应式断点如何简单地重新定义网格模板。项目保持分配给它们的网格区域,布局自动重构。这比在不同断点处重新排列 Flexbox 容器要干净得多。

2. 卡片网格和画廊

.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 24px;
}

这个单一声明创建了一个响应式卡片网格,根据可用宽度自动调整列数。每张卡片至少 280px 宽但会增长以填充剩余空间。无需媒体查询。这种带 minmax 的 auto-fill 模式是最强大的 Grid 技术之一。

3. 仪表盘布局

具有不同大小、跨越多行多列的小部件仪表盘非常适合 Grid。你可以将项目放置在特定的网格位置并跨越轨道:

.dashboard {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: minmax(200px, auto);
  gap: 16px;
}

.widget--wide { grid-column: span 2; }
.widget--tall { grid-row: span 2; }
.widget--hero { grid-column: span 2; grid-row: span 2; }

4. 杂志和编辑布局

当内容需要重叠或放置在非顺序位置时,Grid 是唯一原生支持此功能的 CSS 布局系统。你可以将项目放置在特定的网格线上,创建无需绝对定位的重叠组合。

5. 圣杯布局

著名的「圣杯」布局(页眉、三列主体带固定宽度侧边栏和弹性中心、页脚)用 Grid 实现轻而易举:

.holy-grail {
  display: grid;
  grid-template-columns: 200px 1fr 200px;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
}

结合 Flexbox 和 Grid

最有效的方法不是在 Flexbox 和 Grid 之间选择,而是策略性地组合它们。一种常见且推荐的模式是使用 Grid 处理宏观布局(页面结构),Flexbox 处理微观布局(组件内部)。

示例:使用 Grid 和 Flexbox 的仪表盘

/* Grid for the page structure */
.dashboard {
  display: grid;
  grid-template-columns: 250px 1fr;
  grid-template-rows: 64px 1fr;
  grid-template-areas:
    "sidebar header"
    "sidebar main";
  min-height: 100vh;
}

/* Flexbox for the header content */
.dashboard__header {
  grid-area: header;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 24px;
}

/* Flexbox for sidebar menu items */
.dashboard__nav {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

在这个示例中,Grid 定义了整体页面结构,而 Flexbox 处理每个部分内的对齐。这种关注点分离使你的 CSS 有条理且目的明确。

响应式设计模式

Flexbox 响应式模式:换行

.tag-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.tag {
  flex-shrink: 0;
}

Flexbox 换行非常适合标签列表、芯片组和任何在水平空间不足时自然流向下一行的项目集合。每个项目保持其自然大小。

Grid 响应式模式:自动填充

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 24px;
}

Grid auto-fill 创建了无需任何媒体查询的真正响应式网格。列数根据容器宽度自动调整,每列至少 300px。这比 Flexbox 换行更强大,因为项目会拉伸以均匀填充行。

Grid 响应式模式:堆叠

.layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: 24px;
}

@media (min-width: 768px) {
  .layout {
    grid-template-columns: 1fr 1fr;
  }
}

@media (min-width: 1024px) {
  .layout {
    grid-template-columns: 1fr 1fr 1fr;
  }
}

常见错误及避免方法

浏览器支持

Flexbox 和 Grid 在 2026 年都享有出色的浏览器支持:

浏览器Flexbox 支持Grid 支持
Chrome完全支持(自 v29)完全支持(自 v57)
Firefox完全支持(自 v28)完全支持(自 v52)
Safari完全支持(自 v9)完全支持(自 v10.1)
Edge完全支持(自 v12)完全支持(自 v16)
iOS Safari完全支持(自 v9)完全支持(自 v10.3)
Samsung Internet完全支持(自 v1.5)完全支持(自 v6.2)

这两种技术在所有主要浏览器中已有多年完全支持。在现代 Web 开发中没有理由因兼容性问题而避免使用任何一种。Flexbox 中的 gap 属性是最后一个获得通用支持的主要功能,自 2021 年起已在所有浏览器中可用。

快速决策指南

当你开始一个新布局时,问自己这些问题:

经验法则:Flexbox 用于组件,Grid 用于页面。如果你可以沿一个方向画一条线并且合理,就用 Flexbox。如果需要两个方向的线,就用 Grid。

正在使用 CSS?试试我们免费的 CSS 压缩器和格式化工具来优化你的样式表。

压缩 CSS格式化 CSS

常见问题

应该使用 Flexbox 还是 Grid?

Flexbox 用于一维布局(行或列),项目需要弹性伸缩和动态分配空间。Grid 用于二维布局,需要同时控制行和列。许多布局受益于两者结合:Grid 用于整体页面结构,Flexbox 用于组件级对齐。

可以同时使用 Flexbox 和 Grid 吗?

是的,Flexbox 和 Grid 可以完美配合使用,这也是推荐的方法。Grid 用于宏观布局(页面区域、卡片网格),Flexbox 用于微观布局(导航项、按钮组、卡片内容对齐)。它们是互补的而非竞争关系。

CSS Grid 比 Flexbox 更好吗?

两者都不是普遍更好。Grid 擅长具有精确行列控制的二维布局,而 Flexbox 在一维内容分配和对齐方面更优越。Grid 给你更明确的放置控制;Flexbox 对动态内容更灵活。根据你的布局需求选择。

CSS Grid 在所有浏览器中都受支持吗?

CSS Grid 在所有现代浏览器中受支持,包括 Chrome、Firefox、Safari 和 Edge。自 2017 年以来支持已是通用的。Internet Explorer 11 有使用 -ms- 前缀的部分实现,但微软已不再支持 IE。对于现代 Web 开发,Grid 有完整的浏览器支持。

什么时候应该避免使用 CSS Grid?

对于 Flexbox 更简单更合适的简单单向布局应避免使用 Grid,如居中单个元素、在一行中对齐导航项或在几个兄弟元素之间分配空间。当内容大小应该决定布局而非网格结构决定内容放置时,也应避免使用 Grid。

ToolHub's collection of 300+ free online tools including CSS grid generators, flexbox tools, and more — no sign-up required.