打印

[教程] [原创] CSS 实现完美垂直居中!

显示看到很多人一直都问这个问题,不过当时我没当一回事,因为在 CSS 中要垂直居中,多数是在有高度的情况下,或者容器高度不定的情况下才用,看上去比较舒服,而且实现的方法也不少,不一定要拘泥于和 table 布局一样。不过最近有人问了几个例子,看来对此的需求还不少。现在就把我经验拿出来分享一下,希望大家鼓鼓掌

首先,要有一个概念:凡是 table 布局可以实现的,CSS 一定可以实现。CSS 可以实现的,table 未必能做到。

现在来几个例子:

一、单行内容的居中
只考虑单行是最简单的,无论是否给容器固定高度,只要给容器设置 line-heightheight,并使两值相等,再加上 over-flow: hidden 就可以了
复制内容到剪贴板
代码:
.middle-demo-1{
    height: 4em;
    line-height: 4em;
    overflow: hidden;
}
优点:
1. 同时支持块级和内联极元素
2. 支持所有浏览器
缺点:
1. 只能显示一行
2. IE中不支持<img>等的居中
要注意的是:
1. 使用相对高度定义你的 height 和 line-height
2. 不想毁了你的布局的话,overflow: hidden 一定要
为什么?
请比较以下两个例子:

 提示:您可以先修改部分代码再运行
上一个高度是用的绝对单位px,并且没有隐藏溢出,下一个高度用的单位是相对单位em,并且隐藏了溢出。如果你的浏览器支持放大字体,那么尽情地放大字体,看看会出现什么效果。

二、多行内容居中,且容器高度可变
也很简单,给出一致的 padding-bottom 和 padding-top 就行
复制内容到剪贴板
代码:
.middle-demo-2{
    padding-top: 24px;
    padding-bottom: 24px;
}
优点:
1. 同时支持块级和内联极元素
2. 支持非文本内容
3. 支持所有浏览器
缺点:
容器不能固定高度

三、把容器当作表格单元
CSS 提供一系列diplay属性值,包括 display: table, display: table-row, display: table-cell 等,能把元素当作表格单元来显示。这是再加上 vertical-align: middle, 就和表格中的 valign="center" 一样了。
复制内容到剪贴板
代码:
.middle-demo-3{
    display: table-cell;
    height: 300px;
    vertical-align: middle;
}
可惜IE不支持这些属性,不过在其他浏览器上显示效果非常完美。
要注意的是:和一个合法的<td>元素必须在<table>里一样,display: table-cell 元素必须作为 display: table 的元素的子孙出现。
优点:
不用说了吧,就是表格,效果和表格一模一样
缺点:
IE下无效

四、以毒攻毒!用 IE 的 bug 解决 IE 中的绝对居中
先不得不说一句,IE 真的是个很烂的浏览器,CSS1中的定义都不支持,害得要我们转个大圈子来造居中。不过就像我说的,凡是 table 布局可以实现的,CSS 一定可以实现,即使在 IE 里也不例外。我研究 IE layout 模式多年,还是找出了一个可以在 IE 中绝对居中的方法。这个方法就是基于 IE layout 的 bug,也可以算以毒攻毒。至于原理,不要问我,这是独门秘学,何况三言两语也讲不清楚,只要好用就行
复制内容到剪贴板
代码:
.middle-demo-4{
    height: 300px;
    position: relative;
}
.middle-demo-4 div{
    position: absolute;
    top: 50%;
    left: 0;
}
.middle-demo-4 div div{
    position: relative;
    top: -50%;
    left: 0;
}
五、整合三和四,写出支持所有浏览器的垂直居中容器!
思路是利用 IE 和 非IE 浏览器的 CSS hack, 整合三和四的CSS,写出兼容主流浏览器的垂直居中容器。具体代码就不给出了,大家权当作练习练习。例子可以在下面的附录中找到。
最终实测支持的浏览器:IE6+, Mozilla 1.7, Netscape Navigator 8, Opera 8.0+, Firefox 1.0+ 和 Safari 1.0+
IE5 下需要加上对合适模型的补正。
推测支持的浏览器:Mozilla 1.5+, Netscape Navigator 7+, Opera 7+
未测试浏览器:Konqueror

再最后附上自己写的,所有居中布局的范例网页,大家不明白可以参考。

 提示:您可以先修改部分代码再运行
版权所有,欢迎转载,转载请注明出处。
本帖最近评分记录

【原创】CSS 实现完美垂直居中!

【拍砖帖】

第四个方法这里有人研究过:
http://www.jakpsatweb.cz/css/css-vertical-center-solution.html
和楼主不一样的只是针对IE的filter不同,文章里有对这个方法原理的解释。

另外关于居中,这里可能更全一点:
http://www.student.oulu.fi/~laurirai/www/css/middle/

本不想拍你的砖,你辛苦总结了这么多对论坛的朋友肯定有很大帮助,只是我对你这句话的态度非常不爽
引用:
I won't tell you the theory behind all these. It's my top secret, with which I solved a lot of other cross browser layout problems, and I'm not going to share it with you.
如果你不想说,请换种方式表达,或者干脆别提这茬。


另外说一下关于楼主研究多年的“独门密学”,IE的layout模式,这里有篇文章,再次推荐一下,我觉得所有关注网站综合专栏的朋友都应该看看,一是可以了解一下IE这个特性的大概,二也可以自己有针对性的解决一些IE的bug。
http://www.satzansatz.de/cssd/onhavinglayout.html
这篇文章是国外一些人对此总结和摸索的经验,由于IE不是开源的东西,只有慢慢摸索,这篇文章也在不断修订。我不知道楼主对于此了解的情况有多少,没准是微软的员工,看过IE的源码也不一定,但是如果你知道更多,希望你可以和这篇文章的作者联系以充实这个文档,让更多的人了解。

知识在于分享,如果你不愿意分享,也请你至少不要炫耀,这很让人反感。


本帖最近评分记录
http://old9.blogsome.com 已被 GFW 封锁
呵呵,两位狠有意思挖
个人网站 http://rexsong.com
FireFox显示不正常!哈哈~~
易游网-河南旅游社区 www.51hnly.com
易游网-综合搜索 www1.51hnly.com
易游网-上网导航 www2.51hnly.com

另外长期交换友情连接!

TOP

谢谢楼主,顺便拍2楼一下。
不管人家炫耀还是展示,我从这个帖子里学到了东西,你给2个看不懂的英文有什么意思那?

TOP

收藏,以后用得着得时候研究
jgwy-esnak

TOP

收藏了, 谢谢!
可是用了这个之后, 又用滤镜就不起作用了.

TOP

这个还是非常好的呀
谢谢了.

TOP

呵呵,这些方法都见过,8过没总结过

其实也没啥,整个页面都能能垂直居中,哈,还怕这啥

TOP

对于新手来说很不错啊,谢了

TOP

收藏了。楼主 和 2 楼  都谢谢。2楼的有点钻牛角了。呵呵。那原理很多文章都有解释,用css早晚会注意到  毕竟只是ie的bug,不是什么高深的东西  楼主不解释也不会影响实际的效果。

TOP

唉干吗还要是英文啊。。到。

TOP

就是就是,明明知道我们是中国人.还要给几个Enshig..

不过还是谢谢以贴.

TOP

谢谢了。呵。第一条挺实用。
http://shop34029167.taobao.com/

TOP

Table 和 CSS 不是一个概念吧
table是布局 css 是辅助
应该把table与div相比才是

TOP

凡是 table 布局可以实现的,CSS 一定可以实现

为这句顶一个!!!

TOP

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<style>
#div{  width:400px;height:100px;backgroundrange; padding:50 200 50 200 }
</style>
</head>

<body>
<div id="div"><p>jdshcfdsjk</p>
</div>

</body>
</html>

TOP

樓主這句話屌啊:“首先,要有一个概念:凡是 table 布局可以实现的,CSS 一定可以实现。CSS 可以实现的,table 未必能做到。”

試看看這個:
http://bbs.blueidea.com/viewthre ... page%3D1#pid2898729

TOP

支持2楼!
个人Blog:PlanABC   团队Blog:淘宝UED  专注Web前端技术!

TOP

呵呵~~~~

TOP

老贴 怎么老上来哇^唉
无比巨大的理论威力、思想锋芒和战斗精神!

TOP

不错,很具有参考价值!

学习中!~

TOP

呵,楼主够有心的了...顶!
人渣中的战斗机...

TOP

不错很值得顶

TOP

鄙视顶老帖子的

TOP

很不错

收藏了

TOP

引用:
原帖由 old9 于 2006-2-21 02:12 发表
【拍砖帖】

第四个方法这里有人研究过:
http://www.jakpsatweb.cz/css/css-vertical-center-solution.html
和楼主不一样的只是针对IE的filter不同,文章里有对这个方法原理的解释。

另外关于居中,这里可能 ...
兄弟我顶你! 这楼主的话真让人不爽,,不愿意和人分享还在这唧唧歪歪的

TOP

很实用,研究研究!

TOP

不错,最近也遇到这样的问题 了
进步一点

TOP

回复 5# caomeiyash 的帖子

建议好好看下二楼引用的英文,可能你就不会这样说了。

顶二楼。

TOP