打印

[讨论] 大家都对vertical-align的各说各话

最近几天仔细研究了一下vertical-align这个属性,结果让我大吃一惊,这个很“资深”的CSS标准竟然在各个浏览器里面的表现都各不相同。

vertical-align的值有点多,包括 baseline sub supper top text-top bottom text-bottom middle以及各种长度值(%,em,ex等等)。我先给大家看一个我觉得最夸张的值:bottom。代码如下:
复制内容到剪贴板
代码:
p {
    font-size: 18px;
    line-height: 36px;
    font-family: Tahoma, sans-serif;
}
img {
    vertical-align: bottom ;
}
然后大家看一看这段CSS在各个浏览器中的效果(图片是我故意做成那个样子,为了可以看清楚相对位置):











呃,这个结果其实很让人匪夷所思,一般我会认为Firefox会比IE解释得更正确,但是看过Opera之后发现它和IE是一样的,而Safari/Win是站在Firefox那边。说实话,我不知道这是怎么回事。

仔细学习了《CSS权威指南(第二版)》,甚至还去查阅了W3C,然后自己做出一个关于vertical-align的图:



按照W3C的定义,当内联元素的vertical-align设置为:


  • baseline, top, bottom的时候,都是该元素的baseline(或middle, top, bottom)对其周围元素的相同位置,如图片的top和周围文字的top对齐。
  • text-top和text-bottom的时候,是该元素的top(或bottom)对齐周围元素的text-top(或text-bottom)。
  • 长度(%, em, ex)的时候,是基于baseline往上移动,所以正数往上,负数往下。
  • middle的时候,是该元素的中心对齐周围元素的中心。这里“中心”的定义是:图片当然就是height的一半的位置,而文字应该是基于baseline往上移动0.5ex,亦即小写字母“x”的正中心。但是很多浏览器往往把ex这个单位定义为0.5em,以至于其实不一定是x的正中心(以上图为例,x的高度应该是10px,而em是18px,所以两个值不一样)。


但是,即使是按照上面的准则,各个浏览器的解释如此迥异也让我匪夷所思。我也懒得去研究为什么是这样子。总的来说呢,应该就是它们对字体的每一条线的位置的定义都不大一样,所以这个问题不单跟vertical-align有关,而跟浏览器对内联文本和内联图片的结构的解释有很大关系。



最后给大家一个测试页面,可以方面的看看各个浏览器对vertical-align不同值的解释结果。
http://www.mikkolee.com/weblab/001_vertical/

大家可以测试一下其他的值,比如middle或是text-top,也是各个浏览器完全不一样。有什么心得大家来讨论一下吧~~

----------
原文:http://www.mikkolee.com/13
本帖最近评分记录
  • blank 威望 +1 谢谢总结 2008-6-18 09:29
小麦的自习教室:mikkolee.com
真羡慕你这么闲
对楼主认真研究技术的精神表示赞扬
汗。。图片不用那么花吧。。我看了5分钟才分清楚谁是谁... 把html代码贴出来吧,好好研究下

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
代码在帖子最后的那个链接里面。

图片是我的错,应该勾一条边,我博客底色是efefef,所以很容易能分清楚哪个是哪个,放在经典上就白白一片了。sorry~~
小麦的自习教室:mikkolee.com

TOP

引用:
原帖由 shaohua162001 于 2008-6-18 08:08 发表
对楼主认真研究技术的精神表示赞扬
坦率的说,我没有研究,哈哈。还是要指望大家一起努力,看有没有人愿意找出其中的规律。

我自己的态度嘛,决定放弃,以后提醒自己尽量少用它。呵呵。
小麦的自习教室:mikkolee.com

TOP

一般这个属性经常用在表单中,像按钮和文字的垂直居中。
其他的就不怎么用到了。

TOP

个人觉得Firefox和Safari解释更合理。
对于middle、top、bottom差别不大,是浏览器对baseline的解释稍稍不同。
其他的差别太大了,我也弄不懂。

TOP

说实话,以前我只知道top、middle和bottom。
现在看了这个才知道还有text-bottom、text-top等等,这两个在各浏览器的效果还是基本差不多的,学习了

TOP

也就是对写表单时候有用到,学习学习.
web标准:30161876

TOP

其实既然各个关键字的解释差别这么大,在行内需要用vertical-align的时候,直接用长度值是最实用的一个功能。
小麦的自习教室:mikkolee.com

TOP

我现在还不知道vertical-align对什么元素起作用。块元素?还是行内元素?
我设置了vertical-align属性却总是看不到效果

TOP

似乎要看浏览器对行内元素超过行高是怎么处理的。从图上来看,IE和OP会认为行高被图片从下面撑开。所以bottom就到了最下面。FF和Safari认为行高被图片从上面撑开。所以bottom的位置还是接近于文字的

TOP

引用:
原帖由 sunji86614 于 2008-6-23 09:55 发表
似乎要看浏览器对行内元素超过行高是怎么处理的。从图上来看,IE和OP会认为行高被图片从下面撑开。所以bottom就到了最下面。FF和Safari认为行高被图片从上面撑开。所以bottom的位置还是接近于文字的
同学你好像说到问题的关键了

对于文字,CSS标准有严格定义该怎么处理这个问题:用一个叫“半铅条”的概念,也就是下面这张图里面浅灰色的那两块。[line-height]-[font-size]的值再除以2平分到上下。

但是对图片,我好像没注意有什么严格的处理规范。
小麦的自习教室:mikkolee.com

TOP