CSS居中完全指南

原文:Chris Coyier // September 2, 2014
https://centering-css-complete-guide

在CSS中如何居中這事兒是CSS為人所抱怨的典型代表之一×氩海“為毛它這么難盏混?%>_<%...”,開發(fā)者們抱怨道惜论。我認(rèn)為這個(gè)問題的關(guān)鍵不在于處理CSS居中難做许赃,而在于根據(jù)不同的場(chǎng)景,有太多不同的方法來解決居中問題馆类,以至于你無從下手混聊,不知道哪種方法能滿足你的需要。

因此乾巧,我們來做一個(gè)決策樹句喜,讓這事兒變得更簡單一些。

首先沟于,我的需求居中

水平居中
1.是inline或者inline-*元素咳胃,比如文本或者鏈接?
對(duì)于父元素是塊級(jí)元素的內(nèi)聯(lián)元素來說旷太,你只需要這么做

.center-children {
  text-align:center
}

demo http://codepen.io/chriscoyier/pen/HulzB

2.一個(gè)塊級(jí)元素
你只需要給這個(gè)塊級(jí)元素指定margin-leftmargin-right的值為auto(當(dāng)然展懈,這個(gè)塊級(jí)元素本身應(yīng)該被顯示的指定width,否則這個(gè)塊級(jí)元素的將占據(jù)整行的寬度供璧,也就沒有居中的需要了)

.center-me{
  margin:0 auto
}

demo http://codepen.io/chriscoyier/pen/eszon

不管它或者它的父級(jí)寬度是多少标沪,這樣的設(shè)置,你都能得到想要的結(jié)果嗜傅〗鹁洌  
另外:請(qǐng)注意,不要使用float把一個(gè)元素居中吕嘀。雖然违寞,這兒有個(gè)小技巧(戳我)贞瞒。。军浆。

3.多個(gè)塊級(jí)元素
如果你想讓兩個(gè)或者兩個(gè)以上的塊級(jí)元素在一行上面水平居中,那么最好的辦法是改變他們display的類型挡闰。這兒給兩個(gè)例子摄悯,一個(gè)使用inline-block,另一個(gè)使用flex撒遣。
demo http://codepen.io/chriscoyier/pen/ebing

當(dāng)然义黎,如果你的意思是讓多個(gè)塊級(jí)元素堆積疊加顯示在一條豎列上火的,那么設(shè)置左右外邊距的值為auto這一方法依然有效淑倾。
demo http://codepen.io/chriscoyier/pen/haCGt

垂直居中
垂直居中在CSS中有一點(diǎn)小麻煩

1.inline或者inline-*元素,比如文本或者鏈接
1.1 單行
有時(shí)候治力,只要內(nèi)聯(lián)或者文本元素具備相同的上下內(nèi)邊距,它們便能夠垂直居中顯示瓢省。

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

demo http://codepen.io/chriscoyier/pen/ldcwq

然而馒胆,當(dāng)因?yàn)槟承┰蜃S兀O(shè)置padding成為一個(gè)不可選選項(xiàng)掌动,而你又需要居中一些不需要換行的文本時(shí)粗恢,將line-heightheight設(shè)為相同的大小的值是一個(gè)不錯(cuò)的選擇族展。

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

demo http://codepen.io/chriscoyier/pen/LxHmK

1.2 多行
將上下內(nèi)邊距設(shè)置為相同大小從而使得單行文本垂直居中,這一方法對(duì)多行文本同樣有效冗茸。但是,如果在某些情況這一方法失效了怎么辦?也許芳室,可以通過使用表格元素或者使用CSS伍宦,將這些文本元素顯示在一個(gè)表格單元格內(nèi)(table cell)。在這種情況下遇骑,使用vertical-algin屬性處理居中與它通常在一行中處理元素的居中有所不同翔脱。(查看更多關(guān)于vertical-algin的知識(shí)點(diǎn)疚沐,看這兒https://css-tricks.com/what-is-vertical-align/
demohttp://codepen.io/chriscoyier/pen/ekoFx

除此之外,你還可以使用flexbox梯嗽,單個(gè)flex-child元素能夠很方便的被設(shè)置為垂直居中灯节,相對(duì)于它的父級(jí)元素炎疆。

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

demo http://codepen.io/chriscoyier/pen/uHygv

請(qǐng)記住,只有當(dāng)父容器具有固定高度(px, %, etc),當(dāng)前容器才具有高度。兩者是相互關(guān)聯(lián)的浦徊。
如果上面方法都不適用辑畦,你還可以使用“幽靈元素”這一方法。即將一個(gè)具有100%高度的偽元素放到容器內(nèi)鸵赖,文本以此來垂直居中。

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

demo http://codepen.io/chriscoyier/pen/ofwgD

2.一個(gè)塊級(jí)元素
2.1 知道元素高度
在網(wǎng)頁布局中,不知道元素的具體高度(即高度非固定值)是很常見的轮洋,原因很多弊予。比如,如果寬度變化床未,文本流需要改變它的高度以顯示文本竭翠;文本樣式變化;文字?jǐn)?shù)量變化薇搁;具有固定寬高比元素調(diào)整大小變化斋扰,比如圖片等等,都能引起高度變化啃洋。
但是传货,如果你知道高度,你可以這么來垂直居中:

