居中是頁面開發中常常遇到的問題。css
使用合適的、簡單的、兼容性好的居中方式是咱們頁面仔在整個工做生涯中都要面對的問題。html
來看這個例子,一張圖片和文字進行居中。以下圖所示:
img
與文字內容都是行內元素,所以直接使用text-align
就好了。代碼以下圖所示: 前端
在最外層的div
中使用text-align:center
的問題是,會致使全部的子元素都會繼承這個屬性。若是還有一段文字用做介紹該圖片的做用時,這段文字也會被居中。
而咱們但願這段文字是左對齊的,就不得不單獨設置其text-align:left
屬性,以覆蓋其父元素的屬性。而且若是還有更多的子元素也須要這樣作,覆蓋屬性自己就是下策,所以要採用其餘方法。git
因爲顯示的圖片多是變化的,寬高是不定的,但顯示區域是固定的,因此通常會顯式地給圖片設置一個寬高。這個時候知道寬度就能夠設置margin:0 auto
方法,左右的margin
設置爲auto
,瀏覽器就會自動設置左右的margin
值爲容器剩餘寬度的一半。github
使用margin: 0 auto
能夠說是最經常使用的左右居中的方法,不只適用於塊級元素也適用於行內元素。不少網頁的佈局都是使用margin: 0 auto
,例如淘寶pc端,以下圖所示:web
第一個垂直居中的方法是藉助table-cell
屬性,效果圖以下:編程
table-cell
的一個好處就是它能夠兼容到IE8
。瀏覽器
table-cell
屬性的缺點:bash
margin
屬性失效,由於margin
不適用於表格佈局。因此使用margin: 0 auto
屬性是不能使container
左右居中的。解決的方法也很簡單:只須要在container
外層再多套一個div容器,而後設置這個外層容器的margin: 0 auto
便可。table-cell
的元素再設置寬高爲百分比是不起做用的。常見的場景是要將寬度屬性設置爲外層容器寬度的100%,解決方法是將container
的寬度設置成一個很大的值,例如5000px
,這樣就達到100%的目的。container
須要設置position
爲absolute
,table-cell
屬性就會失效。由於設置position: absolute
就會把元素display
強制設置爲block
類型。解決辦法仍是在外層套一層div
容器,將position: absolute
屬性做用於這個容器上。上面所說table-cell
的第三缺點的解決方法有一個反作用,就是設置內層container
的height
和width
爲百分比時會失效。因爲這個緣由,致使有一種狀況不能使用display:table-cell
垂直居中。佈局
就是須要在頁面彈出一個框,這個框的位置須要在當前屏幕中左右上下居中。這時候一般須要將這個框的position
設置爲absolute
,這個時候table-cell
就不能發揮做用了。
解決辦法是使用relative
定位,設置top
爲50%,將彈窗的起始位置放到頁面中間,再設置margin-top
爲元素高度的負一半,這樣使得彈窗在頁面中間位置再往上移到一半自身的高度,這就正好在中間了,左右居中也可相似處理。
使用此方法的缺點是須要知道具體的高度,沒法根據內容長短自適應。
用tranform
方法,將margin-top
一個具體像素的負值改爲transform: translate(0, -50%)
,由於translate
裏面的百分比是根據元素自己的高度計算的,因此就能夠達到自適應的效果。
這個辦法十分方便,並且加上-webkit-
前綴,能夠兼容到IE9。
而margin-top:-100px
與transform:translate(0, -50%)
都有一個缺點,就是若是設置left
爲50%是藉助position
爲absolute
的話,可能會致使換行
原本應該是一行顯式的p
元素卻換行了,這是由於在一個relative
元素裏面的absolute
定位的子元素會經過行內元素換行的方式,儘量不超過容器的邊界。因爲設置left
爲50%,致使p
元素超了邊界,因此就換行了,即便再設置translate:-50%
也已經晚了。
flex
佈局十分容器和方便,只需在副容器設置3個屬性就好了
.container{
display: flex;
align-items: center;
justify-content: center;
}
複製代碼
但flex
的缺點是不支持IE
vertical-aligin:middle
主要是運用在行內元素中的。
若是不作任何處理,那麼默認的垂直居中是以baseline
爲基準的。
爲了可以垂直居中,須要改變居中方式。
要每一個元素都要設置。
若是container
的高度比圖片要高,就會有留空的效果,以下:
爲了讓中間的內容可以在container
裏上下居中,能夠設置文字的line-height
爲container
的高度,這樣文字就上下居中了。因爲圖片與文字是垂直居中的,因此圖片在container
裏也是上下居中了。
也就是說,若是須要垂直居中一個div
裏的比div
高度小的圖片,能夠添加一個元素,讓它的line-height
等於div
的高度。下面使用僞元素::before
來添加line-height
。
或者使用display: inline-block
屬性,加上height: 100%
。這個方法兼容性更好。
使用absolute
定位與margin:auto
方法也能夠實現居中。
若是圖片比container
大,這種方法就不適用了。由於有一個種比較常見的場景:圖片有一邊和contianer
同樣大,另外一邊按圖片的比例縮放,圖片居中顯示,超出的截斷。這種狀況下,只需把left/right/top/bottom
設置爲一個很大的負值便可。
以上就是css
中經常使用的居中方法,若是有更好的方法能夠在評論區留言教教我。
本文參考如下資料
更多文章請移步樓主github,若是喜歡請點一下star,對做者也是一種鼓勵。