关于flex-grow的陷阱

前一阵在使用flex布局进行宽度处理时,发现了flex-grow并非按照预期的状况进行比例处理,顿时以为有点懵逼。css

stackoverflow搜索以后,终于搞明白了其中的奥秘。html

话很少说,直接上代码:布局

.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

flex-grow属性定义项目的放大比例,默认为0,即若是存在剩余空间,也不放大code

若是全部项目的flex-grow属性都为1,则它们将等分剩余空间(若是有的话)。若是一个项目的flex-grow属性为2,其余项目都为1,则前者占据的剩余空间将比其余项多一倍。htm

按照正常理解咱们的代码没有问题啊,怎么比例并非设置的那样呢?blog

重点来了,这里的剩余空间才是关键。
对于一个flex-item来讲,它的初始空间并非0,而是另外一个属性值auto(元素内容占用的空间)。教程

这样就致使了咱们设置了flex-grow的效果并非将整个宽度进行等比例的拆分,而是对去除内容的宽度进行了比例划分。文档

而若是想要打到咱们实际所想的效果,咱们就须要使用flex属性来代替原来的。
由于根据MDN文档的描述,咱们就知道了get

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原问题连接

相关文章
相关标签/搜索