.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; */
}

demo http://codepen.io/chriscoyier/pen/HiydJ

2.2 不知道元素高度
在不知道元素高度的情況宏娄,依然可以做到垂直居中问裕,即通過下移其父級(jí)高度的一半,再向上移動(dòng)其自身高度的一半孵坚。

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

demo http://codepen.io/chriscoyier/pen/lpema

3.使用flexbox
不要驚訝粮宛,這種情況下使用flexbox會(huì)很方便

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

demo http://codepen.io/chriscoyier/pen/FqDyi

垂直居中 && 水平居中
你可以將上面的提到的方法以任意方式組合起來,從而得到完美的居中元素卖宠。但是巍杈,我發(fā)現(xiàn),通常主要有以下三種方式扛伍。

1.元素具有固定的寬度和高度
使用負(fù)外邊距筷畦,將其值設(shè)為寬度和高度的一半。這樣刺洒,在你將元素在絕對(duì)定位并且設(shè)置50%和50%的上/左偏移后鳖宾,元素位置將居中。這一方法是跨瀏覽器支持的逆航。

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

demo http://codepen.io/chriscoyier/pen/JGofm

2.元素寬度和高度未知
如果你不知道元素的寬度或者高度鼎文,你可以使用transform屬性,即translate(-50%, -50%)纸泡,在橫向漂问、縱向上都偏移自身高度的一半以居中赖瞒。這一偏移是基于瀏覽器計(jì)算后得到的元素自身的寬度和高度。

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

demo http://codepen.io/chriscoyier/pen/lgFiq

3.使用flexbox
要在flexbox中是的兩個(gè)方向上都居中蚤假,你需要使用兩個(gè)居中屬性:

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

demo http://codepen.io/chriscoyier/pen/msItD

結(jié)果
好了栏饮,現(xiàn)在你可以用CSS中得到想要的居中結(jié)果了!

PS:初次翻譯磷仰,如有問題袍嬉,請(qǐng)?jiān)徟u(píng)指正。如果您發(fā)現(xiàn)文章那兒翻譯錯(cuò)誤或不妥灶平,請(qǐng)留言指出伺通!
PS2:簡書插入代碼塊沒搞會(huì),o(╯□╰)o逢享,代碼和代碼塊的問題下次一塊兒來調(diào)罐监。
PS3:代碼和代碼塊已修改 2015/8/19 23:29:21
PS4:等我翻譯完,才發(fā)現(xiàn)簡書上公子肥馬輕裘童鞋已經(jīng)翻譯過這篇文章了瞒爬, 地址戳這兒
PS5:舊版是富文本編輯器弄的弓柱,代碼塊不好弄,所以改到markdown編輯器后新建了一篇文章侧但,老版本戳這兒

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末矢空,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子禀横,更是在濱河造成了極大的恐慌屁药,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柏锄,死亡現(xiàn)場(chǎng)離奇詭異酿箭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绢彤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門七问,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茫舶,你說我怎么就攤上這事∩蔡剩” “怎么了饶氏?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長有勾。 經(jīng)常有香客問我疹启,道長,這世上最難降的妖魔是什么蔼卡? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任喊崖,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荤懂。我一直安慰自己茁裙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布节仿。 她就那樣靜靜地躺著晤锥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廊宪。 梳的紋絲不亂的頭發(fā)上矾瘾,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音箭启,去河邊找鬼壕翩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛傅寡,可吹牛的內(nèi)容都是我干的戈泼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼赏僧,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼大猛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淀零,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤挽绩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后驾中,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唉堪,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年肩民,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唠亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡持痰,死狀恐怖灶搜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情工窍,我是刑警寧澤割卖,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站患雏,受9級(jí)特大地震影響鹏溯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淹仑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一丙挽、第九天 我趴在偏房一處隱蔽的房頂上張望肺孵。 院中可真熱鬧,春花似錦颜阐、人聲如沸平窘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽初婆。三九已至,卻和暖如春猿棉,著一層夾襖步出監(jiān)牢的瞬間磅叛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工萨赁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弊琴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓杖爽,卻偏偏與公主長得像敲董,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慰安,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • 在CSS中如何居中這事兒是CSS為人所抱怨的典型代表之一腋寨。“為毛它這么難化焕?%>_<%”萄窜,開發(fā)者們抱怨道。我認(rèn)為這個(gè)...
    紅綠燈的黃閱讀 1,031評(píng)論 0 1
  • CSS中如何完美做到居中撒桨,一直是令前端工程師頭疼的問題查刻。最近讀到CSS-TRICKS中的一篇帖子,將居中問題的解決...
    擦柱而出閱讀 595評(píng)論 0 5
  • 金幣在錢柜里當(dāng)啷作響凤类, 貪婪的目光泛著金黃穗泵, 撒旦嘴角劃過弧線, 把玩手掌中精致的魔力谜疤, 幕布緩緩拉開佃延, 遮擋住陽...
    北原遇福澤閱讀 379評(píng)論 24 29
  • 1、GitHub上創(chuàng)建對(duì)應(yīng)新項(xiàng)目 README可以不用 2茎截、上傳 cd到項(xiàng)目目錄 echo "# Joey_web...
    Joeyczz閱讀 256評(píng)論 0 0