当前位置: 首页 > Web前端 > CSS

深入理解CSS前言vertical-align

时间:2023-03-31 12:42:49 CSS

vertical-align用于指定inline或table-cell元素的垂直对齐方式。也就是说,对于块级元素,vertical-align是不起作用的。vertical-align的各种属性值vertical-align的属性值可以分为以下四类:线型,如baseline、top、middle、bottom;文本类型,例如text-top、text-bottom;上标和下标类型,如sub、super;数字百分比类,例如10px、1em、5%;line类baseline,baseline是vertical-align的默认值,表示基线对齐,所谓baseline是指字母x的下边缘,具体可以参考上一篇文章深入理解CSS的行高。不懂的朋友建议先看这篇文章。我们来看一个例子,代码如下:.box{width:100px;行高:100px;border:1pxsolid#ccc;text

效果如下:由于基线是默认值,所以不是有必要写。.box的line-height是100px,其实是为“strut”设置的。node,继承了line-height),所以.text对齐到节点的基线(可以想象这个不可见的节点有一个字母x,.text对齐到字母x的下边缘)aboutbaseline,需要注意的一件事是inline-block元素。如果一个内联块元素中没有内联元素,或者溢出不可见,则该元素的基线是其外边距的下边缘;否则,它的基线是内联元素的元素基线中的最后一行。示例如下:.text{display:inline-block;宽度:100px;高度:100px;border:1pxsolid#ccc;text
效果如下follows:top,对于行内元素,是指元素的顶部与当前行框的顶部对齐;对于table-cell元素,指的是元素的toppaddingedge与tablerow的顶部对齐。例子如下:.box{width:100px;行高:100px;border:1pxsolid#ccc;}.top{line-height:normal;vertical-align:top;text
效果如下:bottom,和top类似,只是把top换成底端。中,这个属性值用的比较多。对于内联元素,意味着元素的垂直中心点与lineboxbox基线上方的1/2x-height对齐。简单的说就是和字母x的中心位置对齐;对于table-cell元素,它是指单元格padding框相对于外部表格行居中对齐。基本上,在所有的字体中,字母x的位置都偏低一点,font-size越大,偏移越明显。因此,字母x的中心位置并不是linebox的中心,也就是说vertical-align只能实现近似的垂直居中对齐。文本类text-top表示框的顶部与父内容区域的顶部对齐。text-bottom,表示框的底部与父内容区域的底部对齐。例子如下:.box{width:300px;行高:100px;边框:1px实心#ccc;font-size:20px;}.f12{font-size:12px;}.f16{font-size:16px;}.f20{font-size:20px;}.text-top{line-height:normal;垂直对齐:文本顶部;宽度:100px;12px16px20px
效果如下:所谓的内容区域,可以看成是鼠标后高亮的背景色区域选择文本。在上面的例子中,由于父元素设置为20px,所以图片的vertical-align设置为text-top,可以看成是与20px元素的内容区域顶部对齐。上标和下标类上标和下标分别对应两个标签super和sub,super在上,sub在下。这两个属性值在数学公式和化学表达式中使用较多。平时我们开发的差不多,没什么好说的。数值百分比vertical-align支持数值,兼容性很好,但是大部分开发者不知道vertical-align支持数值。对于数值,正值表示从基线向上偏移,负值表示从基线向下偏移。百分比是根据line-height计算的,百分比用的比较少,因为line-height一般都是开发者给定的。这时候数值就可以准确定位元素了,不需要再用百分比去计算了。使用数值的代码如下:.box{width:300px;行高:100px;边框:1px实心#ccc;font-size:20px;}.num{line-height:normal;vertical-align:20px;text效果如下:vertical-align生效的前提vertical-align有它起作用的一个前提条件,这个前提条件是:只能应用于内联元素和显示值为table-cell的元素。在css中,一些css属性会改变元素的显示值,比如float和position:absolute。一旦设置了这两个属性之一,元素的显示值就会变成块状,所以vertical-align也会丢失。发挥了作用。下面这段代码是错误的:span{float:left;垂直对齐:中间;/*error,这行代码无效*/}另外,更多人会遇到以下无效情况:.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;}Text效果如下如下:从代码看.box的高度好像会是32px,但实际上.box的高度会高于32px。原因是“strut”继承了line-height:32px,span也继承了line-height:32px,但是两者的font-size不同,导致“strut”的font-size比较小,而span的font-size比较大,也就是说他们的基线不在同一个位置,“strut”稍微高一点,span默认是和基线对齐的。因此,跨度通常会向上移动以与“支柱”基线对齐。这就是box元素被提升的方式。解决办法可以是:span元素不使用baseline对齐,可以改为top对齐span元素blockline-height设置为0,font-size设置为0的前提下vertical-align的效果就是内联元素的vertical-align和line-height同时作用于内联元素