[转载]CSS未知高度垂直居中 – Ruby’s Louvre – 博客园.
最近群里这个问题比较热门,决定把我收藏的方法分享大家。在开始时,我们先看一下万能的table实现。
<!doctype html> |
<html lang="en"> |
<head> |
<meta charset="utf-8" /> |
<meta content="IE=8" http-equiv="X-UA-Compatible"/> |
<title>司徒正美 CSS垂直居中</title> |
<style type="text/css"> |
.container{ |
width:500px;/*装饰*/ |
height:500px; |
background:#B9D6FF; |
border: 1px solid #CCC; |
} |
|
</style> |
</head> |
<body> |
<h1>垂直居中 (table)</h1> |
<div class='container'> |
<table width="100%" height="100%"> |
<tr> |
<td align="center" valign="middle"> |
</td> |
</tr> |
</table> |
</div> |
|
</body> |
</html> |
好了,我们看其CSS实现。凡是table能做到的,CSS都能做的,但各浏览器在CSS的差异比较大,因此要兼容它们难度很大。这涉及许多细节, 各种流啊,display的表现效果与CSS hack,IE早些年搞了大堆的私有属性,这也有待我们深一步挖掘。我们先看最简单的实现,背景图片法——
背景图片法
<!doctype html> |
<html> |
<head> |
<title>司徒正美 CSS垂直居中</title> |
<style type="text/css"> |
.container { |
width:500px; |
height:500px; |
line-height:500px; |
background:#B9D6FF url(http://images.cnblogs.com/cnblogs_com/rubylouvre/205314/r_iebug.jpg) no-repeat center center; |
border:1px solid #f00; |
text-align: center; |
} |
</style> |
</head> |
<body> |
<h1>垂直居中(背景图片 法)</h1> |
<div class="container"> |
|
</div> |
</body> |
</html> |
CSS表达式法
<html lang="en"> |
<head> |
<meta charset="utf-8" /> |
<meta content="IE=8" http-equiv="X-UA-Compatible"/> |
<title>司徒正美 CSS垂直居中</title> |
<style type="text/css"> |
.container{ |
/*IE8与标准游览器垂直对齐*/ |
display: table-cell; |
vertical-align:middle; |
width:500px;/*装饰*/ |
height:500px; |
background:#B9D6FF; |
border: 1px solid #CCC; |
} |
.container img{ |
display:block;/*让其 具备盒子模型*/ |
margin:0 auto; |
text-align:center; |
margin-top:expression((500 - this.height )/2);/*让IE567垂直对齐 */ |
} |
</style> |
</head> |
<body> |
<h1>垂直居中(CSS表达 式)</h1> |
<div class="container"> |
</div> |
</body> |
</html> |
绝对定位法
<!doctype html> |
<html lang="en"> |
<head> |
<meta charset="utf-8" /> |
<meta content="IE=8" http-equiv="X-UA-Compatible"/> |
<title>司徒正美 CSS垂直居中</title> |
<style type="text/css"> |
div { |
/*IE8与标准游览器垂直对齐*/ |
display:table-cell; |
vertical-align:middle; |
overflow:hidden; |
position:relative; |
text-align:center; |
width:500px;/*装饰*/ |
height:500px; |
border:1px solid #ccc; |
background:#B9D6FF; |
} |
div p { |
+position:absolute; |
top:50% |
} |
img { |
+position:relative; |
top:-50%; |
left:-50%; |
} |
|
</style> |
</head> |
<body> |
<h1>垂直居中(绝对定位)</h1> |
<div class="container"> |
<p> |
</p> |
</div> |
</body> |
</html> |
display:inline-block法
<!doctype html> |
<html lang="en"> |
<head> |
<meta charset="utf-8" /> |
<meta content="IE=8" http-equiv="X-UA-Compatible"/> |
<title>司徒正美 CSS垂直居中</title> |
<style type="text/css"> |
div { |
display:table-cell; |
vertical-align:middle; |
text-align:center; |
width:500px; |
height:500px; |
background:#B9D6FF; |
border: 1px solid #CCC; |
} |
</style> |
<!--[if IE]> |
<style type="text/css"> |
i { |
display:inline-block; |
height:100%; |
vertical-align:middle |
} |
img { |
vertical-align:middle |
} |
</style> |
<![endif]--> |
|
</head> |
<body> |
<h1>垂直居中(inline- block法)</h1> |
<div class="container"> |
<i></i> |
</div> |
</body> |
</html> |
writing-mode法
<!doctype html> |
<html lang="en"> |
<head> |
<meta charset="utf-8" /> |
<meta content="IE=8" http-equiv="X-UA-Compatible"/> |
<title>司徒正美 CSS垂直居中</title> |
<style type="text/css"> |
div{ |
width:500px; |
height:500px; |
line-height:500px; |
text-align:center; |
background:#B9D6FF; |
border:1px solid #f00; |
} |
div span{ |
height:100%\9; |
writing-mode:tb-rl\9; |
} |
div img{ |
vertical-align:middle |
} |
</style> |
</head> |
<body> |
<h1>垂直居中(writing- mode法)</h1> |
<div class="container"> |
<span> |
</span> |
</div> |
</body> |
</html> |
记得淘宝也搞一个font-size法,但我觉得上下差异比较大,就不收录了。怿飞的博客亦提到过一韩国人有个巧妙的实现,但日久链接失效了,谁收 藏了也请提供一下。
Mikel