DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> CSS入門知識 >> DIV十CSS布局 >> 布局實例 >> CSS制作水平垂直居中對齊 多種方式各有千秋
CSS制作水平垂直居中對齊 多種方式各有千秋
編輯:布局實例     

在制作Web頁面時都有碰到CSS制作水平垂直居中,我想大家都有研究過或者寫過,平時工作收集了幾種不同的方式制作垂直居中方法,但每種方法各有千秋在此與大家分享或許對初學者有所幫助

 

作為前端攻城師,在制作Web頁面時都有碰到CSS制作水平垂直居中,我想大家都有研究過或者寫過,特別的其中的垂直居中,更是讓人煩惱。這段時間,我收 集了幾種不同的方式制作垂直居中方法,但每種方法各有千秋呀,要正確的選擇也是一件不容易的事情。我會將這幾種方法一一介紹給大家,以供大家參考。或許對 於我這樣的初學者有一定的幫助。

用CSS來實現元素的垂直居中效果是件苦差事,雖然說實現方法有多種,但有很多方式在某些浏覽器下可能無法正常的工作。接下來我們就一起來看看這些不同方法實現垂直居中的各自優點和其不足之處。

方法一:

這種方法用來實現單行垂直居中是相當的簡單的,你只要保證元素內容是單行,並且其高度是固定不變的,你只要將其“line-height”設置成和“height”值一樣就Ok了。不過這種方法局限性太大,只有單行文本的元素才適用,所以在多行元素中是不能使用這種方法的。
Html Markup

復制代碼 代碼如下:
<div class="vertical">content</div>


CSS Code:

復制代碼 代碼如下:
.vertical {
height: 100px;
line-height: 100px;/*值等於元素高度的值*/
}


優點:

適合在所有浏覽器,沒有足夠空間時,內容不會被切掉

缺點:

僅適合應用在文本和圖片上,並且這種方法,當你文本不是單行時,效果極差,差到讓你感到惡心。

這種方法對運用在小元素上是非常有用的,比如說讓一個button、圖片或者單行文本字段。

方法二:

這種方法將在需要給容器設置絕對定位(position:absolute),並且定位高度(top:50%)和margin-top為高度的一半(margin-top:-height/2)。這就意味著使用這種方法來實現垂直居中的效果,那麼元素必須要有一個固定的高度。這樣一來,你給元素設置了固定高度,如果你又給他設置了“overflow:auto”,那麼當元素內容超過容器後,這樣元素的就會出現滾動,而不會自適應內容的高度。

HTML Markup

復制代碼 代碼如下:
<div class="vertical">content</div>


CSS Code

復制代碼 代碼如下:
.vertical {
height: 100px;/*元素的高度*/
position: absolute;
top: 50%;/*元素的頂部邊界離父元素的的位置是父元素高度的一半*/
margin-top: -50px;/*設置元素頂邊負邊距,大小為元素高度的一半*/
}


優點:

能在各浏覽器下工作,結構簡單明了,不需增加額外的標簽

缺點:

由於固定死元素的高度,致使沒有足哆的空間,當內容超過容器的大小時,要麼會消息,要麼會出現滾動條(如果元素在body內,當用戶縮小浏覽器窗口時,body的滾動條將不會出現)。

這種方法主要是針對多行元素來進行元素的垂直居中,而並非是此元素的內容垂直居中,這一點先要理解並分開清楚。另外此方法是通過絕對定位來實現的,那麼用這種方法實現元素的垂直居中需要注意以下幾點:其一元素定位關系到一個相對定位參考,所以要保證元素是相對於哪個為參考坐標;另外需要設置給元素明確定一個高度值並且給元素設置一個負值的margin-top,而且值為元素高度的一半。這裡我建議大家給元素定一個寬度值,因為元素進行絕對定位後脫離文檔流,其寬度是根據元素內容所占寬度來計算的,為這能讓其視覺效果更好,最好給元素定義一個寬度值。

根據這種方法,我們稍作修改就能使元素不單是垂直居中,而且還可以水平居中,如:

HTML Markup

復制代碼 代碼如下:
<div id="wrap">test</div>


CSS Code

