css點滴1—八種方式實現元素垂直居中
這里介紹實現元素垂直居中的方式,文章是參考了《css制作水平垂直居中對齊》這一篇文章。
1.行高和高度實現
這種方式實現單行垂直居中是很簡單的,但是要保證元素內容是單行的,并且其高度是不變的,只要將“line-height”和“height”設置成一樣的就可以了。這種方式局限性在于只有單行文本的元素才適用,多行元素是不適用的。
html代碼:
<div class="vertical">
<span>aaa</span>content
</div>
css代碼:
.vertical { height: 100px; line-height: 100px; }
效果:
缺點:這里“aaa”內容包含在span中,span是行內元素,所以仍然是一行,換成div就不行了。這種方式僅僅適合在文本和圖片上,并且文本不再是單行時,效果不好。在一些小元素上還是很合適的,比如一個button,image,或者單行文本,h1上。
2.容器絕對定位
這種方法需要給容器設置絕對定位,position:absolute,并且定位高度(top:50%),margin-top為高度的一半(margin-top:-height/2)。這就意味著元素必須要有一個固定的高度,這樣一來給元素設置了固定高度,如果又設置overflow:auto,當元素內容超過容器后,元素就會出現滾動,而不會自適應內容高度。
html代碼:
<div class="vertical"> content </div>
css代碼:
.vertical { height: 100px; /*元素高度*/ position: absolute; /* 絕對定位 */ left: 50%; /*配合margin-left的負值實現水平居中*/ top: 50%; /* 元素的頂部邊界離父元素的位置是父元素高度的一半 */ margin-top: -50px; /*設置元素頂邊負邊距,大小為元素高度的一半*/ }
效果如下:

缺點:這種方式可以在各種瀏覽器下工作,解構簡單明了,不需要額外添加標簽。但是由于固定死元素的高度,只是沒有足夠的空間,當內容超過容器大小時,要么會出現滾動條(如果元素在body內,當用戶縮小瀏覽器窗口時,body的滾動條將不會出現),要么會消失。
這種方式針對多行元素來進行垂直居中,而且并非是此元素的內容垂直居中。另外此方法是通過絕對定位來實現的,要注意下面幾點:其一元素定位關系到一個相對定位參考,所以要保證元素是相對那一個參考坐標;另外需要給元素設置一個明確的高度值,并給元素設置一個margin-top,而且其值為元素高度的一半。最好還要給元素一個寬度,因為絕對定位后脫離文檔流,其寬度是根據元素內容所占的寬度來計算了,為了能讓視覺效果更好,最好設置一個寬度值。
照葫蘆畫瓢,還可以設置元素水平居中,css代碼如下:
.vertical { height: 100px; /*元素高度*/ width: 100px; /*元素寬度*/ position: absolute; /* 絕對定位 */ left: 50%; /*配合margin-left的負值實現水平居中*/ top: 50%; /* 元素的頂部邊界離父元素的位置是父元素高度的一半 */ margin-top: -50px; /*設置元素頂邊負邊距,大小為元素高度的一半*/ margin-left: -50px; /*設置元素左邊負邊距,大小為寬度的一半*/ }
這種方式可以實現元素水平居中,長用于頁面在中間的布局,使用這種方式要注意:水平垂直居中的元素要有明確大小(就是要有明確的高度,寬度值);給元素進行絕對定位,并設置left,top值為50%(最好使用絕對定位,如果只是水平居中,可以換成相對定位);最后設置margin-top和margin-left的負值,大小為元素寬度和高度的一半。
3.div模擬表格
這種方法是使用div模擬表格效果,也就是將多個div的“display”屬性設置為“table”和“table-cell”,并設置他們的“vertical-align”屬性為“middle”。參考《The display declaration》這篇文章。
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無法正常運行,因為IE6-7不支持display:table,為了解決問題,需要額外增加一個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; } .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%; }
這里使用了“*”標記來兼容IE6-7瀏覽器
4.使用空的<div>元素
這種方式比較新奇,在需要居中的元素前面放一個<div>(塊元素即可),然后設置這個<div>的高度為50%,margin-bottom為元素高度的一半,并且居中元素需要清除浮動。要注意使用這種方式,如果居中元素放在body中的話,需要給html,body設置一個“height:100%”的屬性。
html代碼:
<body> <div id="floater"><!--This block have empty content--></div> <div id="content">Content section</div> </body>
css代碼:
html, body { height: 100% } #floater { float: left; height: 50%; /*相對父元素高度的50%*/ margin-bottom: -120px; /*值大小為居中元素高度的一半*/ } #content { clear: both; /*清除浮動*/ height: 240px; position: relative; }
效果:

