CSS 居中的常見(jiàn)實(shí)現(xiàn)方式

居中是很常見(jiàn)的網(wǎng)頁(yè)布局顿膨,包括水平居中和垂直居中,看起來(lái)似乎很簡(jiǎn)單恋沃,但每次到實(shí)際用的時(shí)候總會(huì)發(fā)現(xiàn)“咦,怎么不 work”囊咏,到底是哪里出了差錯(cuò),明明這樣是可以的八稹?

不知道你有沒(méi)有這種經(jīng)歷户辞,反正我是經(jīng)常有,所以這里整理一下我們平時(shí)常見(jiàn)的居中場(chǎng)景以及分別實(shí)現(xiàn)水平居中和垂直居中的方法底燎。

常見(jiàn)的居中場(chǎng)景

  • 文本居中
  • div 中的 div 居中
  • button 居中
  • 圖片居中

其中垂直居中還包括元素高度固定和不定兩種。

水平居中

水平居中比較簡(jiǎn)單书蚪,主要實(shí)現(xiàn)方法如下。

  • 對(duì)于行內(nèi)元素可以直接設(shè)置父元素為 text-align: center;即可迅栅,對(duì)于文本居中读存、button 居中、圖片居中均適用让簿。

  • 對(duì)于塊級(jí)元素或者是 inline-block 的元素可以借助子元素的 margin 值來(lái)實(shí)現(xiàn),設(shè)置子元素為 margin: 0 auto; 即可秀睛。

如果內(nèi)層元素有多個(gè)的話想要整體居中怎么做呢,做法大致相同蹂安。

這種情況下內(nèi)層元素一般有設(shè)置寬度,因?yàn)槿绻菈K級(jí)元素的話默認(rèn)占滿整行田盈,這樣是談不上居中的。

將內(nèi)層的元素設(shè)置為 display: inline-block; 使其居于一行允瞧,然后外層元素設(shè)置 text-align: center;蛮拔,如下圖:

  • 若子元素包含float:left屬性痹升,為了讓子元素水平居中,則可讓父元素寬度設(shè)置為 fit-content疼蛾,并且配合margin, 作如下設(shè)置:
.parent{
    width: -moz-fit-content;
    width: -webkit-fit-content;
    width: fit-content;
    margin: 0 auto;
}

fit-content 是 CSS3 中給 width 屬性新加的一個(gè)屬性值,它配合 margin 可以輕松實(shí)現(xiàn)水平居中, 目前只支持 Chrome 和 Firefox 瀏覽器

  • 使用絕對(duì)定位方式,以及負(fù)值的 margin-left, 子元素設(shè)置如下:
.son{
    position: absolute;
    width: 固定;
    left: 50%;
    margin-left: -0.5寬度;
}
  • 使用絕對(duì)定位方式, 以及 left:0;right:0;margin:0 auto; 子元素設(shè)置如下:
.son{
    position: absolute;
    width: 固定;
    left: 0;
    right: 0;
    margin: 0 auto;
}

這里解釋一下為什么 leftright 要設(shè)置為 0

定位元素的寬度和水平放置滿足一個(gè)等式据过。

left+ margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-righ + right = 包含塊的寬度

默認(rèn)情況下,這四個(gè)值都是 auto绳锅,會(huì)相對(duì)于其靜態(tài)位置放置,所謂靜態(tài)位置是指元素在浮動(dòng)之前所占據(jù)的位置鳞芙。在從左往右讀的語(yǔ)言中,left 會(huì)被設(shè)置為 auto原朝,則值為靜態(tài)位置左邊界距離包含塊左邊界的像素值,同理 right 會(huì)設(shè)置為靜態(tài)位置右邊界距離包含塊右邊界的像素值喳坠,此時(shí)剛好

left+ border-left-width + padding-left + width + padding-right + border-right-width + right = 包含塊的寬度

因此左右 margin 自動(dòng)變?yōu)?0,這時(shí)我們?cè)O(shè)置 margin: 0 auto; 不會(huì)有任何左右壕鹉,所以需要將 leftright 設(shè)置為 0 使得 margin: 0 auto; 生效,從而實(shí)現(xiàn)居中晾浴。

  • 使用 CSS3 中新增的 transform 屬性, 子元素設(shè)置如下:
    (這種類似于上面提到的利用絕對(duì)定位以及負(fù)值的 margin-left负乡,同樣是先根據(jù)絕對(duì)定位偏移 50%抖棘,然后往回移動(dòng)自身寬度的一半達(dá)到居中)
.son{
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
}
  • 使用 flex

在 Flex 出現(xiàn)之后,居中的實(shí)現(xiàn)變得簡(jiǎn)單了很多狸涌,它幾乎可以解決所有的居中問(wèn)題,目前主流瀏覽器均已支持 Flex杈抢,在某些低版本的 IE 尚不支持。

父元素設(shè)置如下:

.parent {
  display: flex;
  justify-content: center;
}
Flex 支持情況

垂直居中

