【问题标题】:Why does the extra space between two inline-elements get filled with background-color, but it doesn't for the space between two inline-block elements?为什么两个内联元素之间的额外空间被背景色填充,但两个内联块元素之间的空间却没有?
【发布时间】:2020-10-22 21:01:53
【问题描述】:

.div1 {
    display:inline;
    background-color:blue;
}

.div2 {
    display:inline;
    background-color: orange;

}

.div3 {
    display:inline-block;
    background-color:red ;
}


.div4 {
    display:inline-block;
    background-color:greenyellow;
}
<div class="div1">
   Lorem ipsum
</div>

<div class="div2">
    Lorem ipsum
</div> <br>

<div class="div3">
    Lorem ipsum
</div>

<div class="div4">
    Lorem ipsum
</div>

</body>

这里有一张图片可以更好地说明我的问题。 PICTURE

我知道这可能是一个愚蠢的问题并且在很大程度上无关紧要,但我只是想知道为什么第一个 inline-element 会创建一个额外的 4px 宽度来覆盖背景颜色,而 inline-block 元素会创建相同的4px 宽度,但不会被背景色覆盖。

我知道这很可能与以下事实有关:行内元素不尊重宽度,但行内块元素尊重宽度。

有人知道为什么会这样吗?

【问题讨论】:

  • 我相信这是因为display: inline 的顶部和底部边距和填充不被尊重(所以divs 相互对接)而display: inline-block 是。
  • @disinfor 我不明白这如何回答这个问题?您能否指出我给出的答案?其中一个答案说 inline-block 像 inline-elements 一样设置默认空白。但是对于内联元素,额外的空白空间会被背景色覆盖,但对于内联块,它不会。所以我想知道为什么。这在问题的某个地方有解释吗?
  • @Ihatecontrolfreaks 这是对已接受答案的第三条(或第二条)评论。

标签: html css


【解决方案1】:

你的答案在the specification之内。

对于每个 内联(包括匿名内联;请参阅 [CSS2] 第 9.2.2.1 节)在内联格式化上下文中,...

紧随另一个可折叠空间的任何可折叠空间——即使是包含该空间的内联边界之外,只要两个空间都在同一个内联格式上下文中——被折叠成具有零前进宽度。 (它是不可见的,但保留了它的软包装机会,如果有的话。)

这有点复杂,但在内联元素的情况下,空间将折叠成一个空间,该空间将在第一个内联元素内,而不是在两个内联元素之间。这是因为您的内联元素末尾有一个空格。换句话说,所有的空间都将折叠成第一个空间,而第一个空间的位置将决定视觉效果。

删除行内元素末尾的空格,你会得到不同的结果:

.div1 {
  display: inline;
  background-color: lightblue;
}

.div2 {
  display: inline;
  background-color: orange;
}
<div class="box">
  <div class="div1"> Lorem ipsum </div>
  <div class="div2"> Lorem ipsum </div>
</div>
<div class="box">
  <div class="div1"> Lorem ipsum</div>
  <div class="div2"> Lorem ipsum </div>
</div>

第二个元素内有空格的配置:

.div1 {
  display: inline;
  background-color: lightblue;
}

.div2 {
  display: inline;
  background-color: orange;
}
<div class="box">
  <div class="div1"> Lorem ipsum </div>
  <div class="div2"> Lorem ipsum </div>
</div>
<div class="box">
  <div class="div1"> Lorem ipsum</div><div class="div2">   Lorem ipsum </div>
</div>

inline-block 不同,因为外部空间不能与 inline-block 元素内部的空间一起折叠。

内联块

此值使元素生成内联级块容器。内联块的内部被格式化为块框,元素本身被格式化为原子内联级框ref

相关:CSS Spec - Atomic Inline Level Boxes

inline-block 元素内的空格是单独进行的,它们将按照以下规则进行修剪:

  1. 行首的一系列可折叠空格被删除。

  2. 删除一行可折叠空格末尾的序列,

然后inline-block 元素之间的空格将折叠成一个空格。因此,在所有情况下,您的 inline-block 元素之间都会有一个空格,无论内部/外部空格的组合,除非它们之间没有空格

.div1 {
  display: inline-block;
  background-color: lightblue;
}

.div2 {
  display: inline-block;
  background-color: orange;
}
<div class="box">
  <div class="div1"> Lorem ipsum </div>
  <div class="div2"> Lorem ipsum </div>
</div>
<div class="box">
  <div class="div1"> Lorem ipsum</div>
  <div class="div2"> Lorem ipsum </div>
</div>

<div class="box">
  <div class="div1"> Lorem ipsum</div><div class="div2">   Lorem ipsum </div>
</div>

【讨论】:

  • 我明白了。那么在行内块的情况下,额外的空白不会折叠到第一个元素的一个空格部分?
  • @Ihatecontrolfreaks 在 inline-block 的情况下,您有 2 个折叠 .. 在 inline-block itefl 内(第一个和最后一个空格被修剪)并且在两个 inline-block 之间,sapces 将折叠成一个..对于内联元素,我们只有一个折叠,所有的空间都被考虑在一起,然后结果在 div 内部(我会尝试添加更多细节来说明)
  • @Ihatecontrolfreaks 空格是您用键盘输入的字符空间。它与任何 4px 或什么都没有关系(它可以具有基于字体和其他参数的任何宽度)。在您的代码中,您有很多空格和换行符(您用键盘敲击)。我将 div 外的那些称为 outside spaces,将 div 内的称为 inside spaces。该算法会将它们折叠成一个空格,并在行首和行尾,inline 和 inline-block 之间的差异很小(如我的回答中详述)
  • @Ihatecontrolfreaks 从您的头部移除 4px,并将其视为您用键盘敲击的角色之间的空白。暂时忘记背景,将所有空格视为连续序列(仅在内联元素的情况下),然后删除所有空格并仅保留第一个(折叠算法),最后查看第一个在哪里空间位于(第一个内部?最后一个?还是介于两者之间?),您将了解适用的颜色
  • @Ihatecontrolfreaks 正如我在答案中强调的那样,内联块是一个原子内联级框,因此它的内容不是内联块所属的内联格式上下文的一部分。它是一个内联格式化上下文中的不透明框。检查此以获取更多详细信息:stackoverflow.com/a/28537664/8620333