缺點:這種方式能兼容所有瀏覽器,在沒有足夠空間下,內容不會被切掉。但是也有缺點,元素高度被固定死,無法達到內容自適應高度,如果居中元素加上overflow屬性,要么元素出現滾動條,要么被切掉。另外還有一個缺點,就是額外添加了一個空標簽。
5.盒模型
這種方法和第三種一樣使用display:table-cell,不同之處在于需要一個盒模型。為了實現兼容IE,需要增加一個行內標簽,比如“span”(最好使用行內標簽,不能使用塊標簽,否則沒有效果),并把這個盒模型高度設置為100%,原理可以參考《大小不固定的圖片,多行文字的水平垂直居中》。
html代碼:
<p class="table"> <span class="tableCell"> Centering multiple lines <br> in a block container. </span> <!--[if lte IE 7]><b></b><![endif]--> </p>
css代碼:
<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正常運行,需要額外增加一些標簽,另外就是盒模型的標簽有類型限制,只能添加行內標簽。
6.inline-block方法
這個種方式采用的是display:inline-block,然后借助另一個元素的高度來實現居中。
html代碼:
<div id="parent"> <div id="vertically_center"> <p>I am vertically centered!</p> </div> <div id="extra"></div> </div>
css代碼:
html,body{ height: 100%; } #parent { height: 500px; /*定義高度,讓線盒模div#eatra有一個參照物,可以是固定值,也可以是參照物*/ border: 1px solid red; } #vertically_center,#extra { display: inline-block; /*把元素轉為行內元素顯示*/ vertical-align: middle; /*垂直居中*/ } #extra { height: 100%; } <!--[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,需要給他們另外寫一個樣式。關于這種方法的操作可以參考:《CSS,Vertical Centering》
7.多行內容居中
這個方法是針對多行內容居中,而且容器高度是可變的,方法很簡單,就是給出上下一個樣的padding值。
html代碼:
<div class="columns"> <div class="item"> <span>test1</span> <span>test2</span> </div> </div>
css代碼:
.item { padding-top: 30px; padding-bottom: 30px; }
效果:

缺點:這種方法支持所有瀏覽器,支持所有元素,簡單易懂,結果清晰,但是使用這種方法不能給容器高度,如果高度固定則無法達到效果。
8.jquery實現
如果元素固定高度,實現垂直居中很方便,但是自適應高度就比較棘手,這次我們可以使用jquery方法實現。
html代碼:
<div class="container"> <p>Centered In the middle of the page with jQuery</p> </div>
css代碼:
.container { background-color: #338BC7; width: 270px; height: 150px; }
jquery代碼:
<script> $(document).ready(function () { $(window).resize(function () { $('.container').css({ position: 'absolute', left: ($(window).width() - $('.container').outerWidth()) / 2, top: ($(window).height() - $('.container').outerHeight()) / 2 }) }) }) </script>
缺點:這種方法解構簡單,易懂,不需要固定元素大小,兼容各種瀏覽器。缺點是要調用jquery,如果不支持js將無法運行。
9.jquery插件
根據第8種方法,可以寫一個實現元素水平垂直居中的小插件,jquery插件代碼如下:
(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代碼:
<div class="wrap"> <p>test jquery</p> </div>
引入這個插件:
<script type="text/javascript" src="vhAlign.js"></script>
調用這個插件:
$(document).ready(function () { $('.wrap').vhAlign(); })
效果:

缺點:這里有一點需要注意,如果元素不是相對body居中,需要在父元素中進行相對定位。
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號