CSS3 垂直居中

CSS里實現(xiàn)水平居中非常容易,inline元素用text-align:center;,block元素用margin:auto;就行了佃蚜。但要實現(xiàn)垂直居中確是一大難題。本篇收集了一些已知的方案着绊,整理出來谐算,以備將來取用。代碼可以從GitHub上下載归露。

  • Flex彈性盒子
  • absolute絕對定位
  • vh視口單位
  • 偽元素

Flex彈性盒子

Flex彈性盒子應(yīng)該是解決垂直居中的最佳方案洲脂,隨著IE10的逐漸沒落,惹人煩的兼容性問題正逐漸被克服靶擦。用法很簡單腮考,給需要垂直居中的元素的父容器設(shè)置display:flex,并指定align-items: center;就搞定了:


body {
    …
    display: flex;
    align-items: center;
}
main {
    …
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
}

<body>
<main>
    <div>用flex實現(xiàn)</div>
    <p>垂直居中</p>
</main>
</body>

我們想將main垂直居中玄捕,只需給它的父元素body設(shè)display:flex;和align-items: center;即可踩蔚。main里有一個div和一個p,想將這兩個元素在main里垂直居中枚粘,同樣只需給它們的父元素main設(shè)display:flex;和align-items: center;馅闽。另外justify-content和flex-direction用于調(diào)整這兩個子元素水平居中的排列順序。(如果對彈性盒子及其屬性不熟悉馍迄,可以參照CSS3 flex盒子語法介紹福也,也可以點例子頁面試一下)

absolute絕對定位

一種很常見的方法是用絕對定位配合負(fù)值margin。思路是設(shè)成absolute后攀圈,指定top和left為50%暴凑,將元素的左上角定位點放到頁面正中心。然后用負(fù)值margin一半的元素寬高度將元素拉回頁面正中心:

main {
    position: absolute;
    width: 18em;
    height: 10em;
    top: 50%;
    left: 50%;
    margin-top: -9em;
    margin-left: -5em;
    …
}

但缺點是你需要事先指定元素的width和height赘来,否則無法給負(fù)margin設(shè)值现喳,顯得不夠靈活凯傲。其實不必固定元素的寬高,改用translate()位移來替代負(fù)margin嗦篱,實現(xiàn)將元素拉回頁面正中心:(如果對變形元素不熟冰单,可以參照CSS3 transform介紹

main {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    …
}
<main>
    <div>用absolute實現(xiàn)</div>
    <p>垂直居中</p>
</main>

用絕對定位absolute讓需要垂直居中的元素脫離文檔流,指定top和left各50%將元素左上角定位點設(shè)到頁面正中心灸促。然后用translate()各負(fù)50%诫欠,將元素拉回頁面正中心。思路和負(fù)margin是一致的浴栽,優(yōu)勢是不必固定元素的寬高了荒叼。缺點是absolute絕對定位威力太大,要考慮是否會對頁面布局造成影響典鸡。

vh視口單位

上例中translate()將元素回拉的前提是甩挫,absolute絕對定位來設(shè)top和left各50%。但如果看到absolute絕對定位就覺得不舒服椿每,可以改成vh視口單位來設(shè)元素左上角的定位點伊者。

vh就是視口高度,vw是視口寬度间护。例如1vh表示視口高度的1%亦渗。

vmin是視口寬高的小值,例如vh<vw時汁尺,1vmin等價于1vh法精。反之1vmin等價于1vw。

vmax是視口寬高的大值痴突,例如vh<vw時搂蜓,1vmax等價于1vw。反之1vmax等價于1vh辽装。

所以我們可以用vh替代absolute絕對定位:


main {
    width: 9em;
    margin: 50vh auto 0;
    transform: translateY(-50%);
    …
}
<main>
    <div>用vh實現(xiàn)</div>
    <p>垂直居中</p>
</main>

因為去掉了absolute帮碰,失去了包裹性,所以需要指定width大小拾积。margin-top設(shè)為50vh殉挽,表示視口高度的50%位置。然后用translateY(-50%)將元素拉上去拓巧。之所以用translateY因為水平位置已經(jīng)指定margin為auto實現(xiàn)了居中斯碌,所以水平位置不用回拉。

偽元素

如果待居中的元素是inline-block的話肛度,可以給父元素加上偽元素傻唾,配合inline-block / vertical-align實現(xiàn)居中:


.week-title {
    height: 6.6%;
    text-align: center;
}
.week-title::before {    //父容器加上偽元素,配合inline-block / vertical-align
    content: '';
    height: 100%;
    display: inline-block;
    vertical-align: middle;
}
.week-title div {     //待居中的元素需要是inline-block
    width: 12.5%;
    display: inline-block;
    vertical-align: middle;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末承耿,一起剝皮案震驚了整個濱河市冠骄,隨后出現(xiàn)的幾起案子逛裤,更是在濱河造成了極大的恐慌,老刑警劉巖猴抹,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锁荔,居然都是意外死亡蟀给,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門阳堕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跋理,“玉大人,你說我怎么就攤上這事恬总∏捌眨” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵壹堰,是天一觀的道長拭卿。 經(jīng)常有香客問我,道長贱纠,這世上最難降的妖魔是什么峻厚? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谆焊,結(jié)果婚禮上惠桃,老公的妹妹穿的比我還像新娘。我一直安慰自己辖试,他們只是感情好辜王,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罐孝,像睡著了一般呐馆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莲兢,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天摹恰,我揣著相機(jī)與錄音,去河邊找鬼怒见。 笑死俗慈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遣耍。 我是一名探鬼主播闺阱,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舵变!你這毒婦竟也來了酣溃?” 一聲冷哼從身側(cè)響起瘦穆,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赊豌,沒想到半個月后扛或,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡碘饼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年熙兔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾恼。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡住涉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钠绍,到底是詐尸還是另有隱情舆声,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布柳爽,位于F島的核電站媳握,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磷脯。R本人自食惡果不足惜毙芜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望争拐。 院中可真熱鬧腋粥,春花似錦、人聲如沸架曹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绑雄。三九已至展辞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間万牺,已是汗流浹背罗珍。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留脚粟,地道東北人覆旱。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像核无,于是被迫代替她去往敵國和親扣唱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評論 1 92
  • 收聽音頻,戳鏈接,舊號itclan已暫停使用,歡迎關(guān)注微信itclanCoder公眾號可收聽更多音頻 前言 關(guān)于網(wǎng)...
    itclanCoder閱讀 8,186評論 3 30
  • 以下文章是我在網(wǎng)上收集的內(nèi)容噪沙,為了記錄自己的學(xué)習(xí)以及為了以后不到處找而記錄下來炼彪,如果對你有用,請感謝寫這些文章的前...
    DCbryant閱讀 940評論 0 2
  • 作為一個切圖的頁面仔,工作中總是要用到垂直居中.忙的時候一般就隨便google一個復(fù)制粘貼上去,也從來沒有思考過內(nèi)...
    CoderMageFox閱讀 475評論 0 2
  • 1. 工具 Xcode正歼,GIT, CocoaPods, Crash排查, ... 2.語言 GCD,block,d...
    feldspar閱讀 135評論 0 0