【问题标题】:Why inline and inline-block have different height with the same text content为什么 inline 和 inline-block 具有相同的文本内容的不同高度
【发布时间】:2020-12-25 15:34:23
【问题描述】:

在下面的代码中:

<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
<span class="d-inline" style="border: 1px red solid; padding: 3px 0"><span>asbbb</span></span>
  <span class="d-inline-block ml-2" style="border: 1px blue solid; padding: 3px 0;"><span>inline-block</span></span>
<div>
  
<br/>
  <span class="d-inline badge" style="border: 1px red solid"><span>asbbb</span></span>
  <span class="d-inline-block badge ml-2" style="border: 1px blue solid"><span>inline-block</span></span>
</div>

我创建了两行以在同一行中显示inlineinline-block 之间的高度差。

第一行显示inline-blockinline 兄弟高一点。

在第二行中,我向两者都添加了引导类 badge,它显示 inline 元素比它的 inline-block 兄弟元素高一点。

对于这两行,我可以从 DevTools 中看到内部 span 具有相同的高度,但它们最终与它们的父容器具有不同的高度。

不知道display这两个类型的高度是怎么计算的?

【问题讨论】:

  • 您阅读规范了吗?
  • @connexo 是的,我在 MDN 上阅读了那个,但无法找到它的定义。如果您能指出另一个更详细的地方,不胜感激:)
  • @JunlongWang 内部span的高度会因为大小相同。但是具有类的外部span 的高度几乎没有什么不同。另外,如果您想知道它们中的高度和宽度是如何受到影响的,请查看我的回答。
  • 虽然其他答案值得赞赏,但它们更多地解释了inlineinline-block 之间的区别,这不在我的问题范围内。我认为@temani 给出了最相关的答案,有助于我理解。

标签: html css


【解决方案1】:

这与line-height的工作原理以及每个元素的高度如何计算有关。

让我们从一个简单的例子开始突出line-height的效果

span {
  border:1px solid red;
  padding:5px;
  line-height:50px;
}
&lt;span&gt;some text&lt;/span&gt; &lt;span style="display:inline-block"&gt;some text&lt;/span&gt;

注意在第二种情况下高度如何变大,但在第一种情况下没有。

在内容由行内元素组成的块容器元素上,line-height指定元素内行框的最小高度ref

以上内容适用于inline-block 元素,很明显 line-height 会增加高度。更准确地说,内联块的高度是其行框高度的总和,在您的情况下,我们只有一个使用 line-height 值定义。

在不可替换的内联元素上,'line-height' 指定用于计算行框高度的高度。

以上适用于inline元素,其中line-height不会增加高度,只会增加其所属行框的高度

span {
  border:1px solid red;
  padding:5px;
}
<div style="border:1px solid blue;">
<span>some text</span>
</div>
<br>
<div style="border:1px solid blue;">
<span style="line-height:100px;">some text</span>
</div>

要识别内联元素的高度,这有点棘手,因为它取决于字体属性,并且在规范的另一部分中有所介绍:

“高度”属性不适用。 内容区域的高度应以字体为准,但本规范并未具体说明如何。例如,UA 可以使用 em-box 或字体的最大升序和降序。 (后者将确保部分高于或低于 em-box 的字形仍在内容区域内,但会导致不同字体的不同大小的框;前者将确保作者可以控制相对于“行高”的背景样式,但会导致在其内容区域之外绘制字形。)ref


考虑到这一点,我们可以确定每个人的高度。

第一行:

  1. 内联块继承了line-height:1.5font-size:1rem,所以我们将得到一个等于1.5x1rem = 1.5x16px = 24px 的行框高度。我们添加填充/边框以获得32px
  2. 内联元素获得的字体内容高度等于21px1 并添加填充/边框我们得到29px

对于第二行,.badge 将应用 font-size: 75%;line-height: 1; 所以

  1. inline-block 将得到1x1remx0.75 = 0.75x16px = 12px 和边框/填充我们得到20px

  2. 内联元素在逻辑上将拥有前一个内容区域的 75%,因此 0.75x21px = 15.75px 和边框/填充我们得到 23.75px ~ 24px


1为了确定内容区域的计算方式,您需要了解字体的设计方式并找到一些复杂指标。

下面是一些可以帮助你的相关问题:

What determines the space between the highest and lowest letter and the top and bottom border of the element the letter's in?

