全面總結(jié)使用CSS實(shí)現(xiàn)水平垂直居中效果的方法

說(shuō)起水平垂直居中大家常看到的是使用絕對(duì)定位與負(fù)margin的配合或者是inline-block配合vertical-align:middle等方法。當(dāng)然還有其他一些解決方案,比如說(shuō),在水平垂直居中系列中介紹了一些制作方案。但這些方案或多或少都存在一些局限性。假設(shè),要垂直水平居中的元素大小是未知的,你要使用絕對(duì)定位與負(fù)margin配合就難上加難。當(dāng)然你會(huì)說(shuō),使用表格將解決我一切所需,的確是這樣,那么除了這些方法,還有別的方案嗎?接下來(lái)我們就針對(duì)這個(gè)自設(shè)問(wèn)題,來(lái)一起探討其他幾種實(shí)現(xiàn)水平垂直居中的方案。
為了更好的闡述后面的方案,我們這里有一個(gè)命題:讓未知大小容器(未知行數(shù)的文本)實(shí)現(xiàn)水平垂直居中??吹竭@樣的命題,有人或許會(huì)說(shuō)神經(jīng)病又來(lái)了,如果你也這么認(rèn)為,就讓當(dāng)是神病出現(xiàn)了吧。我們不糾結(jié)這個(gè),還是看幾種解決方案吧。
方法一:最原始的方式
這種方法用來(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、圖片或者單行文本字段。
方法二:Flexbox方式
什么是Flexbox就不說(shuō)了,對(duì)于讓Flexbox實(shí)現(xiàn)水平垂直居中可以說(shuō)是絕對(duì)的一流。假設(shè)我想讓一張圖片(圖片大小不知)在body中實(shí)現(xiàn)水平垂直居中。
HTML
- <body>
- <img src="http://img0.bdstatic.com/img/image/shouye/mxangel.jpg" alt="" />
- </body>
結(jié)構(gòu)非常簡(jiǎn)單,body中有一張圖片。
CSS
我們要做的是,如何使用Flexbox讓img在body中實(shí)現(xiàn)水平垂直居中。
- *{
- margin: 0;
- padding:0;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- }
- html,
- body {
- height: 100%;
- }
- body {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 100%;/*firefox下需要*/
- }
代碼就這么幾行,有一個(gè)關(guān)鍵之處,需要將html和body高度設(shè)置為100%;然后只需要在body中配置樣式。此處使用了Flexbox中的居中屬性。至于他們?cè)恚@里就不多說(shuō)了,感興趣的同學(xué)可以看看Flexbox相關(guān)的教程。
方法三:transform與絕對(duì)定位方式
在當(dāng)今天移動(dòng)設(shè)備橫行天下的年代,給我們前端人員制作頁(yè)面帶來(lái)無(wú)盡的煩惱,具體原因,大家都懂的。那么這里我們來(lái)模擬一個(gè)情形。有一個(gè)彈出層,我不知道他的大小有多大,我想讓他在各種設(shè)備中永遠(yuǎn)水平居中。在下面示例中,我們用一個(gè)Dive來(lái)當(dāng)作是彈出窗吧(偷懶了,不想花太多時(shí)間去做這個(gè)彈出窗效果)。
回到我們問(wèn)題所在,在示例中有這樣的一個(gè)結(jié)構(gòu):
- <div class="modal">
- <div class="modal-header">彈出窗標(biāo)題</div>
- <div class="modal-body">在當(dāng)今天移動(dòng)。。。</div>
- </div>
結(jié)構(gòu)不分析了。直接看CSS:
- *{
- margin: 0;
- padding:0;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- }
- html,
- body {
- height: 100%;
- }
- .modal {
- border: 1px solid #bbb;
- border-radius: 5px;
- box-shadow: 0 0 3px rgba(0,0,0,.5);
- position:absolute;
- top:50%;
- left: 50%;
- -webkit-transform: translate(-50%, -50%);
- transform: translate(-50%, -50%);
- }
- .modal-header {
- padding: 10px 20px;
- background: rgba(0,0,0,.25);
- color:#fff;
- }
- .modal-body{
- padding: 20px;
- background: #fff;
- }
方法四:div
使用div模擬表格效果,也就是說(shuō)將多個(gè)<div>的“display”屬性設(shè)置為禾“table”和“table-cell”,并設(shè)置他們的“vertical-align”的屬性值為“middle”。
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:inline-block
這種方法是采用的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è)方法是針對(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á)到效果。
相關(guān)文章
利用CSS3的flexbox實(shí)現(xiàn)水平垂直居中與三列等高布局
這篇文章給大家介紹了三個(gè)小節(jié)的內(nèi)容,其中包括關(guān)于css3中flexbox需要掌握的概念、flexbox實(shí)現(xiàn)水平垂直居中對(duì)齊和三列等高自適應(yīng)頁(yè)腳區(qū)域黏附底部的布局,有需要的可以參考2016-09-12Flexbox制作CSS布局實(shí)現(xiàn)水平垂直居中的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇Flexbox制作CSS布局實(shí)現(xiàn)水平垂直居中的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-27淺析CSS實(shí)現(xiàn)水平垂直同時(shí)居中的5種思路
下面小編就為大家?guī)?lái)一篇淺析CSS實(shí)現(xiàn)水平垂直同時(shí)居中的5種思路。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧2016-04-28- 下面小編就為大家?guī)?lái)一篇讓DIV水平垂直居中的兩種完美方法推薦。一起跟隨小編過(guò)來(lái)看看吧。希望給大家一個(gè)參考2016-03-15
- 這篇文章主要介紹了CSS解決頁(yè)面圖片水平垂直居中問(wèn)題的方法,文中給出了三種方案而無(wú)需依賴JavaScript,需要的朋友可以參考下2016-03-10
- 這篇文章主要介紹了CSS定位“十字架”之水平垂直居中的相關(guān)資料,CSS如何定位“十字架”實(shí)現(xiàn)水平垂直居中效果,小編為大家解答,感興趣的小伙伴們可以參考一下2016-03-02
- 這篇文章主要針對(duì)HTML對(duì)于元素水平垂直居中進(jìn)行的探討,對(duì)元素水平垂直居中操作進(jìn)行講解,感興趣的小伙伴們可以參考一下2016-02-24
關(guān)于html水平垂直居中的問(wèn)題小結(jié)
本文是小編日常遇到的關(guān)于html水平垂直居中的一些問(wèn)題小結(jié),特此分享在腳本之家網(wǎng)站供大家參考2015-11-18- 這篇文章主要介紹了DIV或者DIV里面的圖片水平與垂直居中的方法,需要的朋友可以參考下2018-11-15