You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
最后,得出设置了flex-shrink属性时,元素总宽超出部分的收缩分配公式是这样子的:比如超出空间是 y, 子元素A、B、C的宽度分别是wA、wB、wC,设置的flex-shrink 属性分别是a,b,c,(不设置的话,就是默认值1)那么flex-shrink的总权重weight = a * wA + b * wB + c * wC,接下来可能需要运用点数学计算了,假设单个元素的收缩宽度是v,那么v与已知数据的关系是:
特别说明
下面提及的例子是方式,都是以宽为例,也就是
flex-direction: row
的情况,flex-direction: column
的情况同理,只是把宽度改成高度背景
FlexBox Layout
旨在提供一种更加有效的方式来布局、对齐和分配容器中各个项目直接的空间,即使它们的大小未知或是动态改变的。FlexBox Layout
的主要思想是使容器能更改其项目的宽度/高度(和顺序),来最好地填充可用空间(主要是使用所有类型的显示设备和屏幕尺寸)。FLex容器会扩展项目以填充可用的可用空间,或收缩它们以防止溢出。最重要的是,和常规布局(块是垂直的,内联是水平的)相比,
flexbox
布局与方向无关的。虽然方向这些功能在页面上工作的很好,但是常规布局缺乏支持大型或复杂应用程序的灵活性(特别是在改变方向、调整大小、拉伸、收缩等方面)。注意:
Flexbox
布局最适合应用程序的组件和小规模布局,而Grid布局则用于较大规模的布局。属性使用(脑图)
爆炸,脑图原稿找不到了......
一直迷惑的 flex-grow
先来默读三遍下MDN上面的对
flex-grow
的介绍:上面的解说其实很清晰的说明白了
flex-grow
的定义,但不够接地气,可能有的小伙伴读完之后还不能很清晰了理解到flex-grow
的用法,那这边就列举具体的例子来介绍下flex-grow
的用法。首先,
flex-grow
的值是一个<number>
,它代表的是一个系数(也就是一个权重,如果还不是十分理解权重,建议先去了解下,方便后续理解)。默认值是0,默认并不会对剩余空间进行分配。然后,
flex-grow
属性决定的是父元素在空间分配上有剩余空间时,如何分配这些剩余空间。最后,得出设置了
flex-grow
属性时,剩余空间的分配公式是这样子的:比如剩余空间是x
, 子元素A、B、C的flex-grow
属性分别是a,b,c,那么flex-grow
的系数总和就是sum = a + b + c
,根据上面的解说,A、B、C三个元素将得到的剩余空间:flex-grow
的取值不能是负数,那么情况有3种x
表示每个子元素是flex-grow
的值接下来示例说明:父元素的宽度是
1000px
,里面有3个子元素,设置的宽度分别是100px
,200px
,300px
,那么剩余空间就是400px
,代码如下:看到剩余空间是
400px
,此时分别给子元素添加flex-grow
属性,flex-grow
取值情况不能是负数,默认是0 ,所以取值的情况只会有两种【情况1】 x = 0
默认值;相当于都没有设置
flex-grow
属性的情况;不会分配剩余空间【情况2】 0 < x < 1;
每个子元素的
flex-grow
属性都小于1,所有子元素的flex-grow
属性加起来就小于1,上面式子中的sum
将会等于1,意思是说,如果flex-grow
属性设置小于0的时候,父元素的剩余空间不会全部分配给子元素:根据上面的公式计算下设置了
flex-grow
属性情况下,各个子元素的宽度【情况3】 x = 1
所有子元素的
flex-grow
属性都设置成1,是一种特殊的情况,表示的是所有元素将按权重均分剩余空间;【情况4】 x > 1
所有子元素的
flex-grow
属性都大于1,它们的和也大于1;根据上面的公式计算下设置了
flex-grow
属性情况下,各个子元素的宽度验证下:
意外
好了,到此就把
flex-grow
的计算方式介绍完成,但是,剩余空间的分配后的宽度收到max-width
的影响,如果分配之后的宽度大于max-width
,那么mqx-width
的优先级更高,看下面代码:最后一个元素被添加了
max-width: 400px
,按照上面的计算,如果不加max-width
属性的话,三个元素的宽度经过分配之后分别是166.67px、333.33px、500px
,加了max-width
之后却是200px、400px、400px
,完全不一样,分析下这种情况下的计算规则。由于最后一个元素剩余了 100px 没有被占用,那么这 100px 会被前面的2个元素按权重分配,所以是
同样迷惑的 flex-shrink
同样,先来默读三遍下MDN上面的对
flex-shrink
的介绍:我觉得这个说明也还算接地气吧,哈哈,不过还是就要实例来解说下,会比较容易理解。
首先,
flex-shrink
的值也是一个<number>
,也是代表一个系数(权重)。默认值是1,表示会按照1的权重进行空间收缩。然后,
flex-shrink
属性决定的是如果所有子元素的宽度和大于容器的时候,如何收缩以适应父元素的宽度。最后,得出设置了
flex-shrink
属性时,元素总宽超出部分的收缩分配公式是这样子的:比如超出空间是y
, 子元素A、B、C的宽度分别是wA、wB、wC,设置的flex-shrink
属性分别是a,b,c,(不设置的话,就是默认值1)那么flex-shrink
的总权重weight = a * wA + b * wB + c * wC
,接下来可能需要运用点数学计算了,假设单个元素的收缩宽度是v,那么v与已知数据的关系是:变换下等式
和
flex-grow
一样,flex-shrink
的取值和不能是负数,那么,取值情况有4种接下来示例说明: 父元素的宽度是500px,里面有3个子元素,设置的宽度分别是100px,200px,300px,代码如下:
【情况1】x = 0
根据定义和公式可以
get
到,flex-shrink
为0,其实就是表示在宽度和超出父元素总宽度的时,不进行任何系数的收缩。如下表示,给第一个子元素设置了flex-shrink = 0
之后,在宽度不足的情况下,并没有压缩,而是压缩了其他元素以适应。【情况2】0 < x < 1
代入公式
从实际图片中看到计算结果和渲染结果一致。
【情况3】 x = 1 (默认值)
代入公式
从实际图片中看到计算结果和渲染结果一致。
【情况4】x > 1
带入等式计算每个元素收缩之后的宽度
从实际图片中看到计算结果和渲染结果一致。
【情况5】x > 1 和 0 < x < 1 混合在一起
计算方式和【情况4】是一致的,那这里就不贴代码了。
意外
子元素被设置了
min-width
属性,那么min-width
的属性优先级将会比较高设置了
min-width
的元素将不会被压缩,其他元素按权重压缩。一般迷惑的 flex-basis
MDN 上的介绍:
flex-basis
一般取值是0
、auto
、<number>
,(其他值暂时没见到过)flex-basis
属性不涉及到计算,就是理解对值的获取,下面是对3种取值的示例示例代码中,第一个子元素没有设置
flex-grow
、flex-shrink
属性,其他两个子元素都设置了,可以更好的对比flex-basis
属性表现出来的样式;【情况1】
flex-basis:0
【情况2】
flex-basis:auto
【情况3】
flex-basis:400px
具体的值意外
同时设置了
width
和flex-basis
属性的情况下,flex-basis
的优先级更高。如果看完还没有全懂,或者还没有解答你的问题,记得留言,让我也不懂,未完,待续
社区整理的bugfix参考文档
philipwalton/flexbugs
参考文档
图解CSS:Flexbox布局(Part1) - 大漠老师对flex系列的讲解太棒了
A Complete Guide to Flexbox
详解 flex-grow 与 flex-shrink
The text was updated successfully, but these errors were encountered: