资讯专栏INFORMATION COLUMN

深入理解css之vertical-align

cgh1999520 / 2723人阅读

摘要:但实质上,只要是内联元素,这两个元素都会同时在起作用。而解决方案可以有以下几种元素不使用基线对齐,可以改为对齐元素块状化设置为设置为总结讲解了的各类属性值及其效果起作用的前提是内联元素与都是同时作用在内联元素上的

前言

vertical-align用来指定行内元素(inline)或表格单元格(table-cell)元素的垂直对齐方式。也就是说,对于块级元素,vertical-align是不起作用的。

vertical-align的各类属性值

vertical-align的属性值可以归为以下4类:

线类,如 baseline、top、middle、bottom;

文本类,如 text-top、text-bottom;

上标下标类,如 sub、super;

数值百分比类,如 10px、1em、5%;

线类

baseline,baseline为vertical-align的默认值,其意思是指基线对齐,所谓基线,指的是字母x的下边缘,具体可看前文深入理解css之line-height有讲解到,不懂的小伙伴建议先看看这篇文章。我们来看个例子,代码如下:

.box {
    width: 100px;
    line-height: 100px;
    border: 1px solid #ccc;
}
文本

效果如下:

由于baseline是默认值,所以可以不用写。.box的line-height为100px,这其实是给“strut”设置的(不懂strut概念的可以看看前面的文章深入理解css盒子模型,简单点说就是每一个行框盒子都有一个看不见的节点,该节点继承了line-height),因此.text对齐于该节点的基线(可以想象成这个看不见的节点有一个字母x,而.text就是跟这个字母x的下边缘对齐)

关于baseline,有一个需要注意的地方就是inline-block元素,如果一个inline-block元素,里面没有内联元素,或者overflow不是visible,则该元素的基线是其margin底边缘;否则其基线就是元素里面最后一行内联元素的基线。例子如下:

.text {
    display: inline-block;
    width: 100px;
    height: 100px;
    border: 1px solid #ccc;
}
文本

效果如下:

top,对于内联元素,指的是元素的顶部和当前行框盒子的顶部对齐;对于table-cell元素,指的是元素的顶padding边缘和表格行的顶部对齐。例子如下:

.box {
    width: 100px;
    line-height: 100px;
    border: 1px solid #ccc;
}
.top {
    line-height: normal;
    vertical-align: top;
}
文本

效果如下:

bottom,跟top类似,将顶部换成底部即可。

middle,这个属性值用得比较多。对于内联元素指的是元素的垂直中心点与行框盒子基线往上1/2x-height处对齐,简单点说就是字母x的中心位置对齐;对于table-cell元素,指的是单元格填充盒子相对于外面的表格行居中对齐。基本上所有字体中,字母x的位置都是偏下一点的,font-size越大偏移越明显,因此,字母x中心的位置不是行框盒子的中心,也就是说vertical-align只能实现近似垂直居中对齐。

文本类

text-top,指的是盒子的顶部和父级内容区域的顶部对齐。

text-bottom,指的是盒子的底部和父级内容区域的底部对齐。

例子如下:

.box {
    width: 300px;
    line-height: 100px;
    border: 1px solid #ccc;
    font-size: 20px;
}
.f12 {
    font-size: 12px;
}
.f16 {
    font-size: 16px;
}
.f20 {
    font-size: 20px;
}
.text-top {
    line-height: normal;
    vertical-align: text-top;
    width: 100px;
}
12px 16px 20px

效果如下:

所谓内容区域,可以看成是鼠标选中文字后高亮的背景色区域,上面的例子中,由于父元素设置的是20px,所以图片的vertical-align设置text-top的时候,就可以看成是跟子元素为20px元素的内容区域顶部对齐。

上标下标类

上标和下标对应着两个标签super和sub,super在上面,sub在下面,这两个属性值在数学公式和化学表达式中用得比较多,平时我们开发几乎用不到,也没啥好讲的。

数值百分比类

vertical-align是支持数值的,并且兼容性也非常好,但大部分开发人员却不知道vertical-align支持数值。对于数值,正值表示由基线往上偏移,负值表示由基线往下偏移。而百分比则是基于line-height来计算的,百分比用得比较少,因为line-height一般都是开发人员给出的,这时候数值就可以精确定位元素,不需要再使用百分比再去计算一遍。使用数值的代码如下:

