前一阵在使用flex布局进行宽度处理时,发现了flex-grow并不是按照预期的情况进行比例处理,顿时觉得有点懵逼。
在stackoverflow
搜索之后,终于搞明白了其中的奥秘。
话不多说,直接上代码:
.flex-container {
display: flex;
width: 100%;
}
.flex-item {
flex-grow: 1;
list-style-type: none;
}
.big {
flex-grow: 3;
}
<ul class="flex-container">
<li class="flex-item big">理论应该是小的三倍长</li>
<li class="flex-item">但实际并不是这样</li>
</ul>
我们参照阮一峰的flex教程就可以看到对于这个属性的解释:
flex-grow
属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大如果所有项目的
flex-grow
属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow
属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
按照正常理解我们的代码没有问题啊,怎么比例并不是设置的那样呢?
重点来了,这里的剩余空间才是关键。
对于一个flex-item
来说,它的初始空间并不是0,而是另一个属性值auto
(元素内容占用的空间)。
这样就导致了我们设置了flex-grow
的效果并不是将整个宽度进行等比例的拆分,而是对去除内容的宽度进行了比例划分。
而如果想要打到我们实际所想的效果,我们就需要使用flex
属性来代替原来的。
因为根据MDN文档的描述,我们就知道了
flex
规定了弹性元素如何伸长或缩短以适应flex容器中的可用空间。这是一个简写属性,可以同时设置flex-grow
,flex-shrink
与flex-basis
。
这样我们使用flex
时只指定一个数字(宽度值会转化成flex-basis
)时,flex-basis
会自动转换为0%
,而数字正好转换成了要设置的比例(flex-grow
值)。
于是修改css代码如下:
.flex-item {
flex: 1;
}
.big {
flex: 3;
}
这样设置的比例就如我们所愿的显示出来了。