我有一个Flexbox布局,其中包含两个项目。其中之一使用padding-bottom:
#flexBox {
border: 1px solid red;
width: 50%;
margin: 0 auto;
padding: 1em;
display: flex;
flex-direction: column;
}
#text {
border: 1px solid green;
padding: .5em;
}
#padding {
margin: 1em 0;
border: 1px solid blue;
padding-bottom: 56.25%; /* intrinsic aspect ratio */
height: 0;
}
<div id='flexBox'>
<div id='padding'></div>
<div id='text'>Some text</div>
</div>
调整页面大小时,蓝色元素会根据其宽度保持其宽高比。这适用于Chrome和IE,如下所示:
但是,在Firefox和Edge中,我得到以下信息(它忽略了保持长宽比的蓝色框上的填充):
我对于Flexbox来说还太陌生,以至于无法真正了解它是否应该工作。flexbox的全部目的是调整大小,但是我不确定为什么它会忽略固有的填充,而将绝对大小放在蓝色元素上。
我想最终我甚至不确定Firefox或Chrome是否在做正确的事情!任何Firefox flexbox专家都可以提供帮助吗?
FireFox和edge已从规格中实现了行为,并且flex元素的margin + padding均根据包含块的宽度进行计算。
就像块元素一样。
2018年2月更新
Firefox和Edge已同意更改其在flex(和网格)项目的顶部,底部页边距和填充的行为:
例如,在水平书写模式下,左/右/上/下百分比全都根据其包含块的宽度来解析。[来源]
尚未实现(已在FF 58.0.2上测试)。
2016年4月更新
规格已更新为:
可以根据以下任一条件解决弹性项目上的边距和填充百分比:
- 自己的轴(左/右百分比针对宽度,顶部/底部百分比针对高度),或者,
- 内联轴(左/右/上/下百分比均针对宽度进行解析)
来源:CSS Flexible Box Layout Module Level 1
这意味着chrome IE FF和Edge(即使它们的行为不同)也遵循规范推荐。
规格还说:
作者应避免在弹性项目的填充或边距中完全使用百分比,因为它们在不同的浏览器中会出现不同的行为。[来源]
您可以将flex容器的第一个子元素包装在另一个元素中,然后将其padding-bottom
放在第二个子元素上:
#flexBox {
border: 1px solid red;
width: 50%;
margin: 0 auto;
padding: 1em;
display: flex;
flex-direction: column;
}
#text {
border: 1px solid green;
padding: .5em;
}
#padding {
margin: 1em 0;
border: 1px solid blue;
}
#padding > div {
padding-bottom: 56.25%; /* intrinsic aspect ratio */
}
<div id='flexBox'>
<div id='padding'><div></div></div>
<div id='text'>Some text</div>
</div>
我在现代浏览器(IE,chrome,FF和Edge)中对此进行了测试,它们都具有相同的行为。由于第二个子级的配置是“与往常相同”,因此我认为较旧的浏览器(该支持aslo支持flexbox布局模块)将呈现相同的布局。
先前的答案:
根据规范,Firefox具有正确的行为
与根据容器宽度计算其百分比边距/填充的块项目不同,在弹性项目上:
弹性项目的边距和填充百分比始终根据其各自的尺寸进行解析;与块不同,它们并不总是针对其包含块的内联维进行解析。
这意味着padding-bottom / top / top和margin-bottom-bottom / top是根据容器的高度计算的,而不是根据非flexbox布局中的宽度计算的。
由于您尚未在父级伸缩项上指定任何高度,因此该子级的底部填充应为0px。
这是在父级上固定高度的小提琴,它表示填充底部是根据display:flex;
容器的高度计算的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句