9.5 垂直对齐vertical-align

属性vertical-align设置inline-level元素在当前line box内的垂直对齐方式。vertical-align设置对块级元素无效。

开发错误DevError010:乱用vertical-align。垂直对齐包括多种细分场景,需分清再使用。


9.5.1 对齐方式1:基线对齐

vertical-align: baseline;

vertical-align默认值baseline表示基线对齐,即inline-level元素在line box内基线对齐。

示例代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        body{
            font-family: Arial, Helvetica, sans-serif,'Microsoft Yahei',simsun;
            font-size: 12px;
            line-height: 1.5;
            color: #808080;
        }

        .span1{
            color: #0aaa76;
        }
        .span2{
            color: #4aa6fc;
        }
        .span3{
            color: #ed7d31;
        }
        
        .span1{
            vertical-align: baseline;
        }
    </style>
</head>
<body>
    <div>
        <span class="span1" style="font-size: 12px;">xbjc小步教程</span>
        <span class="span2" style="font-size: 30px;">xbjc小步教程</span>
        <span class="span3" style="font-size: 50px;" >xbjc小步教程</span>
        <span class="span4" style="font-size: 14px;">xiaobuteach.com小步教程</span>
        <span class="span2" style="font-size: 30px;">xbjc小步教程</span>        
    </div>
    <div>第2块</div>
</body>
</html>

运行效果。无论字体大小,各个x的底部对齐。

img


9.5.2 对齐方式2:数值

vertical-align : len;

len表示长度,例如20px。元素相对于原位置上下移动。正值上移,负值下移。

        .span1{
            vertical-align: 30px;
        }

运行效果与示意图

img


9.5.3 对齐方式3:顶部对齐与底部对齐

顶部对齐表示元素顶部与所在line box顶部(bounds top line)对齐。示例代码。

        .span1{
            vertical-align: top;
        }
        .span4{
            vertical-align: top;
        }

运行效果

img

span1与span4分别在所在line box内顶部对齐。底部对齐vertical-align: bottom同理。

基线对齐与数值对齐属于与基线相关,顶部对齐与底部对齐属于与基线无直接相关。


9.5.4 可替换元素

可替换元素包括两种类型。

(1)src类型。img、video、iframe等元素,由src属性指定加载外部文件,元素内容不是HTML代码指定,由外部文件内容进行替换。

特点:表面display: inline但具有inline-block的实质,能够设置宽高。

(2)content类型。伪元素::before与::after通过content属性添加内容,也属于可替换元素。元素内容不在HTML代码定义,而是CSS定义内容进行替换。伪元素可设置display: inline或block,所以可替换元素也分inline-level可替换元素与block-level可替换元素。

有时说可替换元素仅指src类型的可替换元素,不包括content类型。

接下来研究图片这一可替换元素的垂直对齐。


9.5.5 图片img的默认垂直对齐

1、图片的基线

文本在字体设计时有基线,图片有基线吗?可替换元素的基线位置在盒子的底部。

示例代码

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        body {
            font: 20px/1.5 Arial, 微软雅黑;
            margin: 10px;
        }

        .div1 {
            border-top: 1px solid #4aa6fc;
            border-bottom: 1px solid #4aa6fc;
        }

        .span1 {
            border-top: 1px solid #ed7d31;
            border-bottom: 1px solid #ed7d31;
        }

        .image1 {
            width: 100px;
            height: 100px;
        }
    </style>
</head>

<body>
    <div class="div1">
        <span class="span1">gx</span>
        <img class="image1" src="image/no-middle.png">
        <span>xiaobuteach.com</span>
    </div>
</body>

</html>

运行效果

img

当前效果。图片底部作为基线位置进行基线对齐,它与x的底部对齐。

两处空白。图片底部与行盒底部(下方蓝色)存在两段空白间距:第1处是x底部与下方桔线的空白,这是字体设计字符时留白。第2处是下方桔线与下方蓝色的空白,这是因为line-height设置产生行之间的空白L/2。

尽量避免图片出现在IFC。实际项目较少出现文本与图片真正在同一line box的情况,建议尽量使用列式布局或独立块将它们隔离。

IFC去除图片下方空白的方法1:图片设置底部对齐vertical-align: bottom。


2、div内只有图片时下方也存在空白

删除div内其它文本,即div内只放图片元素。

示例代码

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        body {
            font: 20px/1.5 Arial, 微软雅黑;
            margin: 10px;
        }

        .div1 {
            border-top: 1px solid #4aa6fc;
            border-bottom: 1px solid #4aa6fc;
        }

        .image1 {
            width: 100px;
            height: 100px;
        }

    </style>
</head>

<body>
    <div class="div1">
        <img class="image1" src="image/no-middle.png">
    </div>
</body>

</html>

运行效果

img

下方同样会出现基线对齐产生的空白,详情见下节“假想strut”。

去除图片下方空白方法2:当图片单独一行时,设置display: block,不再有IFC及对齐问题。

去除图片下方空白方法3:当图片单独一行时,设置块容器font-size: 0;使strut高度为0。


9.5.6 对齐方式4:垂直居中对齐

一行内的图片与文本需要垂直居中对齐时,使用垂直居中middle。

img

middle表示当前元素(图片)的“中间位置”(即垂直平分线)对齐文本的“中间位置”(即strut的half-x线),图片中间位置与文本中间位置的计算不同,这是CSS按照日常需求所做的设计。half-x线指strut基线位置+x-height高度一半的位置,也就是文本的“中间位置”,x-height高度指小写x顶部到底部的距离。文本的“中间位置”没有采用bounds的垂直平分线位置,符合文本的排版特点;图片的“中间位置”就是垂直平分线位置。

img的居中对齐

.image1{
     vertical-align: middle;
 }

运行效果

img

vertical-align: middle通常应用于图片或inline-block等元素,不会用在inline元素,因为这不符合“中间位置”的设计。middle对齐与基线有关。

开发错误DevError011:将vertical-align: middle乱用于block元素与inline元素(文本)。


9.5.7 对齐的移动错觉

上述示例明明设置图片垂直居中,实际效果是其它inline元素垂直居中,导致移动错觉:vertical-align在某些场景是在设置其它元素的垂直对齐方式?

移动错觉的原因。设值middle使line box发生两次变化:(1)图片居中对齐使line box顶线下移,(2)line box整体上移,形成最终效果。vertical-align含义仍是移动当前元素。