弹性盒子又称为 Flexbox,然而我更喜欢 flex 的叫法。

flex 弹性盒子和 grid 网格布局作为前端开发中两把利器,它们的分界线没那么明显,虽然按照 MDN 的说法 flex 多用于一维布局(行/列),grid 多用于二维布局(行列网格),但实际开发中用多个一维布局也能拼凑出一个完整的二维布局。

grid 主要用来简化 html 结构,在一些二维布局的场景下,使用 flex 时需要更复杂的 html 结构支撑,而使用 grid 则可以尽可能的简化 html 结构。

我的理解 flex 擅长细节上的雕琢,而 grid 更擅长宏观上的调控。

flex 的应用场景

下面细说 flex 的应用场景,及同时使用 grid 会怎样实现。

网页导航

随处可见的网页导航布局,看图:

使用 flex 实现可以是这样的代码结构:

<div class="nav">
<div class="item">首页</div>
<div class="item">新闻</div>
<div class="item">产品</div>
<div class="item">联系我们</div>
<div class="item">公司简介</div>
<div class="item">关于我们</div>
</div>
<style>
.nav {
width: 100%;
display: flex;
}
.nav .item {
margin-right: 40px;
}
</style>

使用 grid 实现的代码结构:

<div class="nav">
<div class="item">首页</div>
<div class="item">新闻</div>
<div class="item">产品</div>
<div class="item">联系我们</div>
<div class="item">公司简介</div>
<div class="item">关于我们</div>
</div>
<style>
.nav {
width: 100%;
display: grid;
grid-auto-flow: column; /* 按列排列 */
grid-auto-columns: max-content; /* 新增列的宽度由内容决定 */
}
.nav .item {
margin-right: 40px;
}
</style>

可以看到,在处理一维布局时候,flex 可以说是得心应手,grid 则需要多写一些代码。

flex 的代码长得小清新一样,而 grid 总感觉有点长歪了~

常见的左右布局

再看这种常见的栏目标题布局:

使用 flex 实现:

<div class="modules">
<div class="title">
<h3 class="name">栏目标题</h3>
<a href="javascript" class="more">更多 ></a>
</div>
<code class="code">
</code>
</div>
<style>
.modules {
border: 2px solid rgba(255, 71, 87,0.3);
border-radius: 8px;
width: 300px;
height: 300px;
}
.modules .title {
padding: 0 12px;
display: flex;
justify-content: space-between; /* 左右两端对齐 */
align-items: center; /* 上下垂直居中 */
}
</style>

使用 grid 实现:

<div class="modules">
<div class="title">
<h3 class="name">栏目标题</h3>
<a href="javascript" class="more">更多 ></a>
</div>
<code class="code">
</code>
</div>
<style>
.modules {
border: 2px solid rgba(255, 71, 87,0.3);
border-radius: 8px;
width: 300px;
height: 300px;
}
.modules .title {
padding: 0 12px;
display: grid;
grid-auto-flow: column; /* 按列排列 */
justify-content: space-between; /* 左右两端对齐 */
align-items: center; /* 上下垂直居中 */
}
</style>

对比下来,使用 grid 的代码还是多了一行 grid-auto-flow: column;,小清新的 flex 还是要苗条一点~

常见的左左右布局

以百度首页的热搜导航为例:

使用 flex 实现:

以下示例代码巧用了 margin-left: auto; 让元素跑到右侧位置。

<div class="nav">
<div class="item">我的关注</div>
<div class="item">百度热搜</div>
<div class="change">换一换</div>
</div>
<style>
.nav {
width: 650px;
display: flex;
}
.nav .item {
margin-right: 24px;
}
.nav .change {
margin-left: auto; /* 巧用 auto */
}
</style>

使用 grid 实现:

<div class="nav">
<div class="item">我的关注</div>
<div class="item">百度热搜</div>
<div class="change">换一换</div>
</div>
<style>
.nav {
width: 650px;
display: grid;
grid-template-columns: max-content max-content 1fr; /* 三列网格,最后一列占用剩余空间 */
}
.nav .item {
margin-right: 24px;
}
.nav .change {
justify-self: flex-end;
}
</style>

对比下来,还是 flex 布局更显得小清新一点。

一维布局 flex 与 grid 对比

