flex:1 是什么?
首先 flex: 1; 等同于 flex: 1 1 auto;
flex: 1 实际上是三个属性的缩写:flex-grow: 1; flex-shrink: 1 flex-basis: auto;
flex-grow的作用
flex-grow 的作用是表示在当前元素占多少份的意思。
演示一段代码
Document
box-1
box-2
示例图:
这样表示2个子元素各占1份,填充满整个flex的内容
flex-basis的作用
代码演示
Document
box-1
box-2
示例图:
这边没有设置flex-grow所以默认是flex-grow: 0;
flex-basis表示 flex中的剩余空间的大小。
那么box-1就是占总总宽度(500px)的10%,box-2则占总宽度(500px)的100px;
flex-grow 与 flex-basis 其实类似,区别在于,flex-grow 会填充满整个flex内容,而flex-basis不会通常满整个内容。
flex-shrink的作用
代码演示
Document
box-1
box-2
这边设置flex下2个子元素的宽度分别是 400px 和 300px,可以明显的看出已经超出父元素设置的500px。
那么这是flex-shrink就会起到作用,它会根据flex-shrink设置的值进行收缩。
如果flex-shrink设置为0表示当前元素不会进行收缩,flex-shrink的默认值为1;
flex-shrink的收缩公示(以这个为例):
子元素超出的宽度 * flex-shrink的值 * 子元素宽度 / 总值;
总值的获取(以当前代码为例):1(box-1的flex-shrink值) * 400(box-1的宽度) + 2(box-2的flex-shrink值) * 300(box-2的宽度) = 1000;
以当前代码为例计算:
子元素超出的值:500 - (400 + 300) = 200;
总值:1 * 400 + 2 * 300 = 1000;
.box-1收缩的宽度:200 * 1 * 400 / 1000 = 80;
.box-2收缩的宽度:200 * 2 * 300 / 1000 = 120;
实际看效果图
flex下的子元素确实是按照计算出来的宽度进行收缩了。
那么回归正题,flex:1 等于 flex:1 1 0 就很好理解了,默认情况下 flex 等于 flex 0 1 auto。
实际动手敲一遍代码看看效果会发现其实很好理解