.box {
    width: 300px;
    line-height: 100px;
    border: 1px solid #ccc;
    font-size: 20px;
}
.num {
    line-height: normal;
    vertical-align: 20px;
}
文本

效果如下:

vertical-align起作用的前提

vertical-align起作用是有前提条件的,这个前提条件就是:只能应用于内联元素以及display值为table-cell的元素。在css中,有些css属性是会改变元素的display值的,例如float和position: absolute,一旦设置了这两个属性之一,元素的display值就是变为block,因此,vertical-align也就失去了作用。下面这段代码这样写就是错的:

   span {
        float: left;
        vertical-align: middle; /* 错误,该行代码无效 */
   }

另外,更多人遇到的是以下这种无效的情况:

.box {
    height: 200px;
}
.box > img {
    height: 100px;
    vertical-align: middle;
}

其实,不是vertical-align无效,而是前面所说的“strut”的影响,由于.box没有设置line-height,所以“strut”的line-height就非常小,比图片的高度小很多,vertical-align: middle没法发挥作用。这时给.box一个比较高的line-height,就会看到vertical-align起作用了:

.box {
    height: 200px;
    line-height: 200px;
}
vertical-align与line-height的关系

前面讲了,vertical-align的百分比值是根据line-height来计算的。但实质上,只要是内联元素,这两个元素都会同时在起作用。如下例子:

.box {
    line-height: 32px;
}
.box > span {
    font-size: 24px;
}
文本

效果如下:

从代码上看,好像.box的高度会是32px,但实质上.box的高度会比32px还要高。原因是"strut"继承了line-height: 32px,span也继承了line-height: 32px,但两者的font-size不一样,这就导致了"strut"的font-size比较小,而span的font-size比较大,也就是说它们的基线不在同一位置上,"strut"偏上一点,而span默认又是基线对齐,为此,span总体会往上移以便跟"strut"基线对齐,.box元素就是这样被撑高了。而解决方案可以有以下几种:

span元素不使用基线对齐,可以改为top对齐

span元素块状化

line-height设置为0

font-size设置为0

总结

讲解了vertical-align的各类属性值及其效果

vertical-align起作用的前提是内联元素

vertical-align与line-height都是同时作用在内联元素上的

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/116764.html

相关文章

  • 【学习笔记】CSS深入理解vertical-align

    摘要:上例中,左边盒子的基线为其底边缘,右边盒子的基线为的基线将右边盒子的行高设置为,即这个的高度为,位置处于中间。 vertical-align的值 线类:baseline(默认), top, bottom, middle 文字类:text-top, text-bottom 上标下标类:sub, super 数值:1px, 1em - 在baseline对齐的基础上上下偏移一定数值 百分...

    ermaoL 评论0 收藏0
  • CSS魔法堂:深入理解line-height和vertical-align

    摘要:下的属性值详解以下内容均在中测试默认对齐方式这里作为参考系,而它的就是所要对齐的了。没有任何变化。那改变又如何呢为了让的清晰可见,特意添加一个的包裹着。 前言 一直听说line-height是指两行文本的基线间的距离,然后又说行高等于行距,最近还听说有个叫行间距的家伙,@张鑫旭还说line-height和vertical-align基情四射,贵圈真乱啊。。。。。。于是通过本篇来一探究竟...

    avwu 评论0 收藏0
  • 【学习笔记】CSS深入理解line-height

    摘要:内联盒子的高度由决定,限制包含盒子的高度,两者一致,即把内联盒子安放在包含盒子内,排除其他外界干扰。这时候由内联盒子模型可知,行间距是等分的,中间部分是,达到看似居中的效果。可以得到结论和设置一致,并非是完全垂直,除非为。 张鑫旭的CSS深入理解之line-height学习笔记 line-height的定义 行高:两行文字基线之间的距离 为何是基线:基线是定义所有字线的根本 不同字体...

    Stardustsky 评论0 收藏0
  • 深入理解-CSS内联元素line-height

    摘要:常见问题这一部分我们来说一说常见的内联元素的一些问题。通过设置为,或者使用属性,都可以达到去除内联元素之间的间隙的目的。 showImg(https://segmentfault.com/img/remote/1460000014515131?w=1280&h=608); 上一篇文章我们讨论了font-size,这一篇来说另一个与文字关系密切的属性line-height。这里涉及到了内...

    wapeyang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<