目录
flex-basis
正负自由空间
flex-grow
flex-shrink
flex 的简写值
flex: <positive-number>的应用:
两栏布局
三栏布局
结束语
首页 web前端 css教程 一文详解三个 flex 属性对元素的影响

一文详解三个 flex 属性对元素的影响

Aug 30, 2022 pm 07:50 PM
css flex

一文详解三个 flex 属性对元素的影响

在开发的时候经常用 flex 这个属性作用于弹性盒子的子元素,例如:flex:1或者flex: 1 1 auto,那么这个属性到底控制了元素怎么的行为呢?flex:1又究竟是什么含义呢?让这篇文章带你彻底了解 flex 属性吧!【推荐学习:css视频教程

首先我们需要了解,flex 是三个属性 flex-growflex-shrinkflex-basis的简写,可以使用一个、两个、或者三个值指定 flex 属性。具体语法可以参考MDN-flex

接下来我们逐一拆解这三个属性对元素的影响

flex-basis

flex-basis 定义了空间分配发生之前初始化 flex 子元素的尺寸,属性默认值 auto; flex 子元素未伸张和收缩之前,它的大小是多少。

如果 flex-basis 设置为 auto , 浏览器会先检查 flex 子元素的主尺寸是否设置了 flex 子元素的初始值。

比如说你已经给你的 flex 子元素设置了 150px 的宽,则 150px 就是这个 flex 子元素的 flex-basis;如果没有设置,则 auto 会解析为其内容的大小。这个例子中,给第一个元素设置宽度150px,第二、三个元素不设置宽度。

:first-child {
  width: 150px;
}
登录后复制

效果如下:

1.png

如果你想 flexbox 完全忽略 flex 子元素的尺寸就设置 flex-basis 为 0。这样就算元素一设置了宽度,它最终的宽度也是内容宽度。

2.png

正负自由空间

在介绍剩下两个属性前先看两个概念 positive free space 正向自由空间和 negative free space反向自由空间:

  • 正向自由空间

    比如说,现在有 500px 宽的 flex 容器,flex-direction 属性值为 row, 三个 100px 宽的 flex 子元素, 那么没有被填充的 200px 的 就是正向自由空间(positive free space)。

3.png

  • 反向自由空间

    当子元素的宽度总和大于容器宽度时,溢出的尺寸100px就是反向自由空间。

4.png

那么用什么属性分配正负自由空间呢?

flex-grow

  • flex-grow 默认值 0,若被赋值为一个正整数, flex 元素会以 flex-basis 为基础,沿主轴方向增长尺寸,并占据可用空间。flex-grow 按比例分配增长空间。

初始状态:我们给三个元素都设定宽度,并且总和不大于主轴宽度

.flex-grow-father {
  width: 500px;
  div:nth-child(1) {
    width: 50px;
  }
  div:nth-child(2) {
    width: 100px;
  }
  div:nth-child(3) {
    width: 150px;
  }
}
登录后复制

5.png

增加的宽度计算方法:假设元素的 flex-grow 值为 x,正向自由空间宽度为l,则每个元素增加的宽度=xx的总和l\frac{x}{x的总和}*l,元素最终宽度 = 元素初始宽度+增加的宽度元素初始宽度 + 增加的宽度

  • 相同比例增长:当给每个子元素的都设定相同的 flex-grow 值,每个元素就会增长相同的宽度
.with-same-flex-grow {
  * {
    flex-grow: 1;
  }
}
登录后复制

效果如下:

6.png

本例中第一个元素宽度的计算 11+1+1200+50=116.67px\frac{1}{1+1+1}*200 + 50 = 116.67px

第二个元素宽度宽度计算 11+1+1200+100=166.67px\frac{1}{1+1+1}*200 + 100 = 166.67px

第三个同理为216.67px216.67px

  • 不同比例增长:给每个子元素的都设定不同的 flex-grow 值
.with-different-flex-grow {
  div:nth-child(1) {
    flex-grow: 2;
  }
  div:nth-child(2) {
    flex-grow: 1;
  }
  div:nth-child(3) {
    flex-grow: 1;
  }
}
登录后复制

