利用 CSS 居中對齊

CSS 居中的方法實(shí)在是太多啦,每次光靠 Google 去搜都要費(fèi)好大力氣。看了 Centering in CSS: A Complete Guide 才清楚了許多,對自己的認(rèn)識做個(gè)總結(jié)。

[TOC]

水平居中

inline 和 inline-* 元素

在一個(gè) block-level 中的 inline, inline-block, inline-table, inline-flex 元素,居中只需要一行:

.center-children {
    text-align: center;
}

block-level 元素

將左右的 margin 設(shè)置升 auto 就可以讓一個(gè) block-level 元素居中,常常見到這種寫法:

.center{
  margin: 0 auto;
}

簡寫雖然方便,但是如果不希望上下 margin 設(shè)置為 0,此寫法就會(huì)帶來副作用。分別設(shè)置會(huì)更安全些:

.center{
  margin-left:  auto;
  margin-right: auto;
}

至少兩個(gè)的 block-level 元素

多個(gè) block-level 的元素在居中在一行,需要將 display: block 改為 display: inline-block 然后設(shè)置其父元素的 text-align,具體見下樣例:

<a class="jsbin-embed" >JS Bin on jsbin.com</a><script src="http://static.jsbin.com/js/embed.min.js?3.35.5"></script>

或者,你也可以使用 flexbox 呀~ 這個(gè)稍后說。

垂直居中

垂直居中會(huì)稍微麻煩一丟

inline 和 inline-* 元素

有一個(gè)簡單粗暴的方法:直接設(shè)置上下 padding 相等。不過有時(shí)候,這個(gè)方法不是那么有效。

只有一行

因?yàn)橹挥幸恍校阅茉O(shè)置 line-heightheight 相等完成居中。

存在多行

如果是自己設(shè)置的 table-cell 元素,需要設(shè)置 vertical-align: middle; 完成居中。在 td 這項(xiàng)屬性值是默認(rèn)的,不要設(shè)置。詳見樣例:

<a class="jsbin-embed" >JS Bin on jsbin.com</a><script src="http://static.jsbin.com/js/embed.min.js?3.35.5"></script>

巧了,你也可以使用 flexbox 呀~ 這個(gè)稍后再說。

一個(gè) block-level 元素

有些時(shí)候我們未必會(huì)知道 block-level 元素的高度,這取決于其內(nèi)部放置的元素。如果不用 flexbox 的話,需要分情況討論:

已知高度

已知高度的話,先學(xué)會(huì)算數(shù),再學(xué)會(huì)定位,用樣例說話:

<a class="jsbin-embed" >JS Bin on jsbin.com</a><script src="http://static.jsbin.com/js/embed.min.js?3.35.5"></script>

未知高度

未知也沒關(guān)系,設(shè)置 top: 50%,這樣元素的頂部就處于父元素正中間,再讓其向上平移自身 50%(transform: translateY(-50%);)的高度,其內(nèi)容就居中了。可以自己編輯樣例試試:

<a class="jsbin-embed" >JS Bin on jsbin.com</a><script src="http://static.jsbin.com/js/embed.min.js?3.35.5"></script>

當(dāng)然,你也可以使用 flexbox 呀~ 這個(gè)還是稍后再說。

水平垂直居中

可以通過以上方法的組合按自己喜歡的方式完成水平居中。其中通過定位對各個(gè)瀏覽器都比較友好,水平居中直接設(shè)置 top: 50%; left: 50%;;垂直居中按照「已知高度」和「未知高度」的思路區(qū)分實(shí)現(xiàn),注意在「未知高度」時(shí)還要兼顧 x 方向平移 50%(即 transform: translate(-50%, -50%))。

使用 flexbox!!!

如果不需要考慮部分老舊瀏覽器的兼容問題,那么 flexbox 則是萬能了。強(qiáng)烈推薦學(xué)習(xí)并使用 flexbox,會(huì)省下不少功夫!怎么學(xué)習(xí)?青蛙會(huì)告訴你~

思考

這里說得所有居中,都是瀏覽器認(rèn)為的居中,有時(shí)與人類眼中的居中,是不同的。例如,將單行內(nèi)容為 。。。 的文字按以上任一方法垂直居中,其顯示效果是偏下的。原因歸根于,我們看到的文字是基于像素的,瀏覽器看到的文字是基于當(dāng)前選用的字體信息,可以通過這篇文章(或其譯文)了解大概。對于文字,瀏覽器認(rèn)為的居中未必是像素居中。所以,某個(gè)大字標(biāo)題在網(wǎng)頁中的居中效果和設(shè)計(jì)稿中不同時(shí),不要太驚訝。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,796評論 1 92
  • 居中一直是CSS中被抱怨的典型。為什么實(shí)現(xiàn)起來這么辛苦?所以有人被嘲笑。我覺得問題不是沒有辦法做到,只是視情況而定...
    雨季諾言閱讀 404評論 1 1
  • 1標(biāo)準(zhǔn)的CSS的盒子模型?與低版本IE的盒子模型有什么不同的? CSS盒子模型:由四個(gè)屬性組成的外邊距(margi...
    秦小婕閱讀 1,213評論 0 1
  • 今天醒得老早啦,頭一次六點(diǎn)醒,還默默的刷了考研軟件的題。還特別嘚瑟的磨蹭,最后想起聽診器沒找出來,翻箱倒柜的折騰,...
    菁小清閱讀 473評論 0 3
  • 漫步人生路,不忘初心。 十一月,新的起點(diǎn) 您好,我是你的老朋友素寫。只要我繼續(xù)前進(jìn),就會(huì)有邂逅,就能與他人的人生交...
    素寫記事簿閱讀 428評論 0 0