三个flex属性对元素的影响是什么
本篇内容主要讲解“三个flex属性对元素的影响是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“三个flex属性对元素的影响是什么”吧!
首先我们需要了解,flex 是三个属性 flex-grow
、flex-shrink
、flex-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;
}
效果如下:
如果你想 flexbox 完全忽略 flex 子元素的尺寸就设置 flex-basis 为 0。这样就算元素一设置了宽度,它最终的宽度也是内容宽度。
正负自由空间
在介绍剩下两个属性前先看两个概念 positive free space
正向自由空间和 negative free space
反向自由空间:
正向自由空间
比如说,现在有 500px 宽的 flex 容器,flex-direction 属性值为 row, 三个 100px 宽的 flex 子元素, 那么没有被填充的 200px 的 就是正向自由空间(positive free space)。
反向自由空间
当子元素的宽度总和大于容器宽度时,溢出的尺寸100px就是反向自由空间。
那么用什么属性分配正负自由空间呢?
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;
}
}
增加的宽度计算方法:假设元素的 flex-grow
值为 x
,正向自由空间宽度为l,则每个元素增加的宽度=x的总和x∗l,元素最终宽度 = 元素初始宽度+增加的宽度;
相同比例增长:当给每个子元素的都设定相同的 flex-grow 值,每个元素就会增长相同的宽度
.with-same-flex-grow {
* {
flex-grow: 1;
}
}
效果如下:
本例中第一个元素宽度的计算 1+1+11∗200+50=116.67px;
第二个元素宽度宽度计算 1+1+11∗200+100=166.67px;
第三个同理为216.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;
}
}
效果如下:
本例中第一个元素宽度的计算2+1+12∗200+50=150px;
第二个元素宽度的计算2+1+11∗200+100=150px;
第三个同理是200px
如果想让开始时尺寸不同的元素内容宽度相等(平分容器宽度),可以将 flex-basis 设置为 0(完全忽略 flex 子元素的尺寸) flex-grow 为 1(等比例分配)
.average {
* {
flex-basis: 0;
flex-grow: 1;
}
}
效果如下:
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;
}
}
吸收的宽度计算:假设每个 flex-shrink 的值为 xn,元素的初始宽度为 ln,反向自由空间为L那么每个元素吸收的宽度为: x1∗l1+...+xn∗lnxn∗ln∗L
给子元素相同的 flex-shrink 值,这里以默认值 1 为例
.with-same-flex-shrink {
* {
flex-shrink: 1;
}
}
这时第一个元素的吸收宽度为:1∗100+1∗200+1∗3001∗100∗100=16.67px,最终元素宽度为 100−16.67=83.37px
这时第一个元素的吸收宽度为:1∗100+1∗200+1∗3001∗200∗100=33.33px,最终元素宽度为 200−33.33=166.67px
这时第一个元素的吸收宽度为:1∗100+1∗200+1∗3001∗300∗100=50px,最终元素宽度为 300−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;
}
}
这时第一个元素的吸收宽度为: 1∗100+2∗2001∗100∗100=20px,最终元素宽度为 100−20=80px
这时第二个元素的吸收宽度为:1∗100+2∗2002∗200∗100=80px,最终元素宽度为 200−80=120px
这时第三个元素的 flex-shrink 值为 0,不吸收宽度,最终元素宽度即为元素本身的宽度 300px
flex 的简写值
一般我们很少见上述属性单独使用,都是用flex这一个简写属性来表述元素的伸缩。
Flex
简写形式允许你把三个数值按这个顺序书写 flex-grow
,flex-shrink
,flex-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;
}
}
效果如下:左侧宽度不变,右侧自适应
三栏布局
.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;
}
}
效果如下:左右宽度不变,中间自适应
PS.flex 子元素没有 positive free space 就不会增长;没有 negative free space 就不会缩小。
到此,相信大家对“三个flex属性对元素的影响是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341