復制代碼 代碼如下:
#wrap {
width: 200px;/*元素的寬度*/
height:200px;/*元素的高度*/
position: absolute;
left: 50%;/*配合margin-left的負值實現水平居中*/
margin-left: -100px;/*值的大小等於元素寬度的一半*/
top:50%;/*配合margin-top的負值實現垂直居中*/
margin-top: -100px;/*值的大小等於元素高度的一半*/
}


這種方法可以實現元素的水平垂直居中,常用於頁面在最中間的布局,使用這種方法一定要把握住:水 平垂直居中的元素要有明確的大小(換句話說就是要有確切的寬和高度值);給元素進行絕對定位,並設置left,top值為“50%”(此處最好使用 對定位,如果只是單單水平居中,此處可以換成相對定位);最後設置margin-top和margin-left的負值,而且其值分別為元素高度和寬度的 一半

方法三:

方法三是使用的的div模擬表格效果,也就是說將 多個<div>的“display”屬性設置為禾“table”和“table-cell”,並設置他們的“vertical-align” 的屬性值為“middle”。有關於“display:table”更多的介紹可以點擊這裡或者去閱讀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;/*使用元素的垂直對齊*/
}


優點:

這種方法不會像前面的兩種方法一樣,有高度的限制,此方法可以要據元素內容動態的改變高度,從而也就沒有空間的限制,元素的內容不會因為沒足夠的空間而被切斷或者出現難看的滾動條。

缺點:

不足之處呢?這種方法只適合現代浏覽器,在IE6-7下無法正常運行;而且較前兩者而言,結構也更復雜。

這種方法在現代浏覽器下是非常方便。但是在IE6-7中是不被支持的,因為display:table在IE6-7中不被支持,那麼為了解決這種方法在IE6-7的兼容,需要額外增加一個div,並使用hack,下面我們一起來看看其解決辦法。

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%;
}


方法四:

這 種方法有點新意,用這種方法你需要在居中元素前面放一個空的<div>(塊元素就可以),然後設置這個<div>的高度為 50%,margin-bottom為元素高度的一半,而且居中元素需要清除浮動。需要注意的是,使用這種方法,如果你的居中元素是放在body中的話, 你需要給html,body設置一個“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%;/*相對於父元素高度的50%*/
margin-bottom: -120px;/*值大小為居中元素高度的一半(240px/2)*/
}
#content {
clear:both;/*清除浮動*/
height: 240px;
position: relative;
}


優點:

這種方法能兼容所有浏覽器,在沒有足哆空間下,內容不會被切掉

缺點:

元素高度被固定死,無法達到內容自適應高度,如果居中元素加上overflow屬性,要麼元素出現滾動條,要麼元素被切掉;另外就是一個不算缺點的缺點,那就是加了一個空標簽。

方法五:

這種方法和方法三一樣使用display:table-cell來實現,不過方法五不同之處是這個方法我們需要一個線盒型,用來實現IE下的效果,需要增加一上行內標簽比如說“span”(此處最好使用行內標簽,千萬不要使用塊標簽,因為使用塊標簽會沒有效果),並把這個線盒型高度設置為100%,其實現原理大家可以去閱讀《大小不固定的圖片、多行文字的水平垂直居中》。

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]-->


優點:

這種方法的優點和方法三是一樣的,不會有高度的限制。

缺點:

不好的地方就是這種方法為了讓IE運行正常,需要額外增加一些標簽,另外就是線盒型的標簽種類有限制。不過用起來還是蠻方便的。

方法六:

這種方法是采用的display:inline-block,然後借助另一個元素的高度來實現居中

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有一個參照物,可以是固定值,也可以是百分比*/
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,需要給他們另外寫一個樣式。

這是一個很有意思的方法,但你要懂得如何使用display。有關於這種方法的操作,大家可以去看一看Jonathan Potter寫的《CSS, Vertical Centering》。

方法七:

這個方法是針對多行內容居中,而且容器高度是可變的,方法很簡單,就是給出上下一樣的padding值

Html Code

復制代碼 代碼如下:
<div class="columns">
<div class="item">test</div>
</div>


CSS Code

復制代碼 代碼如下:
.item {padding-top:30px;padding-bottom:30px;}


優點:

在所有浏覽器下能正常工作,支持所有元素,簡單易懂,結構清晰

缺點:

使用這種方法不能給容器固定高度,如果固定高度將無法達到效果。

