电竞比分网-中国电竞赛事及体育赛事平台

分享

CSS居中完整指南

 浪子小新 2018-04-17

使用 CSS 實現(xiàn)居中效果困難嗎?顯然不是。實際上有許多方法可以實現(xiàn)居中效果,但在具體情況中,我們往往無法判斷哪種方法最合適。

所以讓我們來創(chuàng)建一個層次結(jié)構(gòu)的方法集,幫助你解決選擇困難癥~

水平居中

行內(nèi)或類行內(nèi)元素(比如文本和鏈接)

在塊級父容器中讓行內(nèi)元素居中,只需使用 text-align: center;

這種方法可以讓 inline/inline-block/inline-table/inline/flex 等類型的元素實現(xiàn)居中。

塊級元素

讓塊級元素居中的方法就是設(shè)置 margin-leftmargin-rightauto(前提是已經(jīng)為元素設(shè)置了適當(dāng)?shù)?width 寬度,否則塊級元素的寬度會被拉伸為父級容器的寬度)。常見用法如下所示:

.center-me {
  margin: 0 auto;
}

無論父級容器和塊級元素的寬度如何變化,都不會影響塊級元素的居中效果。

請注意,float 屬性是不能實現(xiàn)元素居中的。如果你想知道使用 float 實現(xiàn)居中的非常規(guī)方案,可以參考這篇文章。

有關(guān)于水平居中更多實現(xiàn)方法,可以參閱早期整理的一篇博客《六種實現(xiàn)元素水平居中

多個塊級元素

如果要讓多個塊級元素在同一水平線上居中,那么可以修改它們的 display 值。這里有兩個示例,其中一個使用了 inline-block 的顯示方式,另一個使用了 flexbox 的顯示方式:

如果你想讓多個垂直堆棧的塊元素,那么仍然可以通過設(shè)置 margin-leftmargin-rightauto 來實現(xiàn):

垂直居中

使用 CSS 實現(xiàn)垂直居中需要一些技巧。

行內(nèi)或類行內(nèi)元素(比如文本和鏈接)

單行

對于單行行內(nèi)或者文本元素,只需為它們添加等值的 padding-toppadding-bottom 就可以實現(xiàn)垂直居中:

.link {
  padding-top: 30px;
  padding-bottom: 30px;
}

如果因為某些原因我們不能使用 padding 屬性來實現(xiàn)垂直居中,而且已知文本不會換行,那么就可以讓 line-heightcenter 相等,從而實現(xiàn)垂直居中:

.center-text-trick {
  height: 100px;
  line-height: 100px;
  white-space: nowrap;
}

多行

對于多行文本,同樣可以使用等值 padding-toppadding-bottom 的方式實現(xiàn)垂直居中。如果你在使用過程中發(fā)現(xiàn)這種方法沒見效,那么你可以通過 CSS 為文本設(shè)置一個類似 table-cell 的父級容器,然后使用 vertical-align 屬性實現(xiàn)垂直居中:

此外,你還可以使用 flexbox 實現(xiàn)垂直居中,對于父級容器為 display: flex 的元素來說,它的每一個子元素都是垂直居中的:

.flex-center-vertically {
  display: flex;
  justify-content: center;
  flex-direction: column;
  height: 400px;
}

值得注意的是,上述方法只適用于父級容器擁有確定高度的元素。

如果上述方法都不起作用,那么你就需要使用被稱為幽靈元素(ghost element)的非常規(guī)解決方式:在垂直居中的元素上添加偽元素,設(shè)置偽元素的高等于父級容器的高,然后為文本添加 vertical-align: middle; 樣式,即可實現(xiàn)垂直居中。

.ghost-center {
  position: relative;
}
.ghost-center::before {
  content: " ";
  display: inline-block;
  height: 100%;
  width: 1%;
  vertical-align: middle;
}
.ghost-center p {
  display: inline-block;
  vertical-align: middle;
}

塊級元素

已知元素的高度

無法獲知元素的具體高度是非常常見的一種狀況,比如:視區(qū)寬度變化,會觸發(fā)布局重繪,從而改變高度;對文本施加不同的樣式會改變高度;文本的內(nèi)容量不同會改變高度;當(dāng)寬度變化時,對于寬高比例固定的元素(比如圖片),也會自動調(diào)整高度……

如果我們知道元素的高度,可以這樣來實現(xiàn)垂直居中:

.parent {
  position: relative;
}
.child {
  position: absolute;
  top: 50%;
  height: 100px;
  margin-top: -50px; /* account for padding and border if not using box-sizing: border-box; */
}

未知元素的高度

如果我們不知道元素的高度,那么就需要先將元素定位到容器的中心位置,然后使用 transformtranslate 屬性,將元素的中心和父容器的中心重合,從而實現(xiàn)垂直居中:

.parent {
  position: relative;
}
.child {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

flexbox

使用 flexbox 實現(xiàn)垂直居中非常簡單:

.parent {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

水平且垂直居中

通過組合水平居中和垂直居中的技巧,可以實現(xiàn)非常完美的居中效果。我覺得可以將它們分為三種類型:

寬高固定元素

設(shè)定父級容器為相對定位的容器,設(shè)定子元素絕對定位的位置 position: absolute; top: 50%; left: 50%,最后使用負向 margin 實現(xiàn)水平和垂直居中,margin 的值為寬高(具體的寬高需要根據(jù)實際情況計算 padding)的一半。

.parent {
  position: relative;
}
.child {
  width: 300px;
  height: 100px;
  padding: 20px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -70px 0 0 -170px;
}

寬高不固定元素

如果無法獲取確定的寬高,同樣需要設(shè)定父級容器為相對定位的容器,設(shè)定子元素絕對定位的位置 position: absolute; top: 50%; left: 50%。不同的是,接下來需要使用 transform: translate(-50%, -50%); 實現(xiàn)垂直居中:

.parent {
  position: relative;
}
.child {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

使用 transform 有一個缺陷,就是當(dāng)計算結(jié)果含有小數(shù)時(比如 0.5),會讓整個元素看起來是模糊的,一種解決方案就是為父級元素設(shè)置 transform-style: preserve-3d; 樣式:

.parent-element {
  -webkit-transform-style: preserve-3d;
  -moz-transform-style: preserve-3d;
  transform-style: preserve-3d;
}

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

flexbox

使用 flexbox 實現(xiàn)水平和垂直居中,只需使用兩條居中屬性即可:

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}

結(jié)論

你看,使用 CSS 可以讓任何元素實現(xiàn)居中效果。

本文根據(jù)@Chris Coyier的《Centering in CSS: A Complete Guide》所譯,整個譯文帶有我們自己的理解與思想,如果譯得不好或有不對之處還請同行朋友指點。如需轉(zhuǎn)載此譯文,需注明英文出處:https:///centering-css-complete-guide/。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多