作为前端攻城师,在制作Web页面时都有碰到CSS制作水平垂直居中,我想大家都有研究过或者写过,特别的其中的垂直居中,更是让人烦恼。这段时间,我收集了几种不同的方式制作垂直居中方法,但每种方法各有千秋呀,要正确的选择也是一件不容易的事情。我会将这几种方法一一介绍给大家,以供大家参考。或许对于我这样的初学者有一定的帮助。
用CSS来实现元素的垂直居中效果是件苦差事,虽然说实现方法有多种,但有很多方式在某些浏览器下可能无法正常的工作。接下来我们就一起来看看这些不同方法实现垂直居中的各自优点和其不足之处。
方法1: 这种方法用来实现单行垂直居中是相当的简单的,你只要保证元素内容是单行,并且其高度是固定不变的,你只要将其“line-height”设置成和“height”值一样就Ok了。不过这种方法局限性太大,只有单行文本的元素才适用,所以在多行元素中是不能使用这种方法的。
<div class="vertical">content</div>
.vertical {
height: 100px;
line-height: 100px;/*值等于元素高度的值*/
}
优点: 适合在所有浏览器,没有足够空间时,内容不会被切掉
缺点: 仅适合应用在文本和图片上,并且这种方法,当你文本不是单行时,效果极差,差到让你感到恶心。 这种方法对运用在小元素上是非常有用的,比如说让一个button、图片或者单行文本字段。
方法2: 这种方法将在需要给容器设置绝对定位(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的滚动条将不会出现)。 这种方法主要是针对多行元素来进行元素的垂直居中,而并非是此元素的内容垂直居中,这一点先要理解并分开清楚。另外此方法是通过绝对定位来实现的,那么用这种方法实现元素的垂直居中需要注意以下几点:其一元素定位关系到一个相对定位参考,所以要保证元素是相对于哪个为参考坐标;另外需要设置给元素明确定一个高度值并且给元素设置一个负值的margin-top,而且值为元素高度的一半。这里我建议大家给元素定一个宽度值,因为元素进行绝对定位后脱离文档流,其宽度是根据元素内容所占宽度来计算的,为这能让其视觉效果更好,最好给元素定义一个宽度值。
方法3: 方法三是使用的的div模拟表格效果,也就是说将多个<div>的“display”属性设置为禾“table”和“table-cell”,并设置他们的“vertical-align”的属性值为“middle”。
<div id="container">
<div id="content">content</div>
</div>
#container {
height: 300px;
display: table;/*让元素以表格形式渲染*/
}
#content {
display:table-cell;/*让元素以表格的单元素格形式渲染*/
vertical-align: middle;/*使用元素的垂直对齐*/
}
优点: 这种方法不会像前面的两种方法一样,有高度的限制,此方法可以要据元素内容动态的改变高度,从而也就没有空间的限制,元素的内容不会因为没足够的空间而被切断或者出现难看的滚动条。
缺点: 不足之处呢?这种方法只适合现代浏览器,在IE6-7下无法正常运行;
方法4: 这种方法有点新意,用这种方法你需要在居中元素前面放一个空的<div>(块元素就可以),然后设置这个<div>的高度为50%,margin-bottom为元素高度的一半,而且居中元素需要清除浮动。需要注意的是,使用这种方法,如果你的居中元素是放在body中的话,你需要给html,body设置一个“height:100%”的属性。
<body>
<div id="floater"><!--This block have empty content --></div>
<div id="content">Content section</div>
</body>
html,body {height: 100%;}
#floater{
float:left;
height:50%;/*相对于父元素高度的50%*/
margin-bottom: -120px;/*值大小为居中元素高度的一半(240px/2)*/
}
#content {
clear:both;/*清除浮动*/
height: 240px;
position: relative;
}
优点: 这种方法能兼容所有浏览器,在没有足多空间下,内容不会被切掉
缺点: 元素高度被固定死,无法达到内容自适应高度,如果居中元素加上overflow属性,要么元素出现滚动条,要么元素被切掉;另外就是一个不算缺点的缺点,那就是加了一个空标签。
方法5: 这个方法是针对多行内容居中,而且容器高度是可变的,方法很简单,就是给出上下一样的padding值
<div class="columns">
<div class="item">test</div>
</div>
.item {padding-top:30px;padding-bottom:30px;}
优点: 在所有浏览器下能正常工作,支持所有元素,简单易懂,结构清晰
缺点: 使用这种方法不能给容器固定高度,如果固定高度将无法达到效果。
方法6: 正如前面所述,如果元素固定高度后要实现垂直居中,用CSS实现很方便,但对于自适应高度的就比较棘手了。那么第六种方法,要给大家介绍的是使用jQuery的方法
<div class="container">
<p>Centered In The Middle Of The Page With jQuery</p>
</div>
.container{
background-color:#338BC7;
width:270px;
height:150px;
}
$(document).ready(function(){
$(window).resize(function(){
$('.container').css({
position:'absolute',
left: ($(window).width() - $('.container').outerWidth())/2,
top: ($(window).height() - $('.container').outerHeight())/2
});
});
// 最初运行函数
$(window).resize();
});
优点: 这种方法,结构简单,易懂,不需要固定元素的大小。兼容各浏览器。
缺点: 需要调用jQuery,如果不支持js或者用户禁掉了js,那么将无法正常运行,那就是杯具了。