这不是错误,规范中清楚地描述了行为(清晰但不明显)。
这里是关于flex base size的。你可以阅读:
确定每个项目的弹性基本尺寸和假设的主要尺寸:
请注意假设的主要尺寸,这是这里的重要部分。
每个元素都有flex:1
soflex-basis:0
这意味着 flex 基本大小等于 0
A. 如果项目有明确的使用弹性基础,那就是弹性基础尺寸。
现在让我们继续到最后并阅读以下内容:
在确定 flex 基本尺寸时,忽略项目的最小和最大主尺寸
直到现在,它仍然可以。在查找 flex 基本大小时,我们会忽略所有内容。
让我们继续:
假设的主尺寸是根据其使用的最小和最大主尺寸(并将内容框尺寸设置为零)固定的项目的弹性基本尺寸。
假设的主尺寸考虑了元素尺寸,因此它将不同于弹性基本尺寸,在我们的例子中,我们有20px
填充,所以假设的主尺寸等于20px
现在,如果您检查 flexbox 算法的其余部分,您会注意到假设的主尺寸是使用的那个,它为我们提供了填充变大的项目的逻辑结果。
对于这一步,弹性项目的大小是它的外部假设主要大小
将行上所有项目的外部假设主要尺寸相加
ETC
如果你删除它更微不足道flex-grow
body > div {
height: 50px;
display: flex;
}
body > div > div {
flex-basis: 0;
box-sizing: border-box;
}
#a {
background-color: red;
}
#b {
background-color: green;
}
#c {
padding: 10px;
background-color: blue;
}
#d {
background-color: yellow;
}
<div>
<div id="a"></div>
<div id="b"></div>
</div>
<div>
<div id="c"></div>
<div id="d"></div>
</div>
它们都具有0
宽度,但具有填充的宽度将具有20px
(其假设的主要尺寸而不是其弹性基本尺寸)
避免这种情况的解决方案是确保所有项目都以相同的假设主尺寸结尾,因此我们需要确保flex-basis
大于所有定义的填充、宽度、边框等。
@Michael_B 使用 flex-basis:50%
,但您也可以使用flex-basis:40%
orflex-basis:20px
或任何大于20px
和小于的值50%
body > div {
height: 50px;
display: flex;
}
body > div > div {
flex-basis: 40%; /* between 20px and 50% will do the job*/
flex-grow:1;
flex-shrink:1;
box-sizing: border-box;
}
#a {
background-color: red;
}
#b {
background-color: green;
}
#c {
padding: 10px;
background-color: blue;
}
#d {
background-color: yellow;
}
<div>
<div id="a"></div>
<div id="b"></div>
</div>
<div>
<div id="c"></div>
<div id="d"></div>
</div>