对比了几种常见的一维列布局,使用 flex 比使用 grid 代码要简洁一点,虽然都能达到想要的效果,当然是代码越少越好了。

gird 应用场景

看完了一维布局的几个应用场景,再看看 grid 的应用场景。

经典的网页分区

页面的整体框架结构无外乎那几种,我们看一种最常见的管理平台的页面分区:

使用 grid 实现:

<div class="layout">
<div class="header">Header</div>
<div class="aside">Aside</div>
<div class="main">Main</div>
<div class="footer">Footer</div>
</div>
<style>
.layout {
width: 900px;
height: 270px;
display: grid;
grid-template-areas:
"aside header"
"aside main"
"aside footer";
grid-template-columns: 200px 1fr;
grid-template-rows: 60px 1fr 60px;
}
.header {
grid-area: header;
background-color: rgb(198, 226, 255);
}
.aside {
grid-area: aside;
background-color: rgb(217, 236, 255);
}
.main {
grid-area: main;
background-color: rgb(236, 245, 255);
}
.footer {
grid-area: footer;
background-color: rgb(198, 226, 255);
}
</style>

使用 flex 实现:

<div class="layout">
<div class="header">Header</div>
<div class="right-container">
<div class="aside">Aside</div>
<div class="main">Main</div>
<div class="footer">Footer</div>
</div>
</div>
<style>
.layout {
width: 900px;
height: 270px;
display: flex;
}
.header {
flex: 0 0 200px;
background-color: rgb(198, 226, 255);
}
.right-container {
flex: 1;
display: flex;
flex-direction: column;
}
.aside {
flex: 0 0 60px;
background-color: rgb(217, 236, 255);
}
.main {
flex: 1;
background-color: rgb(236, 245, 255);
}
.footer {
flex: 0 0 60px;
background-color: rgb(198, 226, 255);
}
</style>

可以看到虽然 flex 也实现了一样的页面分区效果,但 HTML 的结构确要比 grid 更加复杂,需要嵌套更多的 HTML 结构用来实现复杂的二维布局。

卡片列表

看一种最常见的卡片列表布局:

使用 grid 实现:

