关于flex-grow的陷阱

前一阵在使用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-shrinkflex-basis

这样我们使用flex时只指定一个数字(宽度值会转化成flex-basis)时,flex-basis会自动转换为0%,而数字正好转换成了要设置的比例(flex-grow值)。

于是修改css代码如下:

.flex-item {
    flex: 1;
}
.big {
    flex: 3;
}

这样设置的比例就如我们所愿的显示出来了。

ps.stackoverflow原问题链接

相关文章
相关标签/搜索