1. 程式人生 > >HTML篇之CSS樣式——CSS水平垂直居中對齊(多種方式)

HTML篇之CSS樣式——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;/*讓元素以表格形式渲染*/            //非常適用於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: 

相關推薦

HTMLCSS樣式——CSS水平垂直居中多種方式

用CSS來實現元素的垂直居中效果是件苦差事,雖然說實現方法有多種,但有很多方式在某些瀏覽器下可能無法正常的工作。接下來我們就一起來看看這些不同方法實現垂直居中的各自優點和其不足之處。 方法一:這種方法用來實現單行垂直居中是相當的簡單的,你只要保證元素內容是單行,並且其高度是

CSS實現圖片水平垂直居中於DIV圖片未知寬高

分享 分享圖片 gin pos pic ble 居中 實現圖 class .demo{border:1px #ddd solid;width:267px;height:267px;overflow:hidden;text-align:center;display:tabl

圖片水平垂直居中的四種做法

span log 屬性 wid 水平垂直居中 code absolute webkit 居中對齊 在前端開發中,圖片垂直居中對奇是很常見的,有些是固定高度,有些沒有固定高度,本文分享我用的四種方法,希望對你有所啟發。 以下說的做法暫不考慮IE瀏覽器的兼容性,適用於移動端 以

微信小程序文字水平垂直居中問題

attr lec -a tps .net IE auto https 簡單 我們知道常用的居中對齊方式有很多種例如: text-align:center; align-items:center; justify-content: center; margin: auto;

css3文字水平垂直居中的幾種方法

1.使用絕對定位: .div{ position:absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } 2.flex佈局: .parent{ Justify-content:cent

微信小程式圖片文字水平垂直居中解決方案

我們知道常用的居中對齊方式有很多種例如: text-align:center; align-items:center; justify-content: center; margin: auto; #子容器在父容器中居中 但是在view中的文字對齊卻不能簡單的使用text-ali

已知/未知寬高的浮動元素水平垂直居中

一、已知寬高的浮動元素水平垂直居中對齊 效果: 樣式CSS: <style> .parent{ position:relative; border:2px solid #0

微信小程式文字水平垂直居中問題完美解決方案

我們知道常用的居中對齊方式有很多種例如:text-align:center; align-items:center; justify-content: center; margin: auto; #子

html css實現文字水平垂直居中顯示

這幾天在工作中遇到了一個小問題:文字內容怎麼能在div裡水平垂直居中顯示呢?同時群裡的小夥伴恰巧也有提問這個問題的,所以我就總結了一下我知道的方法。 一、利用行高(line-height)和vertical-align配合實現 具體做法如下: html: <div clas

css布局--水平垂直居中

vertical log enter pla form items bsp spl css布局 1. 使用text-align 和 vertical-align 和 inline-block實現水平垂直居中 html <div class="parent">

css中實現水平垂直居中的幾種方式

css水平垂直居中水平居中(1)使用inline-block+text-align<div class="parent"><div class="child">demo</div></div> .child {

css 實現元素水平垂直居中的幾種方法

在做網頁的時候經常會需要讓某一個元素水平垂直居中,而要實現水平垂直居中有很多種方法,不知道你們有沒遇到這種情況:方法倒是知道,甚至還知道許多種,可一到真正用到的時候,卻突然在努力地回想,這或許就是人們經常說的「腦子短路」,所以,這篇文章和大家一起來溫故而知新,梳

你知道CSS實現水平垂直居中的第10種方式嗎?

你知道CSS實現水平垂直居中的第10種方式嗎? 僅居中元素定寬高適用: absolute + 負 margin absolute + margin auto absolute + calc 居中元素不定寬高: absolute + transform li

css設定元素水平垂直居中的方法

看到標題,相信大家並不陌生。這個問題,經常會出現在面試題中。通常會要求面試者寫出幾種方法。那麼,究竟有幾種方法,每種方法的相容情況如何,相信大家很少研究過。今天,我們就一起來看看。 通常分為2種情況,已知元素的寬度或未知。 我們先說說在已知的情況下,要如何設定。 舉例說明:

CSS佈局:水平垂直居中

CSS佈局:元素水平垂直居中 本文將依次介紹在不同條件下實現水平垂直居中的多種方法 水平垂直居中是在寫網頁時經常會用到的需求,在上兩篇部落格中,分別介紹了水平居中和垂直居中的方法。本文的水平垂直居中就是將之前的水平居中和垂直居中用到的方法綜合起來。用到的原理都是一樣的。相信掌握水平居中和垂直居中的方法後,就能

css實現div水平垂直居中

  中秋快到了,祝大家中秋快樂。   平時大家寫bug過程中肯定會遇到讓div框水平或者垂直居中,然而有時候能居中,有時候不能居中。我把平時遇到的一些方法寫出來,如果對你有用,那便是晴天。   1、text-align: center; text-align: center;   這個是最簡單的了,實現文

css中的vertical-align的垂直居中

先來看規範文件中對於vertical-align屬性的定義及使用: 基線:就是英文小寫字母x的下邊緣。 常見的我們用於設定父元素內子元素(或子元素們)(為inline或inline-block)的對齊。 父元素為block,需設定line-height 如何實現子元素在父元素中居中

css中的垂直vertical-align

垂直對齊只對inline或inline-block元素有效   1.基線(baseline) 使用字母x輔助找基線 inline或inline-block基線:在後加一個字元x,x的底部所在位置就是基線位置 父元素基線:在父元素最後加一個x,x的底部所在位置就是基線位置 空的inline

css 文字和div垂直居中方法彙總

link:https://blog.csdn.net/u014607184/article/details/51820508在樣式佈局中,我們經常碰到需要將元素居中。通過css實現元素的水平居中較為簡單:對文字,只需要對其父級元素設定text-align: center;,而

div css 圖片和文字上下居中

log ima 圖片 lin 效果 ges 馬克思 pos 需要 想要圖片和文字水平居中對齊很容易,可今天做這個樹的時候,遇到了要將圖片上下居中.這下就不知道怎麽搞. 拿手冊看也看不出所以然來,不同的瀏覽器對DIV的支持不一個,目前最好的瀏覽器是Firefox.