【问题标题】:Why inline-flex element with clearfix has a weird white space?为什么带有 clearfix 的 inline-flex 元素有一个奇怪的空白?
【发布时间】:2016-12-16 19:02:18
【问题描述】:

在对 inline-flex 元素应用 clearfix 时,我有一个奇怪的行为。当我为具有 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>

JSFiddle Demo

【问题讨论】:

  • 一开始你为什么要这么做? Clear fix 是一种可怕的 hack,用于处理使用浮动的黑客布局……而 flexbox 是使用浮动的黑客布局的替代品。
  • @Quentin,嘿,好问题!我发现它不在我的代码中..
  • @Quentin:那种放弃使用 clearfix hack 的人是那种对它的作用缺乏基本了解的人,甚至通常对浮点数缺乏基本了解。

标签: html css flexbox


【解决方案1】:

display: inline-flex

当你使用display: inline-flex时,你建立了一个弹性容器。

弹性容器的初始设置是flex-direction: row

这意味着容器的所有流入子元素(包括流入伪元素)将排成一行。根据flex formatting context 的规则,这些子项的display 值(在本例中为table)被覆盖/忽略。

您的弹性容器在一行中有两个弹性项目(伪元素):

.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 时,您将建立一个block 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

当设置为display: inline-flex 时,您在div.b 下方看到的空白是由于基线对齐。

当设置为display: inline-block 时,您在div.b 下方看到的空白是由于基线对齐结合两个块元素子元素的影响

这里有更详细的解释::https://stackoverflow.com/a/36975280/3597276


clear 属性

.cf:after {
    clear: both;
}

您的 clearfix 方法不是任何空白的来源。事实上,它对您的布局没有影响,可以安全地删除。

您仅在处理浮点数时使用clear 属性。

来自规范:

9.5.2 Controlling flow next to floats: the clear property

此属性指示元素框的哪些边可能不是 与较早的浮动框相邻。

您的布局中不仅没有浮动元素,而且如果有,floatclear 属性在 flex 格式化上下文中仍然会被忽略。

3. Flex Containers: the flex and inline-flex display values

  • floatclear 不会创建弹性项目的浮动或清除,也不要使其脱离流动。

【讨论】:

    【解决方案2】:

    尝试将verical-align: top; 设置为您的inline-flex | inline-block 元素以修复此偏移量。

    https://jsfiddle.net/jeca65my/2/

    感谢@NenadVracar this solution

    【讨论】:

    • 应该是vertical-align: top;。谢谢!
    【解决方案3】:

    您必须将您的页面想象为flow。页面的每个元素都在流 (DOM) 中。您正在使用 position 属性来更改流中的位置。

    阻止

    块元素将总是开始一个新行。 (即:div)

    内联块

    内联块元素是类似于div 的块,但其中包含inline 属性。 (即:跨度)

    内联弹性

    这与流程中的inline-block 的使用方式相同。它创建了一个 inline 但具有 flex 布局的容器。

    对于您的示例,为了关注 inline-blockinline-flex 之间的区别,要做的一件有趣的事情是在您的子 div 中添加文本。您会看到您的子 div 的行为将再次发生变化,因为其中包含文本。 JSFiddle example

    编辑:我在 SO 上找到了一句话,很好地恢复了这种情况。感谢@BoltClockThis post

    display: inline-flex 不会使 flex 项目内联显示。它使 flex 容器内联显示。

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 2018-06-15
      • 2023-01-17
      • 1970-01-01
      • 2013-09-05
      • 2013-01-01
      • 2019-01-07
      • 1970-01-01
      相关资源
      最近更新 更多