CSS實現水平垂直居中的1010種方式

轉載自:CSS實現水平垂直居中的1010種方式css

 

劃重點,這是一道面試必考題,不少面試官都喜歡問這個問題,我就被問過好幾回了html

要實現上圖的效果看似很簡單,實則暗藏玄機,本文總結了一下CSS實現水平垂直居中的方式大概有下面這些,本文將逐一介紹一下,我將本文整理成了一個github倉庫,歡迎你們starcss3

僅居中元素定寬高適用git

  • absolute + 負margin
  • absolute + margin auto
  • absolute + calc

居中元素不定寬高github

  • absolute + transform
  • lineheight
  • writing-mode
  • table
  • css-table
  • flex
  • grid

absolute + 負margin

爲了實現上面的效果先來作些準備工做,假設HTML代碼以下,總共兩個元素,父元素和子元素面試

<div class="wp"> <div class="box size">123123</div> </div> 

wp是父元素的類名,box是子元素的類名,由於有定寬和不定寬的區別,size用來表示指定寬度,下面是全部效果都要用到的公共代碼,主要是設置顏色和寬高chrome

注意:後面不在重複這段公共代碼,只會給出相應提示佈局

/* 公共代碼 */ .wp { border: 1px solid red; width: 300px; height: 300px; } .box { background: green; } .box.size{ width: 100px; height: 100px; } /* 公共代碼 */ 

絕對定位的百分比是相對於父元素的寬高,經過這個特性可讓子元素的居中顯示,但絕對定位是基於子元素的左上角,指望的效果是子元素的中心居中顯示flex

爲了修正這個問題,能夠藉助外邊距的負值,負的外邊距可讓元素向相反方向定位,經過指定子元素的外邊距爲子元素寬度一半的負值,就可讓子元素居中了,css代碼以下spa

/* 此處引用上面的公共代碼 */ /* 此處引用上面的公共代碼 */ /* 定位代碼 */ .wp { position: relative; } .box { position: absolute;; top: 50%; left: 50%; margin-left: -50px; margin-top: -50px; } 

這是我比較經常使用的方式,這種方式比較好理解,兼容性也很好,缺點是須要知道子元素的寬高

點擊查看完整DEMO

absolute + margin auto

這種方式也要求居中元素的寬高必須固定,HTML代碼以下

<div class="wp"> <div class="box size">123123</div> </div> 

這種方式經過設置各個方向的距離都是0,此時再講margin設爲auto,就能夠在各個方向上居中了

/* 此處引用上面的公共代碼 */ /* 此處引用上面的公共代碼 */ /* 定位代碼 */ .wp { position: relative; } .box { position: absolute;; top: 0; left: 0; right: 0; bottom: 0; margin: auto; } 

這種方法兼容性也很好,缺點是須要知道子元素的寬高

點擊查看完整DEMO

absolute + calc

這種方式也要求居中元素的寬高必須固定,因此咱們爲box增長size類,HTML代碼以下

<div class="wp"> <div class="box size">123123</div> </div> 

感謝css3帶來了計算屬性,既然top的百分比是基於元素的左上角,那麼在減去寬度的一半就行了,代碼以下

/* 此處引用上面的公共代碼 */ /* 此處引用上面的公共代碼 */ /* 定位代碼 */ .wp { position: relative; } .box { position: absolute;; top: calc(50% - 50px); left: calc(50% - 50px); } 

這種方法兼容性依賴calc的兼容性,缺點是須要知道子元素的寬高

點擊查看完整DEMO

absolute + transform

仍是絕對定位,但這個方法不須要子元素固定寬高,因此再也不須要size類了,HTML代碼以下

<div class="wp"> <div class="box">123123</div> </div> 

修復絕對定位的問題,還可使用css3新增的transform,transform的translate屬性也能夠設置百分比,其是相對於自身的寬和高,因此能夠講translate設置爲-50%,就能夠作到居中了,代碼以下

/* 此處引用上面的公共代碼 */ /* 此處引用上面的公共代碼 */ /* 定位代碼 */ .wp { position: relative; } .box { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } 

這種方法兼容性依賴translate2d的兼容性

點擊查看完整DEMO

lineheight

利用行內元素居中屬性也能夠作到水平垂直居中,HTML代碼以下

<div class="wp"> <div class="box">123123</div> </div> 

把box設置爲行內元素,經過text-align就能夠作到水平居中,但不少同窗可能不知道經過經過vertical-align也能夠在垂直方向作到居中,代碼以下

/* 此處引用上面的公共代碼 */ /* 此處引用上面的公共代碼 */ /* 定位代碼 */ .wp { line-height: 300px; text-align: center; font-size: 0px; } .box { font-size: 16px; display: inline-block; vertical-align: middle; line-height: initial; text-align: left; /* 修正文字 */ } 

