css span 右端对齐_深入理解css之vertical-align

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


vertical-align的各类属性值

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

【1】线类,如 baseline、top、middle、bottom;

【2】文本类,如 text-top、text-bottom;

【3】上标下标类,如 sub、super;

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


线类

baseline,baseline为vertical-align的默认值,其意思是指基线对齐

4aada663ef73fc87fce3f42a49a4fad7.png

我们来看个例子,代码如下:

e534b1ff3b197c34497897daa2f96815.png
d792cce3861c5f3a7c9433e5e553023a.png

效果如下:

bcf436cd16766ce8a38bc31da6c1713a.png

由于baseline是默认值,所以可以不用写

.box的line-height为100px,这其实是给“strut”设置的,简单点说就是每一个行框盒子都有一个看不见的节点,该节点继承了line-height),因此.text对齐于该节点的基线

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

f890de6993825653b0ac8f16fd7494fb.png
a14b56f04bdf8324e47153faf00dbe52.png

效果如下:

9c3a209a3628bc51e06184672b0efed8.png

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

3ed988df20e0ea05bd67f8044a05ac5b.png
e2917bfd4ac672eba4169b41854f3ec6.png

效果如下:

48cfee3814c62fa59e2d3a4db923a1e8.png

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

middle,这个属性值用得比较多。

对于内联元素指的是元素的垂直中心点与行框盒子基线往上1/2x-height处对齐,简单点说就是字母x的中心位置对齐;

对于table-cell元素,指的是单元格填充盒子相对于外面的表格行居中对齐。

基本上所有字体中,字母x的位置都是偏下一点的,font-size越大偏移越明显,因此,字母x中心的位置不是行框盒子的中心,也就是说vertical-align只能实现近似垂直居中对齐。


文本类

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

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

例子如下:

e769cf7e110f378005a23b78e984c902.png
c195672ee5bbe079f93aca5ddb5dc8d5.png

效果如下:

d1cdb90e78028bd04a595b1b0019e771.png

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


上标下标类

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


数值百分比类

vertical-align是支持数值的,并且兼容性也非常好,但大部分开发人员却不知道vertical-align支持数值。

对于数值,正值表示由基线往上偏移,负值表示由基线往下偏移。

而百分比则是基于line-height来计算的,百分比用得比较少,因为line-height一般都是开发人员给出的,这时候数值就可以精确定位元素,不需要再使用百分比再去计算一遍。使用数值的代码如下:

a7172503dcf3a6255b4d4b5e4148b669.png
d855b9e539eb8229917a132848ec6078.png

效果如下:

48d645605bb3465f0557ef9702f8d0b2.png

vertical-align起作用的前提

vertical-align起作用是有前提条件的,这个前提条件就是:只能应用于内联元素以及display值为table-cell的元素。

在css中,有些css属性是会改变元素的display值的,例如float和position: absolute,一旦设置了这两个属性之一,元素的display值就是变为block,因此,vertical-align也就失去了作用。下面这段代码这样写就是错的:

20b0d138e6ede218ef040e4783c5096d.png

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

968d215bac492a6267dd7111439031db.png
793116ca3036a35ae1f86ef8137d621b.png

其实,不是vertical-align无效,而是前面所说的“strut”的影响,

由于.box没有设置line-height,所以“strut”的line-height就非常小,比图片的高度小很多,vertical-align: middle没法发挥作用。

这时给.box一个比较高的line-height,就会看到vertical-align起作用了:

afa1682ee1e79a0e7215568e29d059ff.png

vertical-align与line-height的关系

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

c577274998a64c8c4826cae6cb591fab.png
593d68a02d55b824032200a39af9a0b1.png
b54a5f38d1535882c41b68189b72c271.png

从代码上看,好像.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设置为0font-size设置为0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值