CSS制作水平垂直居中對(duì)齊 多種方式各有千秋
發(fā)布時(shí)間:2013-09-06 17:24:01 作者:佚名
我要評(píng)論
在制作Web頁(yè)面時(shí)都有碰到CSS制作水平垂直居中,我想大家都有研究過(guò)或者寫(xiě)過(guò),平時(shí)工作收集了幾種不同的方式制作垂直居中方法,但每種方法各有千秋在此與大家分享或許對(duì)初學(xué)者有所幫助
作為前端攻城師,在制作Web頁(yè)面時(shí)都有碰到CSS制作水平垂直居中,我想大家都有研究過(guò)或者寫(xiě)過(guò),特別的其中的垂直居中,更是讓人煩惱。這段時(shí)間,我收集了幾種不同的方式制作垂直居中方法,但每種方法各有千秋呀,要正確的選擇也是一件不容易的事情。我會(huì)將這幾種方法一一介紹給大家,以供大家參考?;蛟S對(duì)于我這樣的初學(xué)者有一定的幫助。
用CSS來(lái)實(shí)現(xiàn)元素的垂直居中效果是件苦差事,雖然說(shuō)實(shí)現(xiàn)方法有多種,但有很多方式在某些瀏覽器下可能無(wú)法正常的工作。接下來(lái)我們就一起來(lái)看看這些不同方法實(shí)現(xiàn)垂直居中的各自?xún)?yōu)點(diǎn)和其不足之處。
方法一:
這種方法用來(lái)實(shí)現(xiàn)單行垂直居中是相當(dāng)?shù)暮?jiǎn)單的,你只要保證元素內(nèi)容是單行,并且其高度是固定不變的,你只要將其“line-height”設(shè)置成和“height”值一樣就Ok了。不過(guò)這種方法局限性太大,只有單行文本的元素才適用,所以在多行元素中是不能使用這種方法的。
Html Markup
<div class="vertical">content</div>
CSS Code:
.vertical {
height: 100px;
line-height: 100px;/*值等于元素高度的值*/
}
優(yōu)點(diǎn):
適合在所有瀏覽器,沒(méi)有足夠空間時(shí),內(nèi)容不會(huì)被切掉
缺點(diǎn):
僅適合應(yīng)用在文本和圖片上,并且這種方法,當(dāng)你文本不是單行時(shí),效果極差,差到讓你感到惡心。
這種方法對(duì)運(yùn)用在小元素上是非常有用的,比如說(shuō)讓一個(gè)button、圖片或者單行文本字段。
方法二:
這種方法將在需要給容器設(shè)置絕對(duì)定位(position:absolute),并且定位高度(top:50%)和margin-top為高度的一半(margin-top:-height/2)。這就意味著使用這種方法來(lái)實(shí)現(xiàn)垂直居中的效果,那么元素必須要有一個(gè)固定的高度。這樣一來(lái),你給元素設(shè)置了固定高度,如果你又給他設(shè)置了“overflow:auto”,那么當(dāng)元素內(nèi)容超過(guò)容器后,這樣元素的就會(huì)出現(xiàn)滾動(dòng),而不會(huì)自適應(yīng)內(nèi)容的高度。
HTML Markup
<div class="vertical">content</div>
CSS Code
.vertical {
height: 100px;/*元素的高度*/
position: absolute;
top: 50%;/*元素的頂部邊界離父元素的的位置是父元素高度的一半*/
margin-top: -50px;/*設(shè)置元素頂邊負(fù)邊距,大小為元素高度的一半*/
}
優(yōu)點(diǎn):
能在各瀏覽器下工作,結(jié)構(gòu)簡(jiǎn)單明了,不需增加額外的標(biāo)簽
缺點(diǎn):
由于固定死元素的高度,致使沒(méi)有足哆的空間,當(dāng)內(nèi)容超過(guò)容器的大小時(shí),要么會(huì)消息,要么會(huì)出現(xiàn)滾動(dòng)條(如果元素在body內(nèi),當(dāng)用戶(hù)縮小瀏覽器窗口時(shí),body的滾動(dòng)條將不會(huì)出現(xiàn))。
這種方法主要是針對(duì)多行元素來(lái)進(jìn)行元素的垂直居中,而并非是此元素的內(nèi)容垂直居中,這一點(diǎn)先要理解并分開(kāi)清楚。另外此方法是通過(guò)絕對(duì)定位來(lái)實(shí)現(xiàn)的,那么用這種方法實(shí)現(xiàn)元素的垂直居中需要注意以下幾點(diǎn):其一元素定位關(guān)系到一個(gè)相對(duì)定位參考,所以要保證元素是相對(duì)于哪個(gè)為參考坐標(biāo);另外需要設(shè)置給元素明確定一個(gè)高度值并且給元素設(shè)置一個(gè)負(fù)值的margin-top,而且值為元素高度的一半。這里我建議大家給元素定一個(gè)寬度值,因?yàn)樵剡M(jìn)行絕對(duì)定位后脫離文檔流,其寬度是根據(jù)元素內(nèi)容所占寬度來(lái)計(jì)算的,為這能讓其視覺(jué)效果更好,最好給元素定義一個(gè)寬度值。
根據(jù)這種方法,我們稍作修改就能使元素不單是垂直居中,而且還可以水平居中,如:
HTML Markup
<div id="wrap">test</div>
CSS Code
#wrap {
width: 200px;/*元素的寬度*/
height:200px;/*元素的高度*/
position: absolute;
left: 50%;/*配合margin-left的負(fù)值實(shí)現(xiàn)水平居中*/
margin-left: -100px;/*值的大小等于元素寬度的一半*/
top:50%;/*配合margin-top的負(fù)值實(shí)現(xiàn)垂直居中*/
margin-top: -100px;/*值的大小等于元素高度的一半*/
}
這種方法可以實(shí)現(xiàn)元素的水平垂直居中,常用于頁(yè)面在最中間的布局,使用這種方法一定要把握?。?font color="#ff0000">水平垂直居中的元素要有明確的大小(換句話說(shuō)就是要有確切的寬和高度值);給元素進(jìn)行絕對(duì)定位,并設(shè)置left,top值為“50%”(此處最好使用 對(duì)定位,如果只是單單水平居中,此處可以換成相對(duì)定位);最后設(shè)置margin-top和margin-left的負(fù)值,而且其值分別為元素高度和寬度的一半。
方法三:
方法三是使用的的div模擬表格效果,也就是說(shuō)將多個(gè)<div>的“display”屬性設(shè)置為禾“table”和“table-cell”,并設(shè)置他們的“vertical-align”的屬性值為“middle”。有關(guān)于“display:table”更多的介紹可以點(diǎn)擊這里或者去閱讀Quirksmode的《The display declaration》一文。
HTML Code
<div id="container">
<div id="content">content</div>
</div>
CSS Code
#container {
height: 300px;
display: table;/*讓元素以表格形式渲染*/
}
#content {
display:table-cell;/*讓元素以表格的單元素格形式渲染*/
vertical-align: middle;/*使用元素的垂直對(duì)齊*/
}
優(yōu)點(diǎn):
這種方法不會(huì)像前面的兩種方法一樣,有高度的限制,此方法可以要據(jù)元素內(nèi)容動(dòng)態(tài)的改變高度,從而也就沒(méi)有空間的限制,元素的內(nèi)容不會(huì)因?yàn)闆](méi)足夠的空間而被切斷或者出現(xiàn)難看的滾動(dòng)條。
缺點(diǎn):
不足之處呢?這種方法只適合現(xiàn)代瀏覽器,在IE6-7下無(wú)法正常運(yùn)行;而且較前兩者而言,結(jié)構(gòu)也更復(fù)雜。
這種方法在現(xiàn)代瀏覽器下是非常方便。但是在IE6-7中是不被支持的,因?yàn)閐isplay:table在IE6-7中不被支持,那么為了解決這種方法在IE6-7的兼容,需要額外增加一個(gè)div,并使用hack,下面我們一起來(lái)看看其解決辦法。
HTML Markup
<div class="table">
<div class="tableCell">
<div class="content">content</div>
</div>
</div>
CSS Code
.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%;
}
方法四:
這種方法有點(diǎn)新意,用這種方法你需要在居中元素前面放一個(gè)空的<div>(塊元素就可以),然后設(shè)置這個(gè)<div>的高度為50%,margin-bottom為元素高度的一半,而且居中元素需要清除浮動(dòng)。需要注意的是,使用這種方法,如果你的居中元素是放在body中的話,你需要給html,body設(shè)置一個(gè)“height:100%”的屬性。
HTML Markup
<body>
<div id="floater"><!--This block have empty content --></div>
<div id="content">Content section</div>
</body>
CSS Code
html,body {height: 100%;}
#floater{
float:left;
height:50%;/*相對(duì)于父元素高度的50%*/
margin-bottom: -120px;/*值大小為居中元素高度的一半(240px/2)*/
}
#content {
clear:both;/*清除浮動(dòng)*/
height: 240px;
position: relative;
}
優(yōu)點(diǎn):
這種方法能兼容所有瀏覽器,在沒(méi)有足哆空間下,內(nèi)容不會(huì)被切掉
缺點(diǎn):
元素高度被固定死,無(wú)法達(dá)到內(nèi)容自適應(yīng)高度,如果居中元素加上overflow屬性,要么元素出現(xiàn)滾動(dòng)條,要么元素被切掉;另外就是一個(gè)不算缺點(diǎn)的缺點(diǎn),那就是加了一個(gè)空標(biāo)簽。
方法五:
這種方法和方法三一樣使用display:table-cell來(lái)實(shí)現(xiàn),不過(guò)方法五不同之處是這個(gè)方法我們需要一個(gè)線盒型,用來(lái)實(shí)現(xiàn)IE下的效果,需要增加一上行內(nèi)標(biāo)簽比如說(shuō)“span”(此處最好使用行內(nèi)標(biāo)簽,千萬(wàn)不要使用塊標(biāo)簽,因?yàn)槭褂脡K標(biāo)簽會(huì)沒(méi)有效果),并把這個(gè)線盒型高度設(shè)置為100%,其實(shí)現(xiàn)原理大家可以去閱讀《大小不固定的圖片、多行文字的水平垂直居中》。
HTML Markup
<p class="table">
<span class="tableCell">Centering multiple lines
in a block container.</span>
<!--[if lte IE 7]><b></b><![endif]-->
</p>
CSS Code
<style type="text/css">
.table {
border: 1px solid orange;
display: table;
height: 200px;
width: 200px;
text-align: center;
}
.tableCell {
display: table-cell;
vertical-align: middle;
}
</style>
<!--[if lte ie 7]>
<style type="text/css">
.tableCell {
display: inline-block;
}
b {
display: inline-block;
height: 100%;
vertical-align: middle;
width: 1px;
}
</style>
<![endif]-->
優(yōu)點(diǎn):
這種方法的優(yōu)點(diǎn)和方法三是一樣的,不會(huì)有高度的限制。
缺點(diǎn):
不好的地方就是這種方法為了讓IE運(yùn)行正常,需要額外增加一些標(biāo)簽,另外就是線盒型的標(biāo)簽種類(lèi)有限制。不過(guò)用起來(lái)還是蠻方便的。
方法六:
這種方法是采用的display:inline-block,然后借助另一個(gè)元素的高度來(lái)實(shí)現(xiàn)居中
Html Markup
<div id="parent">
<div id="vertically_center">
<p>I am vertically centered!</p>
</div>
<div id="extra"><!-- ie comment --></div>
</div>
CSS Code
<style type="text/css">
html,
body{
height: 100%;
}
#parent {
height: 500px;/*定義高度,讓線盒型div#extra有一個(gè)參照物,可以是固定值,也可以是百分比*/
border: 1px solid red;
}
#vertically_center,
#extra {
display: inline-block;/*把元素轉(zhuǎn)為行內(nèi)塊顯示*/
vertical-align: middle;/*垂直居中*/
}
#extra {
height: 100%; /*設(shè)置線盒型為父元素的100%高度*/
}
</style>
<!--[if lt IE 8]>
<style type="text/css">
/*IE6-7不支持display:inline-block,所以在ie6-7另外寫(xiě)一個(gè)hack,用來(lái)支持ie6-7*/
#vertically_center,
#extra {
display: inline;
zoom: 1;
}
#extra {
width: 1px;
}
</style>
<![endif]-->
優(yōu)點(diǎn):
可以自適應(yīng)高度,簡(jiǎn)單易懂
缺點(diǎn):
需要給元素的父元素設(shè)置一個(gè)高度,這個(gè)高度可以是一個(gè)固定值或者百分值高度,另外需要增加一個(gè)額外的標(biāo)簽,當(dāng)作線盒型,如div#extra,并且需要設(shè)置其高度為100%。另外就是ie6-7不支持display:inline-block,需要給他們另外寫(xiě)一個(gè)樣式。
這是一個(gè)很有意思的方法,但你要懂得如何使用display。有關(guān)于這種方法的操作,大家可以去看一看Jonathan Potter寫(xiě)的《CSS, Vertical Centering》。
方法七:
這個(gè)方法是針對(duì)多行內(nèi)容居中,而且容器高度是可變的,方法很簡(jiǎn)單,就是給出上下一樣的padding值
Html Code
<div class="columns">
<div class="item">test</div>
</div>
CSS Code
.item {padding-top:30px;padding-bottom:30px;}
優(yōu)點(diǎn):
在所有瀏覽器下能正常工作,支持所有元素,簡(jiǎn)單易懂,結(jié)構(gòu)清晰
缺點(diǎn):
使用這種方法不能給容器固定高度,如果固定高度將無(wú)法達(dá)到效果。
方法八:
正如前面所述,如果元素固定高度后要實(shí)現(xiàn)垂直居中,用CSS實(shí)現(xiàn)很方便,但對(duì)于自適應(yīng)高度的就比較棘手了。那么第七種方法,要給大家介紹的是使用jQuery的方法
Html Markup
<div class="container">
<p>Centered In The Middle Of The Page With jQuery</p>
</div>
CSS Code
.container{
background-color:#338BC7;
width:270px;
height:150px;
}
jQuery Code
$(document).ready(function(){
$(window).resize(function(){
$('.container').css({
position:'absolute',
left: ($(window).width() - $('.container').outerWidth())/2,
top: ($(window).height() - $('.container').outerHeight())/2
});
});
// 最初運(yùn)行函數(shù)
$(window).resize();
});
優(yōu)點(diǎn):
這種方法,結(jié)構(gòu)簡(jiǎn)單,易懂,不需要固定元素的大小。兼容各瀏覽器。
缺點(diǎn):
需要調(diào)用jQuery,如果不支持js或者用戶(hù)禁掉了js,那么將無(wú)法正常運(yùn)行,那就是杯具了。
上面這種方法對(duì)實(shí)現(xiàn)頁(yè)面居中布局很方便,下面我根據(jù)上面的思路和方法二寫(xiě)了一個(gè)實(shí)現(xiàn)元素水平垂直居中的小插件
jQuery Plugin
(function($){
$.fn.vhAlign = function(){
return this.each(function(i){
//獲取元素的內(nèi)容高度
var h = Math.ceil($(this).height());
//outerHeight=padding+border+height
var oh = Math.ceil($(this).outerHeight());
//取得margin-top值
var mt = Math.ceil(oh / 2);
//取得元素寬度
var w = Math.ceil($(this).width());
//outerWidth=padding+border+width
var ow = Math.ceil($(this).outerWidth());
//取得margin-left
var ml = Math.ceil(ow / 2);
//實(shí)現(xiàn)元素居中效果
$(this).css({
"margin-top": "-" + mt + "px",
"top": "50%",
"margin-left": "-" + ml + "px",
"left": "50%",
"width":w,
"height":h,
"position": "absolute"
});
});
};
})(jQuery);
Html Markup
<div class="wrap">
<p>test jquery</p>
</div>
接下來(lái)需要調(diào)用剛才寫(xiě)好的jQuery插件
<script type="text/javascript" src="vhAlign.js"></script>
最后需要在div.wrap調(diào)用這個(gè)function
<script type="text/javascript">
$(document).ready(function(){
$(".wrap").vhAlign();
});
</script>
這里有一點(diǎn)需要特別注意,如果元素不是相對(duì)于body居中,那么需要在其父元素中進(jìn)行相對(duì)定位。
上面我們一起見(jiàn)證了八種不同方法實(shí)現(xiàn)元素的垂直居中效果,下面我們?cè)诤?jiǎn)單的看一下如何實(shí)現(xiàn)元素的水平居中(其實(shí)上面有一些效果也實(shí)現(xiàn)了水平居中,你可以慢慢回想一下)。
方法一:
這種方法主要使用margin: auto配合元素的width來(lái)實(shí)現(xiàn)水平居中的效果
Html Markup
<div class="horizontal">content</div>
CSS Code:
.horizontal {
width: 200px;
margin: 0 auto;
}
使用上面方法實(shí)現(xiàn)元素水平居中一定要讓元素滿(mǎn)足兩個(gè)條件:其一,元素需要有一個(gè)固定寬度值;其二元素的margin-left和margin-right都必須設(shè)置為auto,這兩個(gè)條件少了任何一個(gè)都無(wú)法讓元素達(dá)到水平居中的效果。此方法使用水平居中,支持所有瀏覽器運(yùn)行,因此他也常用來(lái)實(shí)現(xiàn)Web頁(yè)面水平居中的布局效果,如果用在布局,需要注意IE下的效果,換句話說(shuō),如果你的Web頁(yè)面沒(méi)有明確聲明"!DOCTYPE",那么在IE也會(huì)以怪異模式解析你的Web頁(yè)面,此時(shí)上面這種辦法將無(wú)法讓你的頁(yè)面實(shí)現(xiàn)水平居中,但你可以使用下面這種方法解決這個(gè)bug。
Html Code:
<div class="container"> 頁(yè)面內(nèi)容。... </div>
CSS Code:
body {
text-align: center;/*實(shí)現(xiàn)IE在怪異模式下頁(yè)面水平居中*/
}
.container {
text-align: left;/*讓文本恢復(fù)到左對(duì)齊*/
width: 960px;/*設(shè)置頁(yè)面總寬度*/
margin: 0 auto;/*使頁(yè)面水平居中對(duì)齊*/
}
方法二:
實(shí)現(xiàn)固定寬度的水平居中,我們還可以使用絕對(duì)定位配合負(fù)的margin來(lái)實(shí)現(xiàn),具體代碼如下:
Html Markup
<div class="horizontal">content</div>
CSS Code:
.horizontal {
width: 960px;
position: absolute;
left: 50%;
margin-left: -480px;/*此值等于“-width/2”*/
}
這種方法有幾點(diǎn)需要注意:其一要有一個(gè)固定寬度,其二對(duì)要居中的元素進(jìn)行絕對(duì)定位,并且“left: 50%”;其三對(duì)此元素設(shè)置一個(gè)負(fù)的“margin-left”并且值等于寬度的一半,另外如果元素不是相對(duì)于瀏覽器的話,還需要在其父元素上設(shè)置一個(gè)相對(duì)定位“position: relative”。
方法三:
這種方法主要是針對(duì)單行文本居中或者前面介紹的table格式居,主要運(yùn)用的是text-align:center讓元素水平居中
.testH{text-align:center;}
面主要是和大家一起探討和學(xué)習(xí)了多種方法讓元素實(shí)現(xiàn)垂直居中,大家可以在這幾種方法上稍做改變就能實(shí)現(xiàn)其水平居中,這樣就達(dá)到了元素水平垂直居中的效果。實(shí)現(xiàn)方法很多,而且他們也各有千秋,可以說(shuō)他們各有各的好,各有各的壞,具體怎么讓他們更適合你的實(shí)際應(yīng)用,你可以仔細(xì)對(duì)比一下,我比較喜歡方法四,簡(jiǎn)單,兼容性強(qiáng),只是需要增加一個(gè)額外的標(biāo)簽。說(shuō)了這么多,希望能給需要的朋友有所幫助。
用CSS來(lái)實(shí)現(xiàn)元素的垂直居中效果是件苦差事,雖然說(shuō)實(shí)現(xiàn)方法有多種,但有很多方式在某些瀏覽器下可能無(wú)法正常的工作。接下來(lái)我們就一起來(lái)看看這些不同方法實(shí)現(xiàn)垂直居中的各自?xún)?yōu)點(diǎn)和其不足之處。
方法一:
這種方法用來(lái)實(shí)現(xiàn)單行垂直居中是相當(dāng)?shù)暮?jiǎn)單的,你只要保證元素內(nèi)容是單行,并且其高度是固定不變的,你只要將其“line-height”設(shè)置成和“height”值一樣就Ok了。不過(guò)這種方法局限性太大,只有單行文本的元素才適用,所以在多行元素中是不能使用這種方法的。
Html Markup
復(fù)制代碼
代碼如下:<div class="vertical">content</div>
CSS Code:
復(fù)制代碼
代碼如下:.vertical {
height: 100px;
line-height: 100px;/*值等于元素高度的值*/
}
優(yōu)點(diǎn):
適合在所有瀏覽器,沒(méi)有足夠空間時(shí),內(nèi)容不會(huì)被切掉
缺點(diǎn):
僅適合應(yīng)用在文本和圖片上,并且這種方法,當(dāng)你文本不是單行時(shí),效果極差,差到讓你感到惡心。
這種方法對(duì)運(yùn)用在小元素上是非常有用的,比如說(shuō)讓一個(gè)button、圖片或者單行文本字段。
方法二:
這種方法將在需要給容器設(shè)置絕對(duì)定位(position:absolute),并且定位高度(top:50%)和margin-top為高度的一半(margin-top:-height/2)。這就意味著使用這種方法來(lái)實(shí)現(xiàn)垂直居中的效果,那么元素必須要有一個(gè)固定的高度。這樣一來(lái),你給元素設(shè)置了固定高度,如果你又給他設(shè)置了“overflow:auto”,那么當(dāng)元素內(nèi)容超過(guò)容器后,這樣元素的就會(huì)出現(xiàn)滾動(dòng),而不會(huì)自適應(yīng)內(nèi)容的高度。
HTML Markup
復(fù)制代碼
代碼如下:<div class="vertical">content</div>
CSS Code
復(fù)制代碼
代碼如下:.vertical {
height: 100px;/*元素的高度*/
position: absolute;
top: 50%;/*元素的頂部邊界離父元素的的位置是父元素高度的一半*/
margin-top: -50px;/*設(shè)置元素頂邊負(fù)邊距,大小為元素高度的一半*/
}
優(yōu)點(diǎn):
能在各瀏覽器下工作,結(jié)構(gòu)簡(jiǎn)單明了,不需增加額外的標(biāo)簽
缺點(diǎn):
由于固定死元素的高度,致使沒(méi)有足哆的空間,當(dāng)內(nèi)容超過(guò)容器的大小時(shí),要么會(huì)消息,要么會(huì)出現(xiàn)滾動(dòng)條(如果元素在body內(nèi),當(dāng)用戶(hù)縮小瀏覽器窗口時(shí),body的滾動(dòng)條將不會(huì)出現(xiàn))。
這種方法主要是針對(duì)多行元素來(lái)進(jìn)行元素的垂直居中,而并非是此元素的內(nèi)容垂直居中,這一點(diǎn)先要理解并分開(kāi)清楚。另外此方法是通過(guò)絕對(duì)定位來(lái)實(shí)現(xiàn)的,那么用這種方法實(shí)現(xiàn)元素的垂直居中需要注意以下幾點(diǎn):其一元素定位關(guān)系到一個(gè)相對(duì)定位參考,所以要保證元素是相對(duì)于哪個(gè)為參考坐標(biāo);另外需要設(shè)置給元素明確定一個(gè)高度值并且給元素設(shè)置一個(gè)負(fù)值的margin-top,而且值為元素高度的一半。這里我建議大家給元素定一個(gè)寬度值,因?yàn)樵剡M(jìn)行絕對(duì)定位后脫離文檔流,其寬度是根據(jù)元素內(nèi)容所占寬度來(lái)計(jì)算的,為這能讓其視覺(jué)效果更好,最好給元素定義一個(gè)寬度值。
根據(jù)這種方法,我們稍作修改就能使元素不單是垂直居中,而且還可以水平居中,如:
HTML Markup
復(fù)制代碼
代碼如下:<div id="wrap">test</div>
CSS Code
復(fù)制代碼
代碼如下:#wrap {
width: 200px;/*元素的寬度*/
height:200px;/*元素的高度*/
position: absolute;
left: 50%;/*配合margin-left的負(fù)值實(shí)現(xiàn)水平居中*/
margin-left: -100px;/*值的大小等于元素寬度的一半*/
top:50%;/*配合margin-top的負(fù)值實(shí)現(xiàn)垂直居中*/
margin-top: -100px;/*值的大小等于元素高度的一半*/
}
這種方法可以實(shí)現(xiàn)元素的水平垂直居中,常用于頁(yè)面在最中間的布局,使用這種方法一定要把握?。?font color="#ff0000">水平垂直居中的元素要有明確的大小(換句話說(shuō)就是要有確切的寬和高度值);給元素進(jìn)行絕對(duì)定位,并設(shè)置left,top值為“50%”(此處最好使用 對(duì)定位,如果只是單單水平居中,此處可以換成相對(duì)定位);最后設(shè)置margin-top和margin-left的負(fù)值,而且其值分別為元素高度和寬度的一半。
方法三:
方法三是使用的的div模擬表格效果,也就是說(shuō)將多個(gè)<div>的“display”屬性設(shè)置為禾“table”和“table-cell”,并設(shè)置他們的“vertical-align”的屬性值為“middle”。有關(guān)于“display:table”更多的介紹可以點(diǎn)擊這里或者去閱讀Quirksmode的《The display declaration》一文。
HTML Code
復(fù)制代碼
代碼如下:<div id="container">
<div id="content">content</div>
</div>
CSS Code
復(fù)制代碼
代碼如下:#container {
height: 300px;
display: table;/*讓元素以表格形式渲染*/
}
#content {
display:table-cell;/*讓元素以表格的單元素格形式渲染*/
vertical-align: middle;/*使用元素的垂直對(duì)齊*/
}
優(yōu)點(diǎn):
這種方法不會(huì)像前面的兩種方法一樣,有高度的限制,此方法可以要據(jù)元素內(nèi)容動(dòng)態(tài)的改變高度,從而也就沒(méi)有空間的限制,元素的內(nèi)容不會(huì)因?yàn)闆](méi)足夠的空間而被切斷或者出現(xiàn)難看的滾動(dòng)條。
缺點(diǎn):
不足之處呢?這種方法只適合現(xiàn)代瀏覽器,在IE6-7下無(wú)法正常運(yùn)行;而且較前兩者而言,結(jié)構(gòu)也更復(fù)雜。
這種方法在現(xiàn)代瀏覽器下是非常方便。但是在IE6-7中是不被支持的,因?yàn)閐isplay:table在IE6-7中不被支持,那么為了解決這種方法在IE6-7的兼容,需要額外增加一個(gè)div,并使用hack,下面我們一起來(lái)看看其解決辦法。
HTML Markup
復(fù)制代碼
代碼如下:<div class="table">
<div class="tableCell">
<div class="content">content</div>
</div>
</div>
CSS Code
復(fù)制代碼
代碼如下:.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%;
}
方法四:
這種方法有點(diǎn)新意,用這種方法你需要在居中元素前面放一個(gè)空的<div>(塊元素就可以),然后設(shè)置這個(gè)<div>的高度為50%,margin-bottom為元素高度的一半,而且居中元素需要清除浮動(dòng)。需要注意的是,使用這種方法,如果你的居中元素是放在body中的話,你需要給html,body設(shè)置一個(gè)“height:100%”的屬性。
HTML Markup
復(fù)制代碼
代碼如下:<body>
<div id="floater"><!--This block have empty content --></div>
<div id="content">Content section</div>
</body>
CSS Code
復(fù)制代碼
代碼如下:html,body {height: 100%;}
#floater{
float:left;
height:50%;/*相對(duì)于父元素高度的50%*/
margin-bottom: -120px;/*值大小為居中元素高度的一半(240px/2)*/
}
#content {
clear:both;/*清除浮動(dòng)*/
height: 240px;
position: relative;
}
優(yōu)點(diǎn):
這種方法能兼容所有瀏覽器,在沒(méi)有足哆空間下,內(nèi)容不會(huì)被切掉
缺點(diǎn):
元素高度被固定死,無(wú)法達(dá)到內(nèi)容自適應(yīng)高度,如果居中元素加上overflow屬性,要么元素出現(xiàn)滾動(dòng)條,要么元素被切掉;另外就是一個(gè)不算缺點(diǎn)的缺點(diǎn),那就是加了一個(gè)空標(biāo)簽。
方法五:
這種方法和方法三一樣使用display:table-cell來(lái)實(shí)現(xiàn),不過(guò)方法五不同之處是這個(gè)方法我們需要一個(gè)線盒型,用來(lái)實(shí)現(xiàn)IE下的效果,需要增加一上行內(nèi)標(biāo)簽比如說(shuō)“span”(此處最好使用行內(nèi)標(biāo)簽,千萬(wàn)不要使用塊標(biāo)簽,因?yàn)槭褂脡K標(biāo)簽會(huì)沒(méi)有效果),并把這個(gè)線盒型高度設(shè)置為100%,其實(shí)現(xiàn)原理大家可以去閱讀《大小不固定的圖片、多行文字的水平垂直居中》。
HTML Markup
復(fù)制代碼
代碼如下:<p class="table">
<span class="tableCell">Centering multiple lines
in a block container.</span>
<!--[if lte IE 7]><b></b><![endif]-->
</p>
CSS Code
復(fù)制代碼
代碼如下:<style type="text/css">
.table {
border: 1px solid orange;
display: table;
height: 200px;
width: 200px;
text-align: center;
}
.tableCell {
display: table-cell;
vertical-align: middle;
}
</style>
<!--[if lte ie 7]>
<style type="text/css">
.tableCell {
display: inline-block;
}
b {
display: inline-block;
height: 100%;
vertical-align: middle;
width: 1px;
}
</style>
<![endif]-->
優(yōu)點(diǎn):
這種方法的優(yōu)點(diǎn)和方法三是一樣的,不會(huì)有高度的限制。
缺點(diǎn):
不好的地方就是這種方法為了讓IE運(yùn)行正常,需要額外增加一些標(biāo)簽,另外就是線盒型的標(biāo)簽種類(lèi)有限制。不過(guò)用起來(lái)還是蠻方便的。
方法六:
這種方法是采用的display:inline-block,然后借助另一個(gè)元素的高度來(lái)實(shí)現(xiàn)居中
Html Markup
復(fù)制代碼
代碼如下:<div id="parent">
<div id="vertically_center">
<p>I am vertically centered!</p>
</div>
<div id="extra"><!-- ie comment --></div>
</div>
CSS Code
復(fù)制代碼
代碼如下:<style type="text/css">
html,
body{
height: 100%;
}
#parent {
height: 500px;/*定義高度,讓線盒型div#extra有一個(gè)參照物,可以是固定值,也可以是百分比*/
border: 1px solid red;
}
#vertically_center,
#extra {
display: inline-block;/*把元素轉(zhuǎn)為行內(nèi)塊顯示*/
vertical-align: middle;/*垂直居中*/
}
#extra {
height: 100%; /*設(shè)置線盒型為父元素的100%高度*/
}
</style>
<!--[if lt IE 8]>
<style type="text/css">
/*IE6-7不支持display:inline-block,所以在ie6-7另外寫(xiě)一個(gè)hack,用來(lái)支持ie6-7*/
#vertically_center,
#extra {
display: inline;
zoom: 1;
}
#extra {
width: 1px;
}
</style>
<![endif]-->
優(yōu)點(diǎn):
可以自適應(yīng)高度,簡(jiǎn)單易懂
缺點(diǎn):
需要給元素的父元素設(shè)置一個(gè)高度,這個(gè)高度可以是一個(gè)固定值或者百分值高度,另外需要增加一個(gè)額外的標(biāo)簽,當(dāng)作線盒型,如div#extra,并且需要設(shè)置其高度為100%。另外就是ie6-7不支持display:inline-block,需要給他們另外寫(xiě)一個(gè)樣式。
這是一個(gè)很有意思的方法,但你要懂得如何使用display。有關(guān)于這種方法的操作,大家可以去看一看Jonathan Potter寫(xiě)的《CSS, Vertical Centering》。
方法七:
這個(gè)方法是針對(duì)多行內(nèi)容居中,而且容器高度是可變的,方法很簡(jiǎn)單,就是給出上下一樣的padding值
Html Code
復(fù)制代碼
代碼如下:<div class="columns">
<div class="item">test</div>
</div>
CSS Code
復(fù)制代碼
代碼如下:.item {padding-top:30px;padding-bottom:30px;}
優(yōu)點(diǎn):
在所有瀏覽器下能正常工作,支持所有元素,簡(jiǎn)單易懂,結(jié)構(gòu)清晰
缺點(diǎn):
使用這種方法不能給容器固定高度,如果固定高度將無(wú)法達(dá)到效果。
方法八:
正如前面所述,如果元素固定高度后要實(shí)現(xiàn)垂直居中,用CSS實(shí)現(xiàn)很方便,但對(duì)于自適應(yīng)高度的就比較棘手了。那么第七種方法,要給大家介紹的是使用jQuery的方法
Html Markup
復(fù)制代碼
代碼如下:<div class="container">
<p>Centered In The Middle Of The Page With jQuery</p>
</div>
CSS Code
復(fù)制代碼
代碼如下:.container{
background-color:#338BC7;
width:270px;
height:150px;
}
jQuery Code
復(fù)制代碼
代碼如下:$(document).ready(function(){
$(window).resize(function(){
$('.container').css({
position:'absolute',
left: ($(window).width() - $('.container').outerWidth())/2,
top: ($(window).height() - $('.container').outerHeight())/2
});
});
// 最初運(yùn)行函數(shù)
$(window).resize();
});
優(yōu)點(diǎn):
這種方法,結(jié)構(gòu)簡(jiǎn)單,易懂,不需要固定元素的大小。兼容各瀏覽器。
缺點(diǎn):
需要調(diào)用jQuery,如果不支持js或者用戶(hù)禁掉了js,那么將無(wú)法正常運(yùn)行,那就是杯具了。
上面這種方法對(duì)實(shí)現(xiàn)頁(yè)面居中布局很方便,下面我根據(jù)上面的思路和方法二寫(xiě)了一個(gè)實(shí)現(xiàn)元素水平垂直居中的小插件
jQuery Plugin
復(fù)制代碼
代碼如下:(function($){
$.fn.vhAlign = function(){
return this.each(function(i){
//獲取元素的內(nèi)容高度
var h = Math.ceil($(this).height());
//outerHeight=padding+border+height
var oh = Math.ceil($(this).outerHeight());
//取得margin-top值
var mt = Math.ceil(oh / 2);
//取得元素寬度
var w = Math.ceil($(this).width());
//outerWidth=padding+border+width
var ow = Math.ceil($(this).outerWidth());
//取得margin-left
var ml = Math.ceil(ow / 2);
//實(shí)現(xiàn)元素居中效果
$(this).css({
"margin-top": "-" + mt + "px",
"top": "50%",
"margin-left": "-" + ml + "px",
"left": "50%",
"width":w,
"height":h,
"position": "absolute"
});
});
};
})(jQuery);
Html Markup
復(fù)制代碼
代碼如下:<div class="wrap">
<p>test jquery</p>
</div>
接下來(lái)需要調(diào)用剛才寫(xiě)好的jQuery插件
復(fù)制代碼
代碼如下:<script type="text/javascript" src="vhAlign.js"></script>
最后需要在div.wrap調(diào)用這個(gè)function
復(fù)制代碼
代碼如下:<script type="text/javascript">
$(document).ready(function(){
$(".wrap").vhAlign();
});
</script>
這里有一點(diǎn)需要特別注意,如果元素不是相對(duì)于body居中,那么需要在其父元素中進(jìn)行相對(duì)定位。
上面我們一起見(jiàn)證了八種不同方法實(shí)現(xiàn)元素的垂直居中效果,下面我們?cè)诤?jiǎn)單的看一下如何實(shí)現(xiàn)元素的水平居中(其實(shí)上面有一些效果也實(shí)現(xiàn)了水平居中,你可以慢慢回想一下)。
方法一:
這種方法主要使用margin: auto配合元素的width來(lái)實(shí)現(xiàn)水平居中的效果
Html Markup
復(fù)制代碼
代碼如下:<div class="horizontal">content</div>
CSS Code:
復(fù)制代碼
代碼如下:.horizontal {
width: 200px;
margin: 0 auto;
}
使用上面方法實(shí)現(xiàn)元素水平居中一定要讓元素滿(mǎn)足兩個(gè)條件:其一,元素需要有一個(gè)固定寬度值;其二元素的margin-left和margin-right都必須設(shè)置為auto,這兩個(gè)條件少了任何一個(gè)都無(wú)法讓元素達(dá)到水平居中的效果。此方法使用水平居中,支持所有瀏覽器運(yùn)行,因此他也常用來(lái)實(shí)現(xiàn)Web頁(yè)面水平居中的布局效果,如果用在布局,需要注意IE下的效果,換句話說(shuō),如果你的Web頁(yè)面沒(méi)有明確聲明"!DOCTYPE",那么在IE也會(huì)以怪異模式解析你的Web頁(yè)面,此時(shí)上面這種辦法將無(wú)法讓你的頁(yè)面實(shí)現(xiàn)水平居中,但你可以使用下面這種方法解決這個(gè)bug。
Html Code:
復(fù)制代碼
代碼如下:<div class="container"> 頁(yè)面內(nèi)容。... </div>
CSS Code:
復(fù)制代碼
代碼如下:body {
text-align: center;/*實(shí)現(xiàn)IE在怪異模式下頁(yè)面水平居中*/
}
.container {
text-align: left;/*讓文本恢復(fù)到左對(duì)齊*/
width: 960px;/*設(shè)置頁(yè)面總寬度*/
margin: 0 auto;/*使頁(yè)面水平居中對(duì)齊*/
}
方法二:
實(shí)現(xiàn)固定寬度的水平居中,我們還可以使用絕對(duì)定位配合負(fù)的margin來(lái)實(shí)現(xiàn),具體代碼如下:
Html Markup
復(fù)制代碼
代碼如下:<div class="horizontal">content</div>
CSS Code:
復(fù)制代碼
代碼如下:.horizontal {
width: 960px;
position: absolute;
left: 50%;
margin-left: -480px;/*此值等于“-width/2”*/
}
這種方法有幾點(diǎn)需要注意:其一要有一個(gè)固定寬度,其二對(duì)要居中的元素進(jìn)行絕對(duì)定位,并且“left: 50%”;其三對(duì)此元素設(shè)置一個(gè)負(fù)的“margin-left”并且值等于寬度的一半,另外如果元素不是相對(duì)于瀏覽器的話,還需要在其父元素上設(shè)置一個(gè)相對(duì)定位“position: relative”。
方法三:
這種方法主要是針對(duì)單行文本居中或者前面介紹的table格式居,主要運(yùn)用的是text-align:center讓元素水平居中
復(fù)制代碼
代碼如下:.testH{text-align:center;}
面主要是和大家一起探討和學(xué)習(xí)了多種方法讓元素實(shí)現(xiàn)垂直居中,大家可以在這幾種方法上稍做改變就能實(shí)現(xiàn)其水平居中,這樣就達(dá)到了元素水平垂直居中的效果。實(shí)現(xiàn)方法很多,而且他們也各有千秋,可以說(shuō)他們各有各的好,各有各的壞,具體怎么讓他們更適合你的實(shí)際應(yīng)用,你可以仔細(xì)對(duì)比一下,我比較喜歡方法四,簡(jiǎn)單,兼容性強(qiáng),只是需要增加一個(gè)額外的標(biāo)簽。說(shuō)了這么多,希望能給需要的朋友有所幫助。
相關(guān)文章
CSS實(shí)現(xiàn)同一行的圖片和文字垂直居中對(duì)齊的方法
這篇文章主要為大家介紹了CSS實(shí)現(xiàn)同一行的圖片和文字垂直居中對(duì)齊的方法,涉及css中vertical-align:middle屬性的使用技巧,需要的朋友可以參考下2015-05-12- 垂直居中對(duì)齊在網(wǎng)頁(yè)布局中非常實(shí)用,下面有段css代碼,個(gè)人感覺(jué)還不錯(cuò),大家可以參考下2014-02-08
- 這篇文章主要介紹了css兩種垂直居中對(duì)齊解決方案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一2019-04-30

