微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于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原问题链接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