這種方法須要在子元素中將文字顯示重置爲想要的效果

點擊查看完整DEMO

writing-mode

不少同窗必定和我同樣不知道writing-mode屬性,感謝@張鑫旭老師的反饋,簡單來講writing-mode能夠改變文字的顯示方向,好比能夠經過writing-mode讓文字的顯示變爲垂直方向

<div class="div1">水平方向</div> <div class="div2">垂直方向</div> 
.div2 { writing-mode: vertical-lr; } 

顯示效果以下:

水平方向
垂
直
方
向

更神奇的是全部水平方向上的css屬性,都會變爲垂直方向上的屬性,好比text-align,經過writing-modetext-align就能夠作到水平和垂直方向的居中了,只不過要稍微麻煩一點

<div class="wp"> <div class="wp-inner"> <div class="box">123123</div> </div> </div> 
/* 此處引用上面的公共代碼 */ /* 此處引用上面的公共代碼 */ /* 定位代碼 */ .wp { writing-mode: vertical-lr; text-align: center; } .wp-inner { writing-mode: horizontal-tb; display: inline-block; text-align: center; width: 100%; } .box { display: inline-block; margin: auto; text-align: left; } 

這種方法實現起來和理解起來都稍微有些複雜

點擊查看完整DEMO

table

曾經table被用來作頁面佈局,如今沒人這麼作了,但table也可以實現水平垂直居中,可是會增長不少冗餘代碼

<table> <tbody> <tr> <td class="wp"> <div class="box">123123</div> </td> </tr> </tbody> </table> 

tabel單元格中的內容自然就是垂直居中的,只要添加一個水平居中屬性就行了

.wp { text-align: center; } .box { display: inline-block; } 

這種方法就是代碼太冗餘,並且也不是table的正確用法

點擊查看完整DEMO

css-table

css新增的table屬性,可讓咱們把普通元素,變爲table元素的現實效果,經過這個特性也能夠實現水平垂直居中

<div class="wp"> <div class="box">123123</div> </div> 

下面經過css屬性,可讓div顯示的和table同樣

.wp { display: table-cell; text-align: center; vertical-align: middle; } .box { display: inline-block; } 

這種方法和table同樣的原理,但卻沒有那麼多冗餘代碼,兼容性也還不錯

點擊查看完整DEMO

flex

flex做爲現代的佈局方案,顛覆了過去的經驗,只需幾行代碼就能夠優雅的作到水平垂直居中

<div class="wp"> <div class="box">123123</div> </div> 
.wp { display: flex; justify-content: center; align-items: center; } 

目前在移動端已經徹底可使用flex了,PC端須要看本身業務的兼容性狀況

點擊查看完整DEMO

grid

感謝@一絲姐 反饋的這個方案,css新出的網格佈局,因爲兼容性不太好,一直沒太關注,經過grid也能夠實現水平垂直居中

<div class="wp"> <div class="box">123123</div> </div> 
.wp { display: grid; } .box { align-self: center; justify-self: center; } 

代碼量也不多,但兼容性不如flex,不推薦使用

點擊查看完整DEMO

總結

下面對比下各個方式的優缺點,確定又雙叒叕該有同窗說回字的寫法了,簡單總結下

  • PC端有兼容性要求,寬高固定,推薦absolute + 負margin
  • PC端有兼容要求,寬高不固定,推薦css-table
  • PC端無兼容性要求,推薦flex
  • 移動端推薦使用flex

小貼士:關於flex的兼容性決方案,請看這裏《移動端flex佈局實戰

方法 居中元素定寬高固定 PC兼容性 移動端兼容性
absolute + 負margin ie6+, chrome4+, firefox2+ 安卓2.3+, iOS6+
absolute + margin auto ie6+, chrome4+, firefox2+ 安卓2.3+, iOS6+
absolute + calc ie9+, chrome19+, firefox4+ 安卓4.4+, iOS6+
absolute + transform ie9+, chrome4+, firefox3.5+ 安卓3+, iOS6+
writing-mode ie6+, chrome4+, firefox3.5+ 安卓2.3+, iOS5.1+
lineheight ie6+, chrome4+, firefox2+ 安卓2.3+, iOS6+
table ie6+, chrome4+, firefox2+ 安卓2.3+, iOS6+
css-table ie8+, chrome4+, firefox2+ 安卓2.3+, iOS6+
flex ie10+, chrome4+, firefox2+ 安卓2.3+, iOS6+
grid ie10+, chrome57+, firefox52+ 安卓6+, iOS10.3+
相關文章
相關標籤/搜索