垂直居中比較狡猾惶楼,經(jīng)常會(huì)出現(xiàn)意想不到的問(wèn)題诊杆。

1. 元素高度固定

  • 如果是單行文本何陆,可以設(shè)置 line-heightheight 同高

  • 使用相對(duì)定位,父元素設(shè)置 position: relative;贷盲,子元素設(shè)置如下:

 .son{
    position:absolute;
    top:50%;
    height:固定;
    margin-top:-0.5高度;
}

or

.son{
    position:absolute;
    height:固定;
    top:0;
    bottom:0;
    margin:auto 0;
}

2. 元素高度不固定

  • 使用 vertical-align: middle;

使用 vertical-align: middle; 來(lái)達(dá)到居中也是很常見(jiàn)的一種做法,但是在某些情況下巩剖,我們會(huì)發(fā)現(xiàn)加了并沒(méi)有起作用,這是因?yàn)?vertical-align: middle; 只有在某些情況下才會(huì)生效佳魔。

vertical-align: middle; 起作用的前提是元素為 inline 水平元素或者 display: table-cell; 元素曙聂,包括 span鞠鲜, imgspan贤姆, inputbutton霞捡, td 以及通過(guò) display 屬性使之顯示為 inline 或者 table-cell 的元素。這意味著碧信,默認(rèn)情況下,vertical-align: middle; 對(duì) divp 元素等無(wú)效音婶。

此外,vertical-align: middle; 只有當(dāng)父元素設(shè)置了 line-height 時(shí)才會(huì)起作用衣式。(line-heightheight 同高)

vertical-align不可繼承,必須對(duì)子元素單獨(dú)設(shè)置

  • 使用 transform碴卧,利用父元素相對(duì)定位(position:relative),子元素設(shè)置如下:
.son {
    transform: translateY(-50%);
    position: absolute;
    top: 50%;
}
  • 使用 Flex 布局住册,父元素設(shè)置如下:
.parent {
  display: flex;
  align-items: center;
}

總結(jié)

水平居中的方法:

  • 文本居中使用 text-align: center;
  • 利用元素的 margin
  • 元素寬度設(shè)置為 fit-content(IE 不支持)
  • 使用絕對(duì)定位和元素的負(fù) margin 或者 left, right, top, bottom
  • 使用絕對(duì)定位和 transform
  • 使用 Flex

垂直居中的方式:

  • 文本居中使用 line-height
  • 使用相對(duì)定位和元素的負(fù) margin 或者 left, right, top, bottom
  • 使用 vertical-align(有一定使用環(huán)境和前提)
  • 使用絕對(duì)定位和 transform
  • 使用 Flex
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓮具,一起剝皮案震驚了整個(gè)濱河市凡人,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叹阔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耳幢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡睛藻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)店印,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吱窝,你說(shuō)我怎么就攤上這事≡合浚” “怎么了兴使?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵发魄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我俩垃,道長(zhǎng),這世上最難降的妖魔是什么口柳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮跃闹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘望艺。我一直安慰自己,他們只是感情好找默,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著惩激,像睡著了一般店煞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浅缸,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音衩椒,去河邊找鬼。 笑死毛萌,一個(gè)胖子當(dāng)著我的面吹牛苟弛,可吹牛的內(nèi)容都是我干的阁将。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼做盅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吹榴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤图筹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后远剩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體扣溺,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓜晤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痢掠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡志群,死狀恐怖蛔钙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吁脱,我是刑警寧澤桑涎,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站攻冷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏等曼。R本人自食惡果不足惜里烦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一胁黑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧州泊,春花似錦、人聲如沸遥皂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弟孟。三九已至仇祭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乌奇,已是汗流浹背没讲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工礁苗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人试伙。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像疏叨,于是被迫代替她去往敵國(guó)和親潘靖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚤蔓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評(píng)論 1 92
  • 1. 前言 前端圈有個(gè)“沟ゼ牛”:在面試時(shí)贬芥,問(wèn)個(gè)css的position屬性能刷掉一半人宣决,其中不乏工作四五年的同學(xué)。在...
    YjWorld閱讀 4,425評(píng)論 5 15
  • 收聽(tīng)音頻,戳鏈接,舊號(hào)itclan已暫停使用,歡迎關(guān)注微信itclanCoder公眾號(hào)可收聽(tīng)更多音頻 前言 關(guān)于網(wǎng)...
    itclanCoder閱讀 8,156評(píng)論 3 30
  • 前端布局非常重要的一環(huán)就是頁(yè)面框架的搭建尊沸,也是最基礎(chǔ)的一環(huán)。在頁(yè)面框架的搭建之中椒丧,又有居中布局、多列布局以及全局布...
    一個(gè)敲代碼的前端妹子閱讀 772評(píng)論 0 12
  • 冬天的到來(lái)壶熏,意味著新年的來(lái)臨句柠。今年的冬天棒假,雪花比以往更加的多了。大雪一夜過(guò)后帽哑,大地鋪上厚厚的白衣谜酒,朋友們抑制不住自...
    1e01128ebff4閱讀 343評(píng)論 0 0