居中通常分爲水平居中、垂直居中、文字居中css
對於CSS,若是實現一個元素水平居中,仍是比較容易實現的:html
可是,要實現元素垂直居中,仍是比較困難的,尤爲是元素大小固定時。web
不討論的方法:chrome
下面的示例用的HTML結構都是<body>元素中插入下面的標籤:瀏覽器
1 <div> 2 <h1>居中了麼?</h1> 3 <p>請居中!</p> 4 </div>
1 div{ 2 position:absolute; 3 top:50%; 4 left:50%; 5 margin-top:-3em; 6 margin-left:-9em; 7 width:18em; 8 height:6em; 9 }
從本質上講,將元素的左上角移到視窗中心點,而後使用負margin(使用margin-left和margin-top),而margin的值是元素寬度和高度的一半,使元素中心點與視窗的中心點重合。佈局
1 div{ 2 position:absolute; 3 top : calc(50% - 3em); 4 left : calc(50% - 9em); 5 width: 18em; 6 height: 6em; 7 }
顯然,這種方法的最大問題,是元素須要一個固定的尺寸,而須要垂直居中元素的尺寸經常須要由它的內容來決定。若是有辦法使用百分比來控制元素的尺寸,咱們的問題就能夠解決了。不幸的是,大多數CSS屬性(包括margin)百分比的值是對於其父元素的寬度來決定的。flex
在CSS中經常能夠看到不少解決方案是難以想象的。在這個例子中,可使用CSS3的transform。能夠在transform中的translate()使用百分比,讓元素元素移動是相對自身的寬度和高度,這種方案正式咱們須要的。flexbox
1 div{ 2 position:absolute; 3 top:50%; 4 left:50%;
-webkit-transform:translate(-50%,-50%);
-moz-transform:translate(-50%,-50%);
5 transform:translate(-50%, -50%); 6 }
使用絕對定位一般不是一個很好地選擇,由於它對總體的佈局影響至關大。spa
若是垂直居中元素的內容比視窗寬度更高的話,它的頂部會被裁剪掉,以下圖所示。但這個問題能夠解決掉,只不過須要使用一些hack手段。3d
在一些瀏覽器中,可能會致使元素出現略微的模糊,那是由於元素可能被放置在半個元素位置上。咱們能夠經過transform-style:preserve-3d來解決,儘管這是一個hack手段,不能保證它不會過期。
若是想避免使用絕對定位,仍然可使用translate()方法,其值恰好是原寬度和高度的一半。然而,咱們如何不使用top和left,將元素從top和left移動50%的偏移量呢?
2.1 margin屬性一個百分號
首先給margin屬性一個百分數,像這樣:
1 div{ 2 width:18em; 3 padding:1em 1.5em; 4 margin:50% auto 0; 5 transform:translateY(-50%); 6 }
但這種會產生奇怪的效果,並無真正的垂直居中,主要緣由margin的百分比計算是相對於父容器的width來計算的。
若是想讓元素在視窗中居中,仍是能夠的。
CSS Values and Units Level 3定義了一種新的單位,稱爲相對視窗(Viewport-relative)長度單位。
1 div{ 2 width:18em; 3 padding:1em 1.5em; 4 margin:50vh auto 0; 5 transform:translateY(-50%); 6 }
能夠實現很好的垂直居中效果。
這種方法只適合元素在視窗中垂直居中。
這種解決方案無疑是最好的,由於它在現代瀏覽器中能夠獲得很好地支持。
只須要兩個樣式,在須要垂直居中的父元素上設置display:flex;
這個示例<body>和垂直居中元素上設置margin:auto
body {
display: flex;
min-height: 100vh;
margin: 0;
}
div {
margin: auto;
}
元素不只實現水平居中,並且還會垂直居中,沒有設置寬度。
flexbox還有一個優勢,可讓匿名容器垂直居中。
能夠經過align-items和justify-content屬性設置固定的尺寸的div容器裏面的文本
能夠在<body>和須要的居中的元素div使用相同的屬性,同時使用margin:auto做爲備用,易於優雅降級。
div {
display:flex;
align-items:center;
justify-content:center;
width:18em;
height:10em;
}
通常狀況下,須要將div居中顯示,使CSS樣式margin:0 auto;或margin:0 auto 1px;,但有時使用margin:0 auto;可以在ff和chrome中正常居中顯示,但對於IE6以前瀏覽器則不能實現水平居中
margin:0 auto
上面的margin:0 auto不能實現水平居中,怎麼解決呢?
解決IE的兼容的bug,搜索了下,有兩種解決方法
一、經過在body或父級元素設置text-align:center來實現居中
二、和方法一差很少,在居中的外層加一個div,並使其居中便可。
三、出現這個緣由,主要在於文檔的dtd聲明問題,DOCTYPE爲 xhtml 1.0 tranditional (html 4.01 下無效)。
修改DTD爲下<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
另外還可使用<center></center>這個是HTML5
一、不能使用float(不管是使用float:left仍是float:right);
二、對body設置text-align:center;
三、對最外層設置margin:0 auto;兼容各大瀏覽器水平居中樣式