发布于 2026-01-05 7 阅读
0

何时使用 Flexbox,何时使用 CSS grid?DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

何时使用 Flexbox,何时使用 CSS Grid

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

作者:莱昂纳多·马尔多纳多✏️

内容的呈现方式能够体现您或您公司的很多信息。拥有优质的内容,并懂得如何以简洁易懂的方式恰当地展示内容,让用户轻松理解,这一点至关重要。

那么,我们如何选择内容的展示方式呢?美观得体的展示方式取决于我们的CSS代码。

CSS一直是Web开发中最重要的组成部分之一,自浏览器诞生以来,我们就一直在不断构建和改进它的各种使用方式。几年前,创建网页布局是一项非常艰巨的任务。我们当时使用一些CSS属性,例如`<div>`、`<span>`和` <div> float`来定位大量元素position,以及`<div>`和`<div>`等CSS属性。

现在,我们不再依赖这些属性来创建网页,创建不同的网页体验变得越来越容易。Web 的发展已经到了一个阶段,我们现在可以使用两种 CSS 布局系统:FlexboxCSS Grid

尽早考虑哪种布局系统最适合你的项目,确实有助于你获得更好的效果和编写出高质量的 CSS 代码。在本文中,我们将探讨何时使用 Flexbox,何时使用 CSS Grid。这虽然不是一个很难回答的问题,但它可以为你节省未来的维护和重构时间。

首先,我们需要了解它们的用途以及它们在底层是如何工作的,让我们从 Flexbox 开始。

LogRocket 免费试用横幅

Flexbox

Flexbox于 2009 年作为一种新的布局系统推出,旨在帮助我们构建响应式网页并轻松组织元素。自那时起,它便获得了越来越多的关注。如今,它已成为现代网页的主要布局系统。

Flexbox 是一种一维布局系统,我们可以用它来创建行或列轴布局。它让我们能够更轻松地设计和构建响应式网页,而无需使用复杂的技巧以及在 CSS 代码中大量使用浮动和定位属性。

要开始使用 Flexbox,您只需使用display: flex属性创建一个 flex 容器。之后,该 flex 容器内的每个元素都会变成一个 flex 项。

我们的弹性项目在弹性容器中的主要方向是成行排列。

我们的弹性项目在弹性容器中的主要方向是一行

我们可以通过向弹性容器传递一个属性,轻松地将弹性容器中的弹性项目的方向更改为列方向flex-direction: column

列中的弹性容器

Flexbox 还有许多其他属性,我们可以利用它们来创建很棒的效果。我们可以按所需方式排列元素,可以反转元素的顺序,可以决定元素是放大还是缩小等等。

例如,假设我们有一个div元素,该元素内部div有三个宽度和高度相同的子元素:

<div id="container">
  <div id="one">1</div>
  <div id="two">2</div>
  <div id="three">3</div>
</div>
Enter fullscreen mode Exit fullscreen mode

在我们的 CSS 中,我们使用 Flexbox 来对元素进行排序和对齐:

#container {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-evenly;
  padding: 10px;
}

#one,
#two, 
#three {
  width: 200px;
  height: 100%;
  background: red;
}
Enter fullscreen mode Exit fullscreen mode

我们可以使用属性轻松地反转元素的顺序order。如果我们想改变元素的顺序,可以这样做:idtwo

#two {
  order: 3;
}
Enter fullscreen mode Exit fullscreen mode

现在,我们的元素是 Flexbox 容器中的最后一个元素。这些是 Flexbox 为我们引入的一些特性,它们对于元素的样式和对齐方式非常有用。

既然我们知道 Flexbox 是一个一维布局系统,那么让我们简要了解一下 CSS 网格的工作原理以及这些布局系统之间的区别。

CSS网格

如果说 Flexbox 是一个强大的布局系统,因为它是一个一维系统(意味着我们可以处理行或列),那么 CSS Grid 现在被认为是功能最强大的布局系统。

CSS 网格是一个二维布局系统,我们可以同时使用行和列,这意味着它为构建更复杂、更有条理的设计系统开辟了许多不同的可能性,而无需回到过去使用的某些“权宜之计”。

要定义网格容器,只需将一个display: grid属性传递给块元素即可。现在您已经有了网格,接下来需要定义所需的行数和列数。

要创建行,可以使用该grid-template-rows属性,并传入所需的行数,如下所示:

grid-template-rows: 200px 200px;
Enter fullscreen mode Exit fullscreen mode

创建列的方法几乎相同,我们使用grid-template-columns属性:

grid-template-columns: 200px 200px;
Enter fullscreen mode Exit fullscreen mode

但如果你已经知道如何使用这两种布局系统,你可能会想“我应该使用哪一个?”,接下来我们将探讨这个问题。

既然我们已经了解了它们的工作原理,接下来我们将重点介绍它们之间的区别以及各自的最佳应用场景。

CSS Grid 用于布局,Flexbox 用于对齐

Flexbox刚发布的时候,我们认为它可能是构建网页的最佳布局系统,但事实并非如此。

Flexbox 帮助开发者开始创建更具响应性和可维护性的 Web 应用程序,但当需要构建更复杂的布局设计时,一维布局系统的主要思想就失去了意义。

CSS Grid 的出现确实帮助我们以二维方式构建更复杂的布局设计,它结合了行和列两种布局方式。我们应该尝试将两者结合使用,但用途不同。布局方面,使用 CSS Grid;元素对齐方面,使用 Flexbox。

要掌握 CSS 网格布局,并准确了解何时需要以及如何使用,你应该首先学习基础知识以及 Flexbox 的工作原理,因为当你需要在应用程序中对齐元素时,你将使用 Flexbox。

