Centering in CSS: A Complete Guide


title: Centering in CSS
date: 2018-04-19 01:29:00
tags:

  • CSS
  • 譯文

本文翻譯自 CSS-Tricks 中的一篇文章—— Centering in CSS: A Complete Guide,CSS居中完全指南,其中有部分刪改。

??Centering things in CSS is the poster child of CSS complaining. Why does it have to be so hard? They jeer. I think the issue isn't that it's difficult to do, but in that there so many different ways of doing it, depending on the situation, it's hard to know which to reach for.
??居中是一種很常見的布局方式。有人抱怨CSS居中布局很難,其實(shí)不然,在我看來,說居中布局難,不是因?yàn)榫又姓娴挠卸嗝措y實(shí)現(xiàn),而是因?yàn)閷?shí)現(xiàn)居中的方法有太多太多,以至于新手總是糾結(jié)去用哪個(gè)。我們需要根據(jù)不同的場景,去選擇合適的方法。
??本文將CSS居中布局方法進(jìn)行歸類,以便于理解和簡化居中問題。

1.水平居中

1.1 行內(nèi)元素

行內(nèi)元素直接為其父元素設(shè)置文本居中即可。

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

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

1.2 塊級元素

塊級元素直接設(shè)置左右邊距為 auto 即可,前提是該塊級元素必需有 width ,而且必需處于標(biāo)準(zhǔn)文檔流中,浮動、絕對定位、固定定位了的元素就不能。

.center-me {
  margin: 0 auto;
}

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

1.3 多個(gè)塊級元素

  • 多個(gè)塊元素在一行內(nèi)居中
    • 方法一:父元素設(shè)置 text-align: center ,子元素設(shè)置 display: inline-block;
    • 方法二:使用 flex 布局,父元素設(shè)置 display: flex; justify-content: center;
      http://codepen.io/chriscoyier/pen/ebing
  • 多個(gè)塊元素在一列內(nèi)居中
    如果只是需要讓多個(gè)塊級元素整體水平居中,并且按默認(rèn)的方式縱向排列,那直接設(shè)置左右邊距為 auto 即可。
    http://codepen.io/chriscoyier/pen/haCGt

2. 垂直居中

2.1 行內(nèi)元素

2.2 塊級元素

  • 元素高度已知
.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; */
}

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

  • 元素高度未知(最常見的一種場景)
    • 方法一:先將元素相對于其原始位置向下移動父元素高度的一半距離,再將該元素相對其本身的高度向上移動一半,這樣就能實(shí)現(xiàn)垂直居中的效果了。
    .parent {
      position: relative;
    }
    .child {
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
    }
    
    http://codepen.io/chriscoyier/pen/lpema
    • 方法二:flexbox
    .parent {
      display: flex;
      flex-direction: column;
      justify-content: center;
    }
    
    http://codepen.io/chriscoyier/pen/FqDyi

3. 垂直和水平都居中

當(dāng)然,我們可以結(jié)合以上給出的方法來實(shí)現(xiàn)垂直和水平方向都居中的布局。這里我們再進(jìn)行一下分類總結(jié)。

3.1 寬高固定

將元素相對于其父元素的寬度/高度值向右并向下移動一半的距離,然后再通過設(shè)置負(fù)邊距值的方法,將元素相對于其自身的寬度/高度值向左并向上移動一半的距離,就可實(shí)現(xiàn)水平垂直均居中的效果了。并且這種方法的瀏覽器兼容性是很好的。

.parent {
  position: relative;
}

.child {
  width: 300px;
  height: 100px;
  padding: 20px;

  position: absolute;
  top: 50%;
  left: 50%;

  margin: -70px 0 0 -170px;
}

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

3.2 寬高不固定

如果元素的寬度或者高度未知,則在將元素相對于父元素的寬高往向右并向下移動一半距離后,再用 transform 屬性來將其向左并向上移動自身寬度及高度值一半的距離即可。

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

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

3.3 使用 flexbox

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

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

3.4 使用 grid

這只是一個(gè)小技巧,只適用于一個(gè)元素的情況。
<iframe src="http://codepen.io/chriscoyier/embed/NvwpyK" width="100%" height="400" frameborder="0"></ifream>

4. 結(jié)束語

CSS 還是很偉大的,能夠?qū)崿F(xiàn)的布局多種多樣,實(shí)現(xiàn)的方法也多種多樣,重要的是找到合適的方法!這就需要多寫多練多總結(jié)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,854評論 0 10
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 11,089評論 0 23
  • Day One A simple and elegant journal for iPhone 空間、朋友圈不適...
    一覽眾山小閱讀 214評論 0 1
  • 2016年最幸運(yùn)就是遇到易效能。從認(rèn)識葉老師到后來結(jié)識一群奮進(jìn)的伙伴,找到為之努力的目標(biāo),更改很多錯(cuò)誤的認(rèn)知...
    X苗淼閱讀 189評論 0 0
  • 養(yǎng)來養(yǎng)去,我把兒子養(yǎng)成了老爺。老爺?shù)呐深^,老爺?shù)拇?,老爺?shù)钠狻?先說老爺派頭。這小子自從進(jìn)了初中,個(gè)子見竄,年...
    楊愛民閱讀 494評論 2 2

友情鏈接更多精彩內(nèi)容