如何垂直居中未知尺寸元素(包括块元素)

 

<!DOCTYPE HTML>

<html>

<head>

<meta  charset="utf-8" />

<style type="text/css">

.wrap {

    width:800px;

height:500px;

text-align:center;

background:#eee;

}

.container {

    display:inline-block;

vertical-align:middle;

border:1px solid #aaa;

}

.edge {

     width:0;

height:100%;

display:inline-block;

vertical-align:middle;

}

</style>

</head>

<body>

<div class="wrap">

<span class="container">  <!– 这里我们使用了一个违背规则的方法,使用span嵌套div。(当然也可以避开) –>

<img src="http://www.baidu.com/img/baidu_logo.gif&quot; alt="" />

<div>hello</div>

</span>

<span class="edge"></span> <!– 引入作为垂直对齐的空标签 –>

</div>

</body>

</html>


 

原文参考:http://www.cssass.com/blog/index.php/2008/36.html

 

之前也有搜集过网络上一些纯CSS的几种方法

下文与以上并无关系。
先说一些(未知尺寸元素)垂直居中的思路:
1. 我们一般会设置height=line-height来使一行内文字(及inline元素)可以垂直居中,那能不能推而广之呢?遗憾,单纯设置外层height=line-height使image等可置换元素垂直居中,在ie6下是行不通的。见小结line-height和vertical-align, image等可置换元素尚且不行,更别提div等块级元素了。
2. 利用display的一个属性:table-cell。其实这个方法用来支持垂直居中,那是舍我其谁啊,可惜的是ie8以下的浏览器并不支持display:table-cell;
我们可以看一下:

我们发现以上代码在ie6,ie7之下并不能完成我们的要求。
这就是为什么本文开头收集的那些方法要极尽怪异之写法,而想要达到全兼容之目的了。

下面,在我们的新方法中,我们得引入一个空标签。

这种方法在http://www.deviantart.com/网站上很早就应用了。不过,人家针对firefox,opera等支持table-cell的浏览器使用display:table-cell;
而只对ie6,7这两个异类使用了空标签来达到效果。

上面代码的注释里我提到了span嵌套div的不规范问题,可以这样修改:

对于上面的display:inline-block稍微解释一下:
ie6,7对display:inline-block其实支持并不完善的。(这也不稀奇,firefox2是完全不支持)
在ie6,7下的inline元素设置display:inline-block能够达到效果,但对于block元素却无能为力。
所以使用了*display:inline;zoom:1来达到display:inline-block的效果。这也是haslayout的“功劳”。

–补充:2011-3-4–
如果文字超过块的宽度,我们发现在ie8下则不能垂直居中了。然而我们知道ie8是支持table-cell的。
所以结合两个方法——结合后的方法是一个比较完美的方法: