一. 单行内容垂直居中
元素内容是单行,并且其高度是固定不变,只要给容器设置line-height和height,并使两值相等即可,还可设置overflow:hidden。
HTML
<div class="vertical">content</div>
CSS
.vertical { height: 100px; line-height: 100px;/*值等于元素高度的值*/ }
优点:
1.兼容所有浏览器
2.支持块级和行内元素
缺点:
1.只能显示一行
2.不支持<img>等的居中
二.多行内容垂直居中,且高度可变
只要设置padding-top和padding-bottom的值一致即可。
CSS
.vertical { padding-top:20px; padding-bottom:20px; }
优点:
1. 同时支持块级和内联极元素
2. 支持非文本内容
3. 支持所有浏览器
缺点:
容器不能固定高度
三. 多行元素来进行元素的垂直居中(水平居中同理,就不写了)
这种方法将在需要给容器设置绝对定位(position:absolute),并且定位高度(top:50%)和margin-top为高度的一半(margin-top:-height/2)。
可设置overflow:auto或overflow:hidden。
HTML
<div class="vertical">content</div>
CSS
.vertical { height: 100px;/*元素的高度*/ position: absolute; top: 50%;/*元素的顶部边界离父元素的的位置是父元素高度的一半*/ margin-top: -50px;/*设置元素顶边负边距,大小为元素高度的一半*/ }
优点:
能在各浏览器下工作,结构简单明了,不需增加额外的标签
缺点:
由于固定死元素的高度,致使没有足够的空间,当内容超过容器的大小时,要么会消失,要么会出现滚动条。
四.多行元素垂直居中
div模拟表格单元效果,设置display:table-cell
HTML
<div id="container"> <div id="content">content</div> </div>
CSS
#container { height: 300px; display: table;/*让元素以表格形式渲染*/
} #content { display:table-cell;/*让元素以表格的单元素格形式渲染*/ vertical-align: middle;/*使用元素的垂直对齐*/ }
优点:
此方法可以要据元素内容动态的改变高度,从而也就没有空间的限制,元素的内容不会因为没足够的空间而被切断或者出现滚动条。
缺点:
只适合现代浏览器。但是在IE6-7中是不被支持的,因为display:table-cell在IE6-7中不被支持,那么为了解决这种方法在IE6-7的兼容,需要额外增加一个div,并使用hack,下面我们一起来看看其解决办法。
HTML
<div class="table"> <div class="tableCell"> <div class="content">content</div> </div> </div>
CSS
.table { height: 300px;/*高度值不能少*/ width: 300px;/*宽度值不能少*/ display: table; position: relative; float:left; background:#ccc; } .tableCell { display: table-cell; vertical-align: middle; text-align: center; *position: absolute; *top: 50%; *left: 50%; } .content { *position:relative; *top: -50%; *left: -50%; }
五.单行或多行垂直居中
这种方法是采用的display:inline-block,然后借助另一个元素的高度来实现居中
HTML
<div id="Div1"> <div id="Div2"> <p>I am vertically centered!</p> </div> <div id="Div3"><!-- ie comment --></div> </div>
CSS
html,body{ height: 100%; } #parent { height: 100px;/*定义高度,让线盒型div#extra有一个参照物,可以是固定值,也可以是百分比*/ border: 1px solid red; } #vertically_center, #extra { display: inline-block;/*把元素转为行内块显示*/ vertical-align: middle;/*垂直居中*/ } #extra { height: 100%; /*设置线盒型为父元素的100%高度*/ }
优点:
可以自适应高度,简单易懂
缺点:
需要给元素的父元素设置一个高度,这个高度可以是一个固定值或者百分值高度,另外需要增加一个额外的标签,当作线盒型,如div#extra,并且需要设置其高度为100%。另外就是ie6-7不支持display:inline-block,需要给他们另外写一个样式。
这是一个很有意思的方法,但你要懂得如何使用display。有关于这种方法的操作,大家可以去看一看Jonathan Potter写的《CSS, Vertical Centering》
六.内容垂直居中
HTML
<div id="floater"><!--This block have empty content --></div> <div id="content">Content section</div>
CSS
html,body {height: 100%;} #floater{ height:50%;/*相对于父元素高度的50%*/ margin-bottom: -120px;/*值大小为居中元素高度的一半(240px/2)*/ } #content { height: 240px; position: relative; background:#ccc; }
优点:
这种方法能兼容所有浏览器,在没有足够空间下,内容不会被切掉
缺点:
元素高度被固定死,无法达到内容自适应高度,如果居中元素加上overflow属性,要么元素出现滚动条,要么元素被切掉;另外就是一个不算缺点的缺点,那就是加了一个空标签。
实现的方法很多,实际应用中用哪种方法合适,你可以仔细的对比一下,最后一种方法,代码简单,兼容性好。