CSS垂直居中的方法

前端开发过程中,水平垂直居中是比较常用的。下面直接开门见山,看看不同方法实现垂直居中的各自优点和其不足之处。 

1、将“line-height”和“height”设置成一致

这种方法用来实现单行垂直居中是相当的简单的,也挺常用的。你只要保证元素内容是单行,并且其高度是固定不变的,你只要将其“line-height”设置成和“height”值一样就Ok了。不过这种方法局限性太大,只有单行文本的元素才适用,所以在多行元素中是不能使用这种方法的。 

<div class="vertical">content</div>

.vertical { 
height: 100px; 
line-height: 100px;/*值等于元素高度的值*/ 
}

优点:
适合在所有浏览器,没有足够空间时,内容不会被切掉。

缺点: 
仅适合应用在文本和图片上,并且这种方法,当你文本不是单行时,效果极差,差到让你感到恶心。 
这种方法对运用在小元素上是非常有用的,比如说一个button、图片或者单行文本字段。

2、设置容器的绝对定位,根据top和margin-top的值实现

这种方法将在需要给容器设置绝对定位(position:absolute),并且定位高度(top:50%)和margin-top为高度的一半(margin-top:-height/2)。这就意味着使用这种方法来实现垂直居中的效果,那么元素必须要有一个固定的高度。这样一来,你给元素设置了固定高度,如果你又给他设置了“overflow:auto”,那么当元素内容超过容器后,这样元素的就会出现滚动,而不会自适应内容的高度。 

<div class="vertical">content</div>

.vertical { 
height: 100px;/*元素的高度*/ 
position: absolute; 
top: 50%;/*元素的顶部边界离父元素的的位置是父元素高度的一半*/ 
margin-top: -50px;/*设置元素顶边负边距,大小为元素高度的一半*/ 
}

优点: 
能在各浏览器下工作,结构简单明了,不需增加额外的标签 

缺点: 
由于固定死元素的高度,致使没有足够的空间,当内容超过容器的大小时,要么会消失,要么会出现滚动条(如果元素在body内,当用户缩小浏览器窗口时,body的滚动条将不会出现)。 

3、display设置为“table”和“table-cell”实现

使用的的div模拟表格效果,也就是说将多个<div>的“display”属性设置为“table”和“table-cell”,并设置他们的“vertical-align”的属性值为“middle”。

 

<div id="container">
    <div id="content">this is content</div>
</div>

#container { 
height: 300px; 
display: table;/*让元素以表格形式渲染*/ 
} 
#content { 
display:table-cell;/*让元素以表格的单元素格形式渲染*/ 
vertical-align: middle;/*使用元素的垂直对齐*/ 
} 

优点: 
这种方法不会像前面的两种方法一样,有高度的限制,此方法可以要据元素内容动态的改变高度,从而也就没有空间的限制,元素的内容不会因为没足够的空间而被切断或者出现难看的滚动条。 

缺点: 
不足之处呢?这种方法只适合现代浏览器,在IE6-7下无法正常运行;而且较前两者而言,结构也更复杂。 
这种方法在现代浏览器下是非常方便。但是在IE6-7中是不被支持的,因为display:table在IE6-7中不被支持,那么为了解决这种方法在IE6-7的兼容,需要额外增加一个div,并使用hack,其解决办法。

<div class="table"> 
  <div class="tableCell"> 
    <div class="content">content</div> 
  </div> 
</div>

.table { 
height: 300px;/*高度值不能少*/ 
width: 300px;/*宽度值不能少*/ 
display: table; 
position: relative; 
float:left; 
} 
.tableCell { 
display: table-cell; 
vertical-align: middle; 
text-align: center; 
padding: 10px; 
*position: absolute; 
*top: 50%; 
*left: 50%; 
} 
.content { 
*position:relative; 
*top: -50%; 
*left: -50%; 
} 

 4、采用的display:inline-block,然后借助另一个元素的高度来实现居中 

这种方法是采用的display:inline-block,然后借助另一个元素的高度来实现居中

<div id="parent"> 
  <div id="vertically_center"> 
    <p>I am vertically centered!</p> 
  </div> 
  <div id="extra"><!-- ie comment --></div> 
</div> 


<style type="text/css"> 
html, 
body{ 
height: 100%; 
} 
#parent { 
height: 500px;/*定义高度,让线盒型div#extra有一个参照物,可以是固定值,也可以是百分比*/ 
border: 1px solid red; 
} 
#vertically_center, 
#extra { 
display: inline-block;/*把元素转为行内块显示*/ 
vertical-align: middle;/*垂直居中*/ 
} 
#extra { 
height: 100%; /*设置线盒型为父元素的100%高度*/ 
} 
</style> 
<!--[if lt IE 8]> 
<style type="text/css"> 
/*IE6-7不支持display:inline-block,所以在ie6-7另外写一个hack,用来支持ie6-7*/ 
#vertically_center, 
#extra { 
display: inline; 
zoom: 1; 
} 
#extra { 
width: 1px; 
} 
</style> 
<![endif]-->

优点: 
可以自适应高度,简单易懂 

缺点: 
需要给元素的父元素设置一个高度,这个高度可以是一个固定值或者百分值高度,另外需要增加一个额外的标签,当作线盒型,如div#extra,并且需要设置其高度为100%。另外就是ie6-7不支持display:inline-block,需要给他们另外写一个样式。 

5、给出上下一样的padding值

这个方法是针对多行内容居中,而且容器高度是可变的,方法很简单,就是给出上下一样的padding值。

<div class="columns"> 
    <div class="item">test</div> 
</div>

.item {padding-top:30px;padding-bottom:30px;} 

优点: 
在所有浏览器下能正常工作,支持所有元素,简单易懂,结构清晰 

缺点: 
使用这种方法不能给容器固定高度,如果固定高度将无法达到效果。 

6、父容器设置display: flex;

<div class="columns">
    <div class="item">content</div>
</div>

.columns{
display: flex;
-moz-box-pack: center;
justify-content: center;
-moz-box-align: center;
align-items: center;
height: 400px;
width: 400px;
}

优点: 
子元素不用设置宽高,水平垂直都能居中,适合移动端。

缺点: 
很多浏览器不兼容。仅支持IE最新版,其他浏览器要加前缀。

posted @ 2015-08-10 10:28  chakson  阅读(449)  评论(0编辑  收藏  举报