在以下情况下,您应该考虑使用 Flexbox:

  • 如果您需要实现一个小型设计  ——Flexbox 非常适合这种小型布局设计,例如只有几行或几列的布局。
  • 你需要对齐元素  ——Flexbox 正好能满足这个需求,我们只需要创建一个 flex 容器display: flex,然后定义我们想要的 flex 方向即可。
  • 你需要一个内容优先的设计 ——如果你不知道你的内容最终会是什么样子,Flexbox 是创建网页的理想布局系统;所以,如果你希望所有内容都能恰到好处地融入其中,Flexbox 就是完美的选择。

当然,你完全可以只用 Flexbox 构建整个应用程序,并获得与使用 CSS Grid 相同的效果,这完全没问题。但是,为了获得更好的 CSS 实现方案,打造更简洁、更易维护的应用程序,并完美地创建和适配你的布局,理想的方法是使用 CSS Grid。

CSS 网格系统在以下情况下效果更佳:

  • 你需要实现一个复杂的设计  ——在某些情况下,我们确实需要实现复杂的设计,而这时 CSS Grid 的魔力就显现出来了。这种二维布局系统非常适合创建复杂的设计,我们可以利用它来创建更复杂、更易于维护的网页。
  • 块级元素之间需要留有间距  ——CSS Grid 布局中另一个非常有用的功能(Flexbox 布局没有)就是 gap 属性。我们可以轻松地定义行或列之间的间距,而无需使用 margin 属性,因为 margin 属性在处理大量断点时可能会产生一些副作用。
  • 你需要重叠元素  ——使用 CSS Grid 实现重叠元素非常简单,只需使用 `grid-column` 和 `grid-row` 属性即可轻松实现。另一方面,使用 Flexbox 时,我们仍然需要一些技巧,例如使用 `margin`、`transform` 或绝对定位。
  • 你需要先设计布局 ——当你已经有了布局结构,使用 CSS 网格系统构建就更容易了。二维布局系统在我们能够同时使用行和列,并按照我们想要的方式定位元素时,能给我们带来很大的帮助。

在决定使用哪一个之前,请记住:

CSS Grid 用于布局,Flexbox 用于对齐

这里有一个正确使用 CSS 网格布局的例子。假设我们要构建一个简单的应用程序,应用程序的基本框架如下所示:

正确使用 CSS,包括 header、main、aside 和 footer

我们有页眉、侧边菜单、主要内容区和页脚。要使用 CSS 网格创建此布局,我们只需创建这些元素:

<div id="container">
  <header>Header</header>
  <aside>Aside</aside>
  <main>Main</main>
  <footer>Footer</footer>
</div>
Enter fullscreen mode Exit fullscreen mode

现在,使用以下代码创建网格容器display: grid,然后创建一些行和列,如下所示:

#container {
  width: 100%;
  height: 100vh;
  background: yellow;
  display: grid;
  grid-template-rows: 80px 600px 80px;
  grid-template-columns: 0.5fr 1fr;
}

header {
  grid-column: 1 / 3;
  grid-row: 1 / 2;
  background: blue;
}

aside {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
  background: green;
}

main {
  grid-row: 2 / 3;
  grid-column: 2 / 3;
  background: pink;
}

footer {
  grid-column: 1 / 3;
  grid-row: 3 / 4;
  background: yellow;
}
Enter fullscreen mode Exit fullscreen mode

就是这样。我们仅使用 30 行 CSS 代码就轻松创建了我们的设计,无需使用诸如float定位元素之类的技巧,也无需创建许多弹性容器。

为了给你的应用程序创建一个非常体面且结构良好的网页布局,你能做的最佳决定就是将两者结合起来使用。

让我们以之前的例子为例,结合 CSS Grid 和 Flexbox 来展示这两种布局系统协同工作的强大功能。在我们的示例中header,我们将创建三个div元素,并将它们排列成一行。

为此,我们只需要header使用属性声明一个弹性容器display: flex,使用将弹性方向设置为行flex-direction: row,然后对齐项目即可。

header {
  grid-column: 1 / 3;
  grid-row: 1 / 2;
  background: blue;
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-evenly;
  padding: 10px;
}
Enter fullscreen mode Exit fullscreen mode

这是一个功能强大的网页,使用 CSS 网格进行布局,使用 Flexbox 进行对齐。

对于主要的布局样式,可以使用 CSS Grid,因为它是一个二维布局系统,可以轻松地处理行和列。而对于更简单的布局样式,可以使用 Flexbox,这是一个一维布局系统,非常适合处理行。

结论

在本文中,我们了解了 Flexbox 和 CSS 网格之间的区别,它们在现代浏览器中的工作方式,以及如何使用它们在 CSS 中实现不同的结果。


你的前端是否占用了用户的大量CPU资源?

随着 Web 前端变得越来越复杂,资源消耗型功能也对浏览器提出了越来越高的要求。如果您希望监控和跟踪生产环境中所有用户的客户端 CPU 使用率、内存使用率等信息,不妨试试 LogRocket。

替代文字

LogRocket就像 Web 应用的 DVR,记录 Web 应用或网站中发生的一切。您无需猜测问题原因,即可汇总并报告关键的前端性能指标,重现用户会话和应用状态,记录网络请求,并自动显示所有错误。

革新 Web 应用调试方式——立即开始免费监控。


这篇文章《何时使用 Flexbox,何时使用 CSS grid》最初发表于LogRocket 博客

文章来源:https://dev.to/bnevilleoneill/when-to-use-flexbox-and-when-to-use-css-grid-3imm