对应用clearfix时,我有inline-flex
元素的奇怪行为。当我为具有inline-flex
显示属性的元素设置clearfix时,会出现奇怪的空格:
但是当使用inline-block
时,行为是不同的:
我不明白为什么inline-flex
的行为与inline-block
不同...以及为什么它有这么奇怪的空间。
.a,
.b {
border: 1px solid red;
}
.a {
text-align: center;
}
.b {
display: inline-flex;
height: 20px;
width: 20px;
}
.cf:before,
.cf:after {
content: " ";
display: table;
}
.cf:after {
clear: both;
}
<div class="a">
<div class="b cf"></div>
</div>
答案 0 :(得分:6)
display: inline-flex
使用display: inline-flex
时,建立一个弹性容器。
弹性容器的初始设置为flex-direction: row
。
这意味着容器的所有in-flow子元素(包括in-flow伪元素)将排成一行。根据{{3}}的规则,覆盖/忽略这些子项的display
值(在本例中为table
)。
您的Flex容器在一行中有两个flex项(伪元素):
.a,
.b {
border: 1px solid red;
}
.a {
text-align: center;
}
.b {
display: inline-flex;
height: 20px;
width: 20px;
}
.cf:before,
.cf:after {
content: "x";
display: table;
}
.cf:after {
clear: both;
}
<div class="a">
<div class="b cf"></div>
</div>
display: inline-block
使用display: inline-block
时,您会建立flex formatting context。
尊重子元素的display
属性。
display: table
的伪元素是块元素,默认情况下占用整个可用宽度。因此,伪正在创建两行:
.a,
.b {
border: 1px solid red;
}
.a {
text-align: center;
}
.b {
display: inline-block;
height: 20px;
width: 20px;
}
.cf:before,
.cf:after {
content: "x";
display: table;
}
.cf:after {
clear: both;
}
<div class="a">
<div class="b cf"></div>
</div>
vertical-align: baseline
由于您的代码的两个版本都使用内联级display
值,因此会调用vertical-align
属性,其初始值为baseline
。
设置为div.b
时,您在display: inline-flex
下面看到的空白区域是由于基线对齐造成的。
设置为div.b
时,您在display: inline-block
下方看到的空白区域是由于基线对齐以及两个块元素子项的效果。
以下是更详细的说明:: block formatting context
clear
属性.cf:after {
clear: both;
}
您的clearfix方法不是任何空格的来源。实际上,它对您的布局没有影响,可以安全删除。
只有在处理浮动时才使用clear
属性。
来自规范:
https://stackoverflow.com/a/36975280/3597276
此属性指示元素框的哪些边可能不是 毗邻较早的浮箱。
不仅布局中没有浮动元素,但如果存在,则在Flex格式化上下文中仍会忽略float
和clear
属性。
9.5.2 Controlling flow next to floats: the
clear
property
float
和clear
不会创建弹性项目的浮动或间隙,也不会使其脱离流动。
答案 1 :(得分:3)
尝试将verical-align: top;
设置为inline-flex | inline-block
元素以修复此偏移量。
答案 2 :(得分:1)
您必须将您的网页想象为flow
。页面的每个元素都在流(DOM)中。您正在使用position属性来更改流中的位置。
块
块元素将始终开始新行。 (即:div)
内联块
内联块元素是div
之类的块,但其中包含inline
个属性。 (即:span)
直列挠曲
这与流程中inline-block
的使用方式相同。它创建了一个inline
但flex
布局的容器。
对于您的示例,要关注inline-block
和inline-flex
之间的区别,要做的有趣事情是在子div中添加文本。您将看到您的子div的组合将再次更改,因为它中包含文本。 JSFiddle example
编辑:我在SO上找到了一个可以恢复状态的句子。感谢@BoltClock上的This post:
display:inline-flex不会使flex项显示为内联。它使Flex容器显示为内联。