How can I calculate the size of font when using different font-types?


关于高度计算的另一个相关问题:How to determine height of content-box of a block and inline element

【讨论】:

  • 嗨@TemaniAfif。对我来说,缺少的一点是内联块的高度是如何从行高形成的。也就是说,高度是它包含的行框堆栈的高度之和,加上围绕该堆栈的内联块的填充和边框。
  • @Alohci 没错,我考虑了一个行框并在那部分快速进行。将更新更多细节,谢谢。
  • 虽然其他答案值得赞赏,但它们更多地解释了inlineinline-block 之间的区别,这不在我的问题范围内。我认为 Temani 给出了最相关的答案,有助于我理解。
【解决方案2】:

规则 1:您不能为 display: inline; 元素设置 heightwidth

规则 2line-height 属性不适用于 display: inline-block; 元素,而是应用于它的子元素。

第一种情况:
body 上设置的 line-height: 1.5 属性会影响您的两个 span 元素。
对于inline 跨度,即使应用了line-height,您的元素的高度也不会因为上面的规则1而改变。
对于inline-block 跨度,它不会应用于它,而是应用于其子元素,在您的情况下,由于规则2,它是另一个span 元素。由于 line-height 被应用到它的子元素,高度增加了,因为它的父元素是 inline-block 元素,所以高度被应用到它,这就是为什么你会看到高度有一点增加。

在第二种情况下:
引导徽章类已经包含一个 line-height: 1 属性,它覆盖了您身体的 line-height: 1.5 属性。
对于 inline 跨度,由于 规则 1,没有任何影响。
但是,对于 inline-block 跨度,而不是主体的 line-height: 1.5,徽章类 line-height: 1 被应用于其内部跨度元素,因此您会看到与第一种情况相比它的高度更小。

注意:虽然inline 元素不尊重高度和宽度,但它们尊重元素的左右填充属性。

【讨论】:

  • line-height 属性不适用于显示:inline-block;元素,而是将它应用到它的子元素。 --> 确实如此。行高适用于块容器,这是 inline-block (w3.org/TR/CSS2/visudet.html#propdef-line-height) 的情况,但你应该注意它是继承的,所以所有子元素都会继承它,这里我们遵循内联元素的规则
  • 感谢@dhruwlalan 的回复,我认为line-height 适用于inlineinline-block,因为它可以在开发工具中看到。另外,我的链接中的两行示例中没有指定height,所以我认为height 没有在这里做的事情。
【解决方案3】:

inlineinline-block 的主要区别在于后者允许在元素上设置宽度和高度。此外,对于display: inline,不考虑顶部和底部边距和填充,而对于display: inline-block,它们是。不一样

display: inline

span.box {
  display: inline;  /* the default for span */
  width: 100px;
  height: 160px;
  padding: 18px;
  border: 3px dashed red;
}
<p>Lorem, ipsum dolor sit amet <span class="box">Inline!</span> consectetur adipisicing elit. Qui,<span class="box">Inline again!</span> itaque sit incidunt totam harum ratione nulla. Labore quis eligendi aperiam laborum harum. Perferendis, laborum unde.
  Tenetur eveniet praesentium corporis perspiciatis?</p>

display: inline-block

span.box {
  display: inline-block;
  width: 100px;
  height: 160px;
  padding: 18px;
  border: 3px dashed red;
}
<p>Lorem, ipsum dolor sit amet <span class="box">Inline-block!</span> consectetur adipisicing elit. Qui,<span class="box">Inline-block again!</span> itaque sit incidunt totam harum ratione nulla. Labore quis eligendi aperiam laborum harum. Perferendis, laborum unde.
  Tenetur eveniet praesentium corporis perspiciatis?</p>

注意inline-block 的高度和宽度是如何保留的。

【讨论】:

  • 嗨 Shounak,感谢您的回答。我确实知道这些事实,但我认为在我的示例中,它们没有指定height,并且除了display 之外,它们都具有相同的属性值,这会导致与它们的父母一起出现身高差异。
  • @JunlongWang 可能是因为 Bootstrap 的默认样式。
  • 好吧,我已经检查了badge 类的默认样式,这不是背后的原因。这不应该是原因,因为它们都是相同的标签,并且应用了相同的引导样式类。
猜你喜欢
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2013-07-04
  • 2014-01-02
相关资源
最近更新 更多