效果如下:

7.png

本例中第一个元素宽度的计算22+1+1200+50=150px\frac{2}{2+1+1}*200 + 50 = 150px

第二个元素宽度的计算12+1+1200+100=150px\frac{1}{2+1+1}*200 + 100 = 150px

第三个同理是200px200px

  • 如果想让开始时尺寸不同的元素内容宽度相等(平分容器宽度),可以将 flex-basis 设置为 0(完全忽略 flex 子元素的尺寸) flex-grow 为 1(等比例分配)
.average {
  * {
    /* flex: 1 1 0; */
    flex-basis: 0;
    flex-grow: 1;
  }
}
登录后复制

效果如下:

8.png

flex-shrink

flex-shrink 属性指定了 flex 元素的缩小值,默认值为 1; 它确定在分配 negative free space 时,flex 子元素相对于 flex 容器中其余 flex 子元素收缩的程度。默认值 1。用于减少盒子空间使盒子适应容器而不溢出(为了避免 border 干扰去掉边框)

我们给三个元素都设定宽度,并且总和大于主轴宽度;这里我们将元素的flex-shrink值设置为 0 (元素宽度不变,不需要吸收溢出的宽度),目的是观察一下反向自由空间。

.flex-shrink-wrapper {
  display: flex;
  div:nth-child(1) {
    width: 100px;
    background: gold;
  }
  div:nth-child(2) {
    width: 200px;
    background: tan;
  }
  div:nth-child(3) {
    width: 300px;
    background: gold;
  }
}
.zero {
  * {
    flex-shrink: 0;
  }
}
登录后复制

9.png

吸收的宽度计算:假设每个 flex-shrink 的值为 xnx_n,元素的初始宽度为 lnl_n,反向自由空间为LL那么每个元素吸收的宽度为: xnlnx1l1+...+xnlnL\frac{x_n*l_n}{x_1*l_1+...+x_n*l_n}*L

  • 给子元素相同的 flex-shrink 值,这里以默认值 1 为例
.with-same-flex-shrink {
  * {
    flex-shrink: 1;
  }
}
登录后复制

10.png

这时第一个元素的吸收宽度为:11001100+1200+1300100=16.67px\frac{1*100}{1*100+1*200+1*300}*100 = 16.67px,最终元素宽度为 10016.67=83.37px100-16.67=83.37px

这时第一个元素的吸收宽度为:12001100+1200+1300100=33.33px\frac{1*200}{1*100+1*200+1*300}*100 = 33.33px,最终元素宽度为 20033.33=166.67px200-33.33=166.67px

这时第一个元素的吸收宽度为:13001100+1200+1300100=50px\frac{1*300}{1*100+1*200+1*300}*100 = 50px,最终元素宽度为 30050=250px300-50=250px

  • 给子元素不同的 flex-shrink 值
.with-different-flex-shrink {
  div:nth-child(1) {
    flex-shrink: 1;
  }
  div:nth-child(2) {
    flex-shrink: 2;
  }
  div:nth-child(3) {
    flex-shrink: 0;
  }
}
登录后复制

11.png

这时第一个元素的吸收宽度为: 11001100+2200100=20px\frac{1*100}{1*100+2*200}*100 = 20px,最终元素宽度为 10020=80px100-20=80px

这时第二个元素的吸收宽度为:22001100+2200100=80px\frac{2*200}{1*100+2*200}*100 = 80px,最终元素宽度为 20080=120px200-80=120px

这时第三个元素的 flex-shrink 值为 0,不吸收宽度,最终元素宽度即为元素本身的宽度 300px300px

flex 的简写值

一般我们很少见上述属性单独使用,都是用flex这一个简写属性来表述元素的伸缩。

Flex 简写形式允许你把三个数值按这个顺序书写 flex-growflex-shrinkflex-basis。以下是常见的几种取值:

  • flex: initial 的扩展为 0 1 auto (不可放大、可缩小、大小与容器元素大小一致)
  • flex: auto 的扩展为 1 1 auto (可放大、可缩小、大小与容器元素大小一致)
  • flex: none 的扩展为 0 0 auto (不可放大、不可缩小、大小与容器元素大小一致)
  • flex: <positive-number>的扩展为 <positive-number> 1 0

