CSS Flex 与 Grid:谁才是布局之王?

23 阅读3分钟

CSS Flex 与 Grid:谁才是布局之王?

在现代前端开发中,Flexbox 和 Grid 是两大最强布局工具。很多开发者在选择时感到困惑:到底该用哪个?本文带你彻底搞清楚两者的区别,以及各自最适合的场景。


一、核心理念不同

Flexbox(弹性盒) 是一维布局模型,它一次只处理一个方向——要么横向(行),要么纵向(列)。你可以把它想象成一排弹性橡皮筋,元素可以伸缩、对齐,但本质上是线性的。

Grid(网格) 是二维布局模型,同时控制行和列。你可以把它想象成一张表格,但比表格强大得多——元素可以跨行、跨列,整体布局一目了然。

/* Flexbox:一维,沿主轴排列 */
.flex-container {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

/* Grid:二维,同时定义行列 */
.grid-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: auto;
  gap: 16px;
}

二、核心区别对比

对比项FlexboxGrid
维度一维(行或列)二维(行+列)
控制方向由内容决定由布局决定
对齐能力强(主轴+交叉轴)更强(行+列双向)
元素跨越不支持跨行/列支持 span 跨行列
间距控制gap(现代)/ margingap(精准)
浏览器支持极好极好(IE11部分支持)
上手难度

三、Flexbox 最擅长的场景

Flex 更适合组件内部的微观布局,比如:

1. 导航栏

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

2. 按钮组 / 标签组

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

3. 垂直居中(经典场景)

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

4. 卡片内容排列

.card {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

四、Grid 最擅长的场景

Grid 更适合页面整体的宏观布局,比如:

1. 整体页面结构

.page {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
  grid-template-columns: 240px 1fr;
  grid-template-rows: 60px 1fr 40px;
  min-height: 100vh;
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

2. 图片瀑布流 / 画廊

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

3. 不规则元素跨行列

.featured {
  grid-column: span 2;
  grid-row: span 2;
}

五、谁的功能更强?

客观来说,Grid 功能更强大。

原因如下:

  1. Grid 是 Flex 的超集:几乎所有 Flex 能做的,Grid 都能做;但 Grid 能做的,Flex 做不到。
  2. 二维控制:Grid 同时掌控行和列,Flex 只能管一个方向。
  3. 更精准的定位:Grid 可以精确指定元素放在第几行第几列,甚至跨越多行多列。
  4. 布局意图更清晰:Grid 布局代码直接描述整体结构,可读性更好。

但这不意味着你应该抛弃 Flex。强大不等于适合


六、正确的使用姿势

Grid 管大局,Flex 管细节

在实际项目中,两者经常配合使用:

/* Grid 定义页面骨架 */
.layout {
  display: grid;
  grid-template-columns: 260px 1fr;
  gap: 24px;
}

/* Flex 处理组件内部排列 */
.card-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

一个简单的判断标准:

  • 需要同时控制行和列?→ 用 Grid
  • 只需要单方向排列内容?→ 用 Flex
  • 整体页面布局?→ Grid
  • 组件内部对齐?→ Flex

总结

FlexboxGrid
适合组件级、单维度、内容驱动页面级、双维度、布局驱动
一句话让内容自适应流动先定好格子再填内容
功能强度⭐⭐⭐⭐⭐⭐⭐⭐⭐

Flex 和 Grid 不是竞争关系,而是互补关系。掌握两者,才能在面对任何布局需求时游刃有余。

如果只能选一个入门,先学 Flex,因为它更直觉、上手快;等你对布局有了感觉,再深入 Grid,你会发现一个全新的世界。


如果这篇文章对你有帮助,欢迎点赞收藏~