方法八:

正如前面所述,如果元素固定高度後要實現垂直居中,用CSS實現很方便,但對於自適應高度的就比較棘手了。那麼第七種方法,要給大家介紹的是使用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
});
});
// 最初運行函數
$(window).resize();
});


優點:

這種方法,結構簡單,易懂,不需要固定元素的大小。兼容各浏覽器。

缺點:

需要調用jQuery,如果不支持js或者用戶禁掉了js,那麼將無法正常運行,那就是杯具了。

上面這種方法對實現頁面居中布局很方便,下面我根據上面的思路和方法二寫了一個實現元素水平垂直居中的小插件

jQuery Plugin

復制代碼 代碼如下:
(function($){
$.fn.vhAlign = function(){
return this.each(function(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);
//實現元素居中效果
$(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>


接下來需要調用剛才寫好的jQuery插件

復制代碼 代碼如下:
<script type="text/javascript" src="vhAlign.js"></script>


最後需要在div.wrap調用這個function

復制代碼 代碼如下:
<script type="text/javascript">
$(document).ready(function(){
$(".wrap").vhAlign();
});
</script>


這裡有一點需要特別注意,如果元素不是相對於body居中,那麼需要在其父元素中進行相對定位。

上面我們一起見證了八種不同方法實現元素的垂直居中效果,下面我們在簡單的看一下如何實現元素的水平居中(其實上面有一些效果也實現了水平居中,你可以慢慢回想一下)。

方法一:

這種方法主要使用margin: auto配合元素的width來實現水平居中的效果

Html Markup

復制代碼 代碼如下:
<div class="horizontal">content</div>


CSS Code:

復制代碼 代碼如下:
.horizontal {
width: 200px;
margin: 0 auto;
}


使用上面方法實現元素水平居中一定要讓元素滿足兩個條件:其一,元素需要有一個固定寬度值;其二元素的margin-left和margin-right都必須設置為auto,這兩個條件少了任何一個都無法讓元素達到水平居中的效果。 此方法使用水平居中,支持所有浏覽器運行,因此他也常用來實現Web頁面水平居中的布局效果,如果用在布局,需要注意IE下的效果,換句話說,如果你的 Web頁面沒有明確聲明"!DOCTYPE",那麼在IE也會以怪異模式解析你的Web頁面,此時上面這種辦法將無法讓你的頁面實現水平居中,但你可以使 用下面這種方法解決這個bug。

Html Code:

復制代碼 代碼如下:
<div class="container"> 頁面內容。... </div>


CSS Code:

復制代碼 代碼如下:
body {
text-align: center;/*實現IE在怪異模式下頁面水平居中*/
}
.container {
text-align: left;/*讓文本恢復到左對齊*/
width: 960px;/*設置頁面總寬度*/
margin: 0 auto;/*使頁面水平居中對齊*/
}


方法二:

實現固定寬度的水平居中,我們還可以使用絕對定位配合負的margin來實現,具體代碼如下:

Html Markup

復制代碼 代碼如下:
<div class="horizontal">content</div>


CSS Code:

復制代碼 代碼如下:
.horizontal {
width: 960px;
position: absolute;
left: 50%;
margin-left: -480px;/*此值等於“-width/2”*/
}


這種方法有幾點需要注意:其 一要有一個固定寬度,其二對要居中的元素進行絕對定位,並且“left: 50%”;其三對此元素設置一個負的“margin-left”並且值等於寬度的一半,另外如果元素不是相對於浏覽器的話,還需要在其父元素上設置一個相 對定位“position: relative”

方法三:

這種方法主要是針對單行文本居中或者前面介紹的table格式居,主要運用的是text-align:center讓元素水平居中

復制代碼 代碼如下:
.testH{text-align:center;}


面 主要是和大家一起探討和學習了多種方法讓元素實現垂直居中,大家可以在這幾種方法上稍做改變就能實現其水平居中,這樣就達到了元素水平垂直居中的效果。實 現方法很多,而且他們也各有千秋,可以說他們各有各的好,各有各的壞,具體怎麼讓他們更適合你的實際應用,你可以仔細對比一下,我比較喜歡方法四,簡單, 兼容性強,只是需要增加一個額外的標簽。說了這麼多,希望能給需要的朋友有所幫助。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved