深入了解flex

flex布局大家应该比较熟悉了,但感觉自己对flex的具体计算过程还不是很了解,故写此文

flex属性

flex 是 flex-grow、flex-shrink、flex-basis的缩写

flex 的默认值是以上三个属性值的组合。假设以上三个属性同样取默认值,则 flex 的默认值是 0 1 auto。
flex-basis 规定的是子元素的基准值。所以是否溢出的计算与此属性息息相关。

  • flex-basis 规定的范围取决于 box-sizing。这里主要讨论以下 flex-basis 的取值情况:

  • auto:首先检索该子元素的主尺寸,如果主尺寸不为 auto,则使用值采取主尺寸之值;如果也是 auto,则使用值为 content。

  • content:指根据该子元素的内容自动布局。有的用户代理没有实现取 content 值,等效的替代方案是 flex-basis 和主尺寸都取 auto。

  • 百分比:根据其包含块(即伸缩父容器)的主尺寸计算。如果包含块的主尺寸未定义(即父容器的主尺寸取决于子元素),则计算结果和设为 auto 一样。
    场景:

.box{
	display: flex;
	width:400px;
}
.a{
	width:200px;
}
.b{
	width:300px;
}

flex属性为默认值

那么此时,a、b实际宽度会是多少呢?
widthA = 400 * 200 / (200 + 300) = 160
widthB = 400 * 300 / (200 + 300) = 240

flex:1

flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;

flex:1也是我们常使用的
假设flex:1设置在a上
widthA = 400 - 300(b) = 100
widthB = 400 - widthA = 300

假设flex:1设置在b上
widthB = 400 - 200(a) = 200
widthA = 400 - widthB = 200

使用场景:a的宽度固定,b的宽度不固定,根据容器大小变化自适应,此时即可为b设置flex:1(剩余空间都分配给b)。

参考:https://segmentfault.com/q/1010000004080910/a-1020000004121373

你可能感兴趣的:(深入了解flex)