CSS实现垂直居中的问题 - Nicky's blog

February 23rd, 2006

CSS实现垂直居中的问题

Category: CSS, Author: Nicky, Popularity: 8%

看了CSS实现完美垂直居中这篇文章,文中提到的第四种方法和Vertical Centering in CSS这篇文章提到的方法原理一致,这确实是完美解决垂直居中问题的一个方法。但是本文的作者还特别强调那是他个人原创,引用一下他的原文:

我研究 IE layout 模式多年,还是找出了一个可以在IE中绝对居中的方法。这个方法就是基于IE layout的BUG,也可以算以毒攻毒。至于原理,不要问我,这是独门秘学,何况三言两语也讲不清楚,只要好用就行。

既然研究IE的布局都研究了多年,那么我相信了他的实力。但是在二楼我又发现一个“拍砖贴”,点击到它提到的Vertical Centering in CSS文中,也找到了这样一句话“I have found it going home on Wilson street.”,说明老外认为这个是他的原创,而且他还特别申明了原创时的时间和地点,虽然我们无从考证他走在威尔逊大道上是否在想这个问题,但是按文章发布的时间来判断,老外的要早一些,那么这个就变得有趣了。

讨论完原创问题再来研究一下它的原理,按照老外的文章加上我的简单翻译来说明这个方法。

它是利用IE错误的解释了使用百分比计算定位高度的BUG来达到目的。

先定义一个高度400px的DIV,使用相对定位,它的CSS为:

height: 400px
position:
relative;
overflow:
hidden;
background-color:#09C

在里面放一层DIV,使用绝对定位,让它离上面有50%的距离,它的CSS为:

position: absolute
top: 50%;

那么我们再在里面嵌套一个DIV,它的CSS为:

position: relative
top: -50%;
height:40px;

意思就是向上移动“它”一半的高度,但是IE就错误的解释了“它”的高度,计数的高度采用了它内部嵌套内容的高度,但是像这样正好是垂直居中。搞懂了相对定位和绝对定位的道理这个就不难理解了。

如果要使用在IE和Mozilla浏览器中都能完美居中有多种hack方法,作者使用了在需要IE解释的属性前加下划线方法。(display: table是为支持display: table属性的浏览器准备的,它可以得到和使用表格一模一样的效果,也就是vertical-align: middle属性起作用了)

<div style="display: table; height: 400px;  _position: relative; overflow: hidden; background-color:#09C">
    
<div style=" _position: absolute; _top: 50%; display: table-cell; vertical-align: middle;">
      
<div style=" _position: relative; _top: -50%">
        any text
<br>
        any height
<br>
        any content, for example generated from DB
<br>
        everything is vertically centered
      
</div>
    
</div>
</div>

我们还可以使用更好的结构化语句来达到目的,道理是一样的。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
#outer {height: 400px; overflow: hidden; position: relative; background-color:#09C}
#outer[id] {display: table; position: static;}
 
#middle {position: absolute; top: 50%;} /* for explorer only*/
#middle[id] {display: table-cell; vertical-align: middle; position: static;}
 
#inner {position: relative; top: -50%} /* for explorer only */
/* optional: #inner[id] {position: static;} */
</style>
<title>Vertical Centering in CSS</title>
</head>
 
<body>
<div id="outer">
 
<div id="middle">
    
<div id="inner">
      any text
      any height
      any content, for example generated from DB
      everything is vertically centered
    
</div>
 
</div>
</div>
</body>
</html>

预览效果 原文地址

ps:如果遇到图片和文字并排,可以试试给图片一个float:left; vertical-align: middle;属性。

Tags:.
评论数量(10) | Add Comments
本文网址:http://www.osxcn.com/css/vertical-centering.html



10 Comments so far

» You can leave a response or Trackback .

  1. Gravatar Icon LEMONed Says:

    一向是多嵌套个div, 里面的设padding, 里外同时定义height. 总之有很多”手段”能实现. 而他的方法据”目测”后我认为tahoma与verdana下都会有微小的偏差.
    他说的东西似乎并没有多少技术含量, 感觉我这样烂的水平他也不比我好多少. 如果说分享经验那很好, 但这么的自吹自擂太令人反感了.

  2. Gravatar Icon FinalFantasy Says:

    哎,网上这样的人多得去了,知道就好拉……
    对了,Nicky,我的Blog链接怎么没见转过来呀?:(

    已经添加了,呵呵!
    Nicky

  3. Gravatar Icon conan Says:

    没学过CSS,看着脑袋疼

  4. Gravatar Icon LEMONed Says:

    怎么不记得自己发过评论了? 我确实是用里面padding-top来实现, 但两种方法意义不同, 百分比是自动判断的…

  5. Gravatar Icon Nicky Says:

    使整个内容绝对垂直居中是有很多办法,不过使用padding-top还是需要对容器绝对定位来配合,top: 50%;left: 50%;应该是不可少的。如果IE也支持display: table-cell属性就不存在垂直居中的问题了。

  6. Gravatar Icon 奥特曼 Says:

    我看了这帖子之后 以为真的有好的垂直居中的办法,没想到一试_____我靠 大叠眼睛 根本不行! 本人认为何必这么固执呢?不能垂直居中就不要用嘛!
    有另外解决的办法,外部容器不那么大不就行了吗?大不了,多整几个div.
    以后我再也不去寻找居中的方法了!郁闷css样式表3什么出来解决了这个鸟问题啊

  7. Gravatar Icon greensea Says:

    嵌套了2个div,已经背离了表现型与内容相分离了,脱离了xhtml产生的初衷了

  8. Gravatar Icon munn Says:

    漏了left,水平居中要加_left:50% _left:-50%

  9. Gravatar Icon 小C Says:

    不错不错,是个强人。学习

  10. Gravatar Icon ortem Says:

    建议发表一些flex上的css文章,现在这类东西太少了

1 Trackbacks/Pingbacks

leave a reply