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

轉載自CSS實現水平垂直居中的10種方式(史上最全)

css讓一個容器水平垂直居中

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

image.png

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

僅居中元素定寬高適用css3

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

居中元素不定寬高git

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

absolute + 負margin

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

<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;
}bash

複製代碼.box.size{ width: 100px; height: 100px; } /* 公共代碼 */ 複製代碼複製代碼

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

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

/* 此處引用上面的公共代碼 */ /* 此處引用上面的公共代碼 */ 複製代碼/* 定位代碼 */ .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+

最近發現不少同窗都對css不夠重視,這實際上是不正確的,好比下面的這麼簡單的問題都有那麼多同窗不會,我也是很無語

<div class="red blue">123</div>
<div class="blue red">123</div>
複製代碼複製代碼

.red { color: red } 複製代碼.blue { color: blue } 複製代碼複製代碼

問兩個div的顏色分別是什麼,居然只有40%的同窗可以答對,這40%中還有不少同窗不知道爲何,但願這些同窗好好補習下CSS基礎,下面給你們推薦幾本CSS的書籍

喜歡看網絡資料同窗,能夠看看MDN的這個CSS入門教程,強烈推薦,英語好的同窗建議看英文版

原文網址:yanhaijing.com/css/2018/01…

最後推薦下個人新書《React狀態管理與同構實戰》,深刻解讀前沿同構技術,感謝你們支持

京東:item.jd.com/12403508.ht…

噹噹:product.dangdang.com/25308679.ht…

相關文章
相關標籤/搜索