flex: <positive-number>的应用:

两栏布局

.two-grid-wrapper {
  display: flex;
  margin-top: 20px;
  height: 200px;
  .left {
    width: 200px;
    background-color: gold;
  }
  .right {
    flex: 1;
    background-color: tan;
  }
}
登录后复制

效果如下:左侧宽度不变,右侧自适应

12.png

三栏布局

.three-grid-wrapper {
  display: flex;
  margin-top: 20px;
  height: 200px;
  .left {
    width: 200px;
    background-color: gold;
  }
  .right {
    width: 200px;
    background-color: gold;
  }
  .center {
    flex: 1;
    background-color: tan;
  }
}
登录后复制

效果如下:左右宽度不变,中间自适应

13.png

PS.flex 子元素没有 positive free space 就不会增长;没有 negative free space 就不会缩小。

结束语

学习八股文的时候发现自己对flex布局很不熟悉,基本概念都说不上来,只会无脑用,于是去学习,然后就诞生了这篇文章。欢迎指正。

(学习视频分享:web前端

以上是一文详解三个 flex 属性对元素的影响的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

bootstrap怎么插入图片 bootstrap怎么插入图片 Apr 07, 2025 pm 03:30 PM

在 Bootstrap 中插入图片有以下几种方法:直接插入图片,使用 HTML 的 img 标签。使用 Bootstrap 图像组件,可以提供响应式图片和更多样式。设置图片大小,使用 img-fluid 类可以使图片自适应。设置边框,使用 img-bordered 类。设置圆角,使用 img-rounded 类。设置阴影,使用 shadow 类。调整图片大小和位置,使用 CSS 样式。使用背景图片,使用 background-image CSS 属性。

bootstrap怎么调整大小 bootstrap怎么调整大小 Apr 07, 2025 pm 03:18 PM

要调整 Bootstrap 中元素大小,可以使用尺寸类,具体包括:调整宽度:.col-、.w-、.mw-调整高度:.h-、.min-h-、.max-h-

HTML,CSS和JavaScript的角色:核心职责 HTML,CSS和JavaScript的角色:核心职责 Apr 08, 2025 pm 07:05 PM

HTML定义网页结构,CSS负责样式和布局,JavaScript赋予动态交互。三者在网页开发中各司其职,共同构建丰富多彩的网站。

bootstrap怎么写分割线 bootstrap怎么写分割线 Apr 07, 2025 pm 03:12 PM

创建 Bootstrap 分割线有两种方法:使用 标签,可创建水平分割线。使用 CSS border 属性,可创建自定义样式的分割线。

bootstrap怎么设置框架 bootstrap怎么设置框架 Apr 07, 2025 pm 03:27 PM

要设置 Bootstrap 框架,需要按照以下步骤:1. 通过 CDN 引用 Bootstrap 文件;2. 下载文件并将其托管在自己的服务器上;3. 在 HTML 中包含 Bootstrap 文件;4. 根据需要编译 Sass/Less;5. 导入定制文件(可选)。设置完成后,即可使用 Bootstrap 的网格系统、组件和样式创建响应式网站和应用程序。

bootstrap按钮怎么用 bootstrap按钮怎么用 Apr 07, 2025 pm 03:09 PM

如何使用 Bootstrap 按钮?引入 Bootstrap CSS创建按钮元素并添加 Bootstrap 按钮类添加按钮文本

bootstrap怎么看日期 bootstrap怎么看日期 Apr 07, 2025 pm 03:03 PM

答案:可以使用 Bootstrap 的日期选择器组件在页面中查看日期。步骤:引入 Bootstrap 框架。在 HTML 中创建日期选择器输入框。Bootstrap 将自动为选择器添加样式。使用 JavaScript 获取选定的日期。

vue中怎么用bootstrap vue中怎么用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分为五个步骤:安装 Bootstrap。在 main.js 中导入 Bootstrap。直接在模板中使用 Bootstrap 组件。可选:自定义样式。可选:使用插件。

See all articles