CSS 居中小結(jié)

水平居中

行內(nèi)或類行內(nèi)元素

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

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

塊級(jí)元素

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

.center-me {
  margin: 0 auto;
}

無論父級(jí)容器和塊級(jí)元素的寬度如何變化力九,都不會(huì)影響塊級(jí)元素的居中效果邑闺。

多個(gè)塊級(jí)元素

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

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

垂直居中

行內(nèi)或類行內(nèi)元素

單行

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

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

如果因?yàn)槟承┰蛭覀儾荒苁褂?padding 屬性來實(shí)現(xiàn)垂直居中煤杀,而且已知文本不會(huì)換行,那么就可以讓 line-heightcenter 相等酌儒,從而實(shí)現(xiàn)垂直居中:

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

多行

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

此外坦报,還可以使用 flexbox 實(shí)現(xiàn)垂直居中片择,對(duì)于父級(jí)容器為 display: flex 的元素來說,它的每一個(gè)子元素都是垂直居中的

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

值得注意的是构回,上述方法只適用于父級(jí)容器擁有確定高度的元素纤掸。

如果上述方法都不起作用,那么你就需要使用被稱為 幽靈元素(ghost element) 的非常規(guī)解決方式:在垂直居中的元素上添加偽元素借跪,設(shè)置偽元素的高等于父級(jí)容器的高,然后為文本添加vertical-align: center; 樣式歇由,即可實(shí)現(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;
}

塊級(jí)元素

已知元素的高度

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

如果我們知道元素的高度,可以這樣來實(shí)現(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 屬性,將元素的中心和父容器的中心重合内舟,從而實(shí)現(xiàn)垂直居中:

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

flexbox

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

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

水平且垂直居中

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

寬高固定元素

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

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

寬高不固定元素

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

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

使用 transform 有一個(gè)缺陷撒会,就是當(dāng)計(jì)算結(jié)果含有小數(shù)時(shí)(比如 0.5 )师妙,會(huì)讓整個(gè)元素看起來是模糊的,一種解決方案就是為父級(jí)元素設(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 實(shí)現(xiàn)水平和垂直居中怔檩,只需使用兩條居中屬性即可:

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薛训,一起剝皮案震驚了整個(gè)濱河市仑氛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌介袜,老刑警劉巖出吹,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸠珠,居然都是意外死亡秋麸,警方通過查閱死者的電腦和手機(jī)渐排,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門灸蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事孽水。” “怎么了城看?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵女气,是天一觀的道長测柠。 經(jīng)常有香客問我,道長轰胁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任赃阀,我火速辦了婚禮,結(jié)果婚禮上榛斯,老公的妹妹穿的比我還像新娘。我一直安慰自己驮俗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布王凑。 她就那樣靜靜地躺著,像睡著了一般索烹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上术荤,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音端圈,去河邊找鬼。 笑死舱权,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仑嗅。 我是一名探鬼主播张症,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼鸵贬,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了阔逼?” 一聲冷哼從身側(cè)響起兆衅,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤嗜浮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后危融,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吉殃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片率寡。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冶共,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捅僵,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布庙楚,位于F島的核電站,受9級(jí)特大地震影響馒闷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纳账,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一疏虫、第九天 我趴在偏房一處隱蔽的房頂上張望啤呼。 院中可真熱鬧呢袱,春花似錦、人聲如沸产捞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽看靠。三九已至,卻和暖如春鸥滨,著一層夾襖步出監(jiān)牢的瞬間谤祖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工凸主, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留额湘,地道東北人卿吐。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓嗡官,卻偏偏與公主長得像毯焕,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纳猫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案续担? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,748評(píng)論 1 92
  • CSS居中總結(jié) 最近在學(xué)習(xí)CSS居中,居中里面又包含水平居中和垂直居中,分不太清內(nèi)聯(lián)元素(inline or in...
    從這到那閱讀 413評(píng)論 1 2
  • 簡單地整理一些css居中的方法物遇。 text-align:center: 這種方法可以讓** inline/inli...
    饑人谷_Dylan閱讀 637評(píng)論 1 52
  • 博客原文地址:Claiyre的個(gè)人博客 https://claiyre.github.io/如需轉(zhuǎn)載,請(qǐng)?jiān)谖恼麻_頭...
    Claiyre閱讀 389評(píng)論 1 3
  • 下面是CSS居中的幾種方法: 水平居中元素: 通用方法起趾,元素的寬高未知 方式一:CSS3 transform 方式...
    饑人谷_enzo閱讀 626評(píng)論 0 6