<div class="list">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
</div>
<style>
.list {
width: 600px;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.item {
height: 200px;
background-color: rgba(255, 71, 87,0.3);
}
</style>

使用 flex 实现:

<div class="list">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
</div>
<style>
.list {
width: 600px;
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.item {
flex: 0 0 193px; /* 这儿必须明确指定宽度 (600px - 10px * 2) / 3 = 193px */
height: 200px;
background-color: rgba(255, 71, 87,0.3);
}
</style>

flex 实现的卡片列表必须明确指定一个宽度,这个宽度值需要减去列间距得出;而 grid 实现的这种卡片列表则无需考虑这种计算问题,直接会自动适应。

二维布局 flex 与 grid 对比

在二维布局领域,grid 当之无愧的强大,虽然 flex 也可以实现一毛一样的效果,当不可避免的是代码冗余。

总结

flex 在一维布局中更能发挥优势,grid 在宏观布局或二维布局中优势更加明显。

在不考虑代码冗余的情况下,flex 和 grid 都能在对方领域抢饭碗。

实际开发中,grid 标准浏览器都是在 2017 年之后才实现的,flex 标准则是在 2012 年就开始支持,项目但凡需要兼容老古董浏览器,grid就别想了,赖克宝吃不到小天鹅~~

Web前端入门第 38 问:CSS flex 弹性盒子与 grid 网格布局区别及应用场景的更多相关文章

  1. 轻松上手CSS Grid网格布局

    今天刚好要做一个好多div格子错落组成的布局,不是田字格,不是九宫格,12个格子这样子,看起来有点复杂.关键的是笔者有点懒,要写那么多div和css真是不想下手啊.多看了两眼,这布局不跟网格挺像吗?c ...

  2. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  3. Android零基础入门第38节:初识Adapter

    原文:Android零基础入门第38节:初识Adapter 在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter. 一.了解MVC模式 在开始 ...

  4. 好程序员web前端分享18个用CSS制作出来的东西

    好程序员web前端分享18个用CSS制作出来的东西,与流行的看法相反,CSS不仅仅是用来提供一个WEB页面的基本风格,以使它看起来更有吸引力.还有很多其他的事情,CSS也可以做的很好.由于它创建动画和 ...

  5. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

    好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...

  6. 进击的Python【第十三章】:Web前端基础之HTML与CSS样式

    进击的Python[第十四章]:Web前端基础之HTML与CSS样式 一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客 ...

  7. 87.CSS Flex 弹性盒模型布局教程(共用的css在48篇文章gird)

    CSS Flex 弹性盒模型布局教程 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. flex布局就是给任何一个容器添加 dis ...

  8. CSS Grid网格布局全攻略

    CSS Grid网格布局全攻略 所有奇技淫巧都只在方寸之间. 几乎从我们踏入前端开发这个领域开始,就不停地接触不同的布局技术.从常见的浮动到表格布局,再到如今大行其道的flex布局,css布局技术一直 ...

  9. CSS Grid 网格布局全解析

    介绍 CSS Grid(网格) 布局使我们能够比以往任何时候都可以更灵活构建和控制自定义网格. Grid(网格) 布局使我们能够将网页分成具有简单属性的行和列.它还能使我们在不改变任何HTML的情况下 ...

  10. CSS Flexbox 弹性盒子模型

    CSS Flexbox 弹性盒子模型 设置元素样式为 display: flex 或 display: inline-flex, 让元素变成flex容器, 从而可以通过flex模式布局它的子元素. f ...

随机推荐

  1. GIS数据合集:作物、植被数据下载平台整理

      本文对目前主要的作物类型与产量.植被物候与指数数据产品的获取网站加以整理与介绍. 目录 4 植被农业数据 4.1 作物产量数据 4.1.1 SPAM 4.1.2 Aerial Intelligen ...

  2. 从存钱罐到子数组:一个关于累加和的精妙问题|LeetCode 560 和为K的子数组

    LeetCode 560 和为K的子数组 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有这样的经历:每天往存钱罐里存一些零钱,某一天突 ...

  3. Java代码覆盖率工具之Jacoco

    Java代码覆盖率工具之Jacoco JaCoCo(Java Code Coverage)是一款面向Java语言的开源代码覆盖率工具,以其小型化和轻量化著称.它能够提供代码在测试过程中的覆盖率信息,帮 ...

  4. NSSM:简化Windows服务配置,提升系统维护效率

    NSSM:简化Windows服务配置,提升系统维护效率 在Windows系统环境中,服务的配置与管理是一项复杂而重要的任务.传统的服务管理方式往往涉及繁琐的步骤,不仅效率低下,还容易出错.然而,随着N ...

  5. Q:su命令无法切换用户问题,密码正确可登录

    一.文件权限问题 查看文件权限: ll -a /bin/su /usr/bin/passwd 正确的结果为: 错误的结果为: suid和普通x执行权限 s:当普通用户使用su的时候,采用的是owner ...

  6. vue-element-template实现顶部菜单栏

    一.框架侧边栏改为顶部导航栏 1.复制src/layout/componets/Sidebar所有文件至同级目录,改名为Headbar 2.src/layout/components/index.js ...

  7. P9869 [NOIP2023] 三值逻辑 题解

    NOIP2023 T2 三值逻辑 题解 题面 思路 乍一看好像很并查集,而且不太难,但是, 注意到:按顺序运行这 \(m\) 条语句 事情并没有那么简单. 比如说如下情况: x1:=T x2:=x1 ...

  8. CAD内核的奥秘 | 工业软件发展史 (转)

    CAD内核的奥秘 | 工业软件发展史 (声明:此文非本人原著,仅供交流,如果侵犯到原作者权利,立即删除) 如果一个产业要寻根,就会发现一个万千世界,最后会聚焦到一个点上. "一沙一世界&qu ...

  9. C语言编程技巧 全局变量在多个c文件中公用的方法

    在使用C语言编写程序时,经常会遇到这样的情况:我们希望在头文件中定义一个全局变量,并将其包含在两个不同的C文件中,以便这个全局变量可以在这两个文件中共享.举个例子,假设项目文件夹"proje ...

  10. 关于JS框架的一点想法

    读了几页<vue.js设计与实现>,记录几点想法: 1.Html是根本 2.无论哪个框架,不管是运行时框架,还是编译时框架,最终都要通过标签"绘制"页面 3.这个&qu ...