我猜你可能对对齐方式的参考对象感到困惑(它是相对于什么对齐的?)。
我会尝试用简单的语言来解释。当使用vertical-align
属性与元素a
一起使用时,您将其与父元素b
相对齐,无论a
的高度如何(b
是参考)。用正确的术语来说,就像这样:
vertical-align
属性可以在两个上下文中使用:
将内联元素框垂直对齐到其包含行框中。例如,它可以用于在文本行中垂直定位<img>
。ref
因此,a
元素是内联元素框,b
元素是包含行框,b
的高度由其行高定义,正如您已经在规范中阅读的那样。
现在让我们考虑您的代码并逐步添加属性。
首先,让我们删除“inline-block”。
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
}
.body span {
background-color: pink;
}
.body .inline-block {
background: orange;
}
.inline-block.text {
vertical-align: text-top;
}
<div class="body">
<span>
words-g
<span class="inline-block text">inline-block</span> words-g w
</span>
</div>
正如您所看到的,内部span与外部span具有相同的height
/line-height
,并且两者都使用相同的font-family
。因此,当使用text-top
作为垂直对齐方式时,从逻辑上讲,我们什么也看不到。
现在让我们向容器添加line-height:2
:
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
line-height:2;
}
.body span {
background-color: pink;
}
.body .inline-block {
background: orange;
}
.inline-block.text {
vertical-align: text-top;
}
<div class="body">
<span>
words-g
<span class="inline-block text">inline-block</span> words-g w
</span>
</div>
在这种情况下,两个 span 都将继承
line-height:2
,因此计算值将为
32px
(
2 * font-size
),这将使顶部参考与文本顶部不同。为了提醒大家注意这一点,这里有一个我之前分享过的图示
ref:
如果我们阅读有关vertical-align
的值text-top
的定义:
将元素的顶部与父元素的字体顶部对齐。
因此,内部的顶部将与外部的文本顶部对齐,这就是为什么它会移动到底部。然后,主容器.body
的高度将不等于32px
,而是更大,因为它将考虑内部的移动(我们将有37px
)。
现在让我们给内部元素添加
inline-block
:
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
line-height:2;
}
.body span {
background-color: pink;
}
.body .inline-block {
background: orange;
}
.inline-block.text {
vertical-align: text-top;
display:inline-block;
}
<div class="body">
<span>
words-g
<span class="inline-block text">inline-block</span> words-g w
</span>
</div>
你会注意到的第一件事是,文字没有移动,但橙色背景覆盖了更大的高度。这是因为我们的元素将作为块容器进行行为,这个高度是文本的line-height
(32px
),它也是上面图像中顶部和底部之间的距离(最初它从text-bottom
到text-top
)。
这也类似于.body
元素的蓝色背景,因为它是一个块元素。试着让.body
元素成为inline
并看看会发生什么。
现在你可以给元素添加一个特定的height
,但不会有任何变化,因为我们相对于父元素进行对齐。你还可以尝试调整vertical-align
的所有值,以观察不同的行为:
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
line-height:2;
margin:5px;
}
.body span {
background-color: pink;
}
.body .inline-block {
background: orange;
}
.inline-block.text {
display:inline-block;
height:50px;
}
<div class="body">
<span>
Align the
<span class="inline-block text" style="
vertical-align: text-top;">top of this</span> with text-top
</span>
</div>
<div class="body">
<span>
Align the
<span class="inline-block text" style="
vertical-align: top;">top of this</span> with top
</span>
</div>
<div class="body">
<span>
align the
<span class="inline-block text" style="
vertical-align: text-bottom;">bottom of this</span> with text-bottom
</span>
</div>
<div class="body">
<span>
align the
<span class="inline-block text" style="
vertical-align: bottom;">bottom of this</span> with bottom
</span>
</div>