CSS之元素水平居中

我們以一個(gè)面試題開始吧

請實(shí)現(xiàn)一個(gè)元素的水平居中顯示,不少于3種方法

這道題看似貌似很簡單,但是我們需要分析具體的場景,因?yàn)椴煌娘@示方式的使用利弊是不一樣的。

以下的討論都是子元素相對于其父元素的水平居中。垂直居中,以后會說到。

行內(nèi)元素的居中

常見的行內(nèi)元素有span img等,對這些元素居中設(shè)置,只需要在父元素的css中添加text-align:center即可。同樣它也對行內(nèi)塊元素也是有效的。
但是,有個(gè)缺點(diǎn),由于text-align是可繼承屬性,即父元素內(nèi)部的所有元素都會繼承這個(gè)屬性,從而它的子元素內(nèi)部的文本都會居中顯示了。因此需要對子元素的文本居中方式單獨(dú)設(shè)定。

行內(nèi)元素的居中

塊級元素的居中

針對塊級元素的居中,我們將分為定寬和不定寬兩種情況來討論。

1.定寬
(1)子元素是正常流布局
若子元素的寬度是已知的,那么我們可以設(shè)置子元素的左右marginauto即可

<div class="parent">
       <p class="child">我是子元素</p>
</div>
.parent{
    width: 500px;
    height: 100px;
    background-color: #eee;
}
.child{
    width: 100px;
    height: 50px;
    margin: 0 auto;
    background-color: #82ab00;
}
塊級元素居中

行內(nèi)塊元素也算塊級元素,同樣適用
目前所有瀏覽器都是支持的

(2)子元素絕對定位布局(absolute)
如果子元素是絕對定位的,由于子元素此時(shí)是脫離文檔流,上面的方法就失效了。這時(shí)需要明確指出子元素的定位,四個(gè)方位均要指定。如下:

.parent{
    position: relative;   /*要指定父元素為relative,你懂的*/
    width: 500px;
    height: 100px;
    background-color: #eee;
}
.child{
    position: absolute;
    width: 100px;
    height: 50px;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: 0 auto;
    background-color: #82ab00;
}

這樣也可以實(shí)現(xiàn)絕對定位元素的居中。原因可點(diǎn)擊這里。如果絕對定位子元素的margin為auto,你會發(fā)現(xiàn)它水平垂直居中了!此方法僅適用于IE8+瀏覽器中,IE7就掛了,不過你可以下面這個(gè)方法:

.child{
    position: relative;
    width: 100px;
    height: 50px;
    left: 50%;
    margin-left: -50px;
    background-color: #82ab00;
}

2.不定寬
不定寬元素如果要居中需要額外的輔助手段
(1)css3新特性transform
如果你對瀏覽器并沒有什么特別要求,那么可以使用css3提出的新屬性transform完成居中需求

.child-4{
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    background-color: #82ab00;
}

這里需要子元素是絕對定位

(2)借助table元素
上面定寬元素設(shè)定左右margin為auto之所以可以居中,原因是左右margin會平分父元素剩下的空間。有個(gè)元素除外,那就是tabel元素。table有趣的地方在于它本身并不是塊級元素,如果不給它設(shè)定寬度的話,它的寬度由內(nèi)部元素的寬度“撐起”,但即使不設(shè)定它的寬度,僅設(shè)置margin-left:auto和margin-right:auto就可以實(shí)現(xiàn)水平居中。

       <div class="parent">
            <table class="table-wrap">
                <tbody>
                    <tr>
                        <td>
                            <div class="s-child">
                                我是子元素
                            </div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
.table-wrap{
    margin: 0 auto;
}

最大的缺點(diǎn)想必你也是知道,就是無關(guān)標(biāo)簽太多,加深了嵌套的層級,維護(hù)性很差。

(3)父元素使用float布局
這里需要多添加一層父元素,父子元素均float布局,之后設(shè)置position為relative,left為50%

<div class="parent-1">
    <div class="parent-float">
        <p class="child-float">我是子元素</p>
    </div>
</div>
.parent-1{
    width: 500px;
    height: 100px;
    margin-top: 50px;
    background-color: #eee;
}
.parent-float{
    float: left;
    clear: both;
    position: relative;
    left:50%;
    background-color: #999;
}
.child-float{
    float: left;
    position: relative;
    left: -50%;
}

缺點(diǎn)是你需要額外處理浮動(dòng)所帶來的一些問題。并且如果你設(shè)置了背景色,布局會有些混亂


父元素float布局混亂

以上是我對元素實(shí)現(xiàn)居中的一些方法,歡迎大家補(bǔ)充。

2017.6.11 晴
于上海浦東

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,154評論 1 92
  • 收聽音頻,戳鏈接,舊號itclan已暫停使用,歡迎關(guān)注微信itclanCoder公眾號可收聽更多音頻 前言 關(guān)于網(wǎng)...
    itclanCoder閱讀 8,353評論 3 30
  • 一 外部式css樣式 (也可稱為外聯(lián)式)就是把css代碼寫一個(gè)單獨(dú)的外部文件中,這個(gè)css樣式文件以“.css...
    KunMitnic閱讀 1,120評論 0 1
  • 本文主要是起筆記的作用,內(nèi)容來自慕課網(wǎng). 認(rèn)識CSS樣式 CSS全稱為“層疊樣式表 (Cascading Styl...
    0o凍僵的企鵝o0閱讀 2,750評論 0 30
  • 總有一天,我會克服金錢、簽證、路途、語言等諸多困難,漂洋過海,到達(dá)西西里,這片孕育出教父和《教父》的土地,去和這片...
    清曦_愛吃鍋包肉閱讀 512評論 1 0

友情鏈接更多精彩內(nèi)容