CSS居中:完全指南(譯)

2021-03-02 編程寶庫

CSS的居中是眾多CSS難點的代表。為啥用CSS居中這麼難呢?但是我認為這個問題其實並沒有那麼難啦,就是有很多種不同的方式可以達到居中的目的,這取決於不同的情景,很難說用哪一種方式去實現居中。
所以就讓我們做一個決策樹,希望能使這個問題簡單一點吧~

水平居中行內或者具有行內元素性質的元素(比如文字或者連結)?

讓一個父元素為塊級元素的行內元素水平居中,可以:
CSS:

1

2

3

.center-children {

text-align: center;

}

單個塊級元素?

你可以設置塊級元素的 margin-left 和 margin-right 為 auto 來使它水平居中(這個塊級元素是被設置了一個 width 屬性了,否則它會佔滿寬度,這時候已經不需要居中了),有一種速記的寫法:
CSS:

1

2

3

.center-me {

margin: 0 auto;

}

多個塊級元素?

如果有兩個或者更多的塊級元素需要在被一行裡水平居中,那麼你最好設置他們不同的display 屬性來達到效果了。這裡有兩個例子:一個是設置為 inline-block, 一個是設置為 flexbox 。
HTML:


<main class="inline-block-center">

<div>

I'm an element that is block-like with my siblings and we're centered in a row.

</div>

<div>

I'm an element that is block-like with my siblings and we're centered in a row. I have more content in me than my siblings do.

</div>

<div>

I'm an element that is block-like with my siblings and we're centered in a row.

</div>

</main>

<main class="flex-center">

<div>

I'm an element that is block-like with my siblings and we're centered in a row.

</div>

<div>

I'm an element that is block-like with my siblings and we're centered in a row. I have more content in me than my siblings do.

</div>

<div>

I'm an element that is block-like with my siblings and we're centered in a row.

</div>

</main>

CSS:

1

2

3

4

5

6

7

8

9

10

11

.inline-block-center {

text-align: center;

}

.inline-block-center div {

display: inline-block;

text-align: left;

}

.flex-center {

display: flex;

justify-content: center;

}

除非你是想讓多個塊級元素堆積在彼此的頂部(一列堆積啦),那麼 margin: auto 還是依然適用的:
CSS:

1

2

3

4

5

6

7

main div {

background: black;

margin: 0 auto;

color: white;

padding: 15px;

margin: 5px auto;

}

垂直居中

在CSS裡,垂直居中是有那麼一點點麻煩了。

行內或者具有行內元素性質的元素(比如文字或者連結)?單行?

有時候行內元素或者文字顯示為垂直居中,僅僅是因為它們的上下內邊距相等:
CSS:

1

2

3

4

.link {

padding-top: 30px;

padding-bottom: 30px;

}

如果 padding 出於某些原因不能用,並且你要使一些不換行的文字居中,這裡有一個技巧,就是設置文字的 line-height 和 height 的值相等。
CSS:

1

2

3

4

5

.center-text-trick {

height: 100px;

line-height: 100px;

white-space: nowrap;

}

多行?

上邊距和下邊距相等也能讓多行文字達到垂直居中的效果,但是如果這種方法不奏效的話,可能需要設置文字所在的元素為一個 table cell,不管它直接是 table 還是你用CSS使這個元素表現的像一個 table cell,vertical-align 屬性可以處理這種情況,它與我們通常所做的在行上處理元素對齊的方式不同:
CSS:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

table {

background: white;

width: 240px;

border-collapse: separate;

margin: 20px;

height: 250px;

}

table td {

background: black;

color: white;

padding: 20px;

border: 10px solid white;

}

.center-table {

display: table;

height: 250px;

background: white;

width: 240px;

margin: 20px;

}

.center-table p {

display: table-cell;

margin: 0;

background: black;

color: white;

padding: 20px;

border: 10px solid white;

vertical-align: middle;

}

.flex-center-vertically {

display: flex;

justify-content: center;

flex-direction: column;

height: 400px;

}

如果沒法用類table方式,可能你需要用 flexbox ?單個的 flex 子元素可以非常簡單的被一個 flex 父元素垂直居中:
CSS:

1

2

3

4

5

6

.flex-center-vertically {

display: flex;

justify-content: center;

flex-direction: column;

height: 400px;

}

請記住這個方法僅僅適用於父容器具有一個固定的額高度(px,%,等等),這也是為什麼容器有一個高度。

如果上面的方法都不能用,你可以試試 」虛元素「 技術:其中一個完整高度的偽元素放置在容器內,並與文本垂直對齊。
CSS:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

}

塊級元素?知道元素的高度?

不知道元素的高度是比較常見的,有很多原因:如果寬度改變,文本回流會改變高度;文字樣式改變會改變高度;文字數量改變會改變高度;一個固定比例的元素,比如圖片,當重置尺寸的時候也會改變高度,等等。

但如果你知道高度,你可以這樣垂直居中元素:
CSS:

1

2

3

4

5

6

7

8

9

.parent {

position: relative;

}

.child {

position: absolute;

top: 50%;

height: 100px;

margin-top: -50px;

}

元素高度未知?

可以通過 transform 來達到目的:
CSS:

1

2

3

4

5

6

7

8

9

.parent {

position: relative;

}

.child {

position: absolute;

top: 50%;

transform: translateY(-50%);

}

能用 flexbox 嗎?

毫無疑問,用 flexbox 簡單太多了:
CSS:

1

2

3

4

5

.parent {

display: flex;

flex-direction: column;

justify-content: center;

}

垂直水平居中

你可以通過不同的方式結合上面的技術來得到一個完美的居中水平垂直居中元素。但是我發現,這些方法通常都屬於以下三種陣營:

元素有固定的寬和高?

用負的 margin 值使其等於寬度和高度的一半,當你設置了它的絕對位置為 50% 之後,就會得到一個很棒的跨瀏覽器支持的居中:
CSS;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

.parent {

position: relative;

}

.child {

width: 300px;

height: 100px;

padding: 20px;

position: absolute;

top: 50%;

left: 50%;

margin: -70px 0 0 -170px;

}

元素的寬和高未知?

如果你不知道元素的高度和寬度,你可以用 transform 屬性,用 translate 設置 -50%(它以元素當前的寬和高為基礎)來居中:
CSS:

1

2

3

4

5

6

7

8

9

.parent {

position: relative;

}

.child {

position: absolute;

top: 50%;

left: 50%;

transform: translate(-50%, -50%);

}

能用 flexbox 嗎?

為了讓元素在 flexbox 兩個方向都居中,你需要兩個居中屬性:
CSS:

1

2

3

4

5

.parent {

display: flex;

justify-content: center;

align-items: center;

}

結論

你完全可以用CSS來居中元素,

長按掃描二維碼加入本群學習|交流

相關焦點

  • CSS布局奇技淫巧:各種居中
    居中是我們使用css來布局時常遇到的情況。使用css來進行居中時,有時一個屬性就能搞定,有時則需要一定的技巧才能兼容到所有瀏覽器,本文就居中的一些常用方法做個簡單的介紹。 4、使用表格 如果你使用的是表格的話,那完全不用為各種居中問題而煩惱了,只要用到 td(也可能會用到 th)元素的 align=」center」 以及 valign=」middle」 這兩個屬性就可以完美的處理它裡面內容的水平和垂直居中問題了,而且表格默認的就會對它裡面的內容進行垂直居中。
  • 對CSS居中的一點總結
    原文參考:https://css-tricks.com/centering-css-complete-guide/居中是什麼居中故名思意就是將物體放置在其容器的中間,在css中居中就是指元素、文本、圖片等相對其容器或父元素或瀏覽器窗口能夠居中顯示。而根據顯示方式的不同,又分為水平居中,垂直居中,水平垂直居中。
  • CSS 垂直水平完全居中手冊
    (點擊上方公眾號,可快速關注)英文: css-tricks,翻譯:OurJShttp://ourjs.com/detail
  • CSS實現水平垂直居中的10種方式
    ,本文將逐一介紹一下,我將本文整理成了一個github倉庫,歡迎大家star僅居中元素定寬高適用absolute + 負marginabsolute + margin autoabsolute + calc居中元素不定寬高absolute + transformlineheightwriting-mode
  • 常見的CSS文字居中顯示
    和vertical-align html<div> <span>測試文字</span></div>css200px; overflow: hidden; background: #ccc; text-align: center;}.box span{ vertical-align: middle; line-height: 200px;}2、利用display:table-cell實現水平垂直居中顯示
  • css 垂直居中的幾種實現方式
    前言設計是帶有主觀色彩的,同樣網頁設計中的 css 一樣讓人摸不頭腦。網上列舉的實現方式一大把,或許在這裡你都看到過,但既然來到這裡我希望這篇能讓你看有所收穫,畢竟這也是前端面試的基礎。但利用它的特性也可以控制垂直居中。值得注意:內聯元素無法設置固定高度 height ,如果設置了 line-height 即為該元素所屬行的高度,但其中的文本是垂直居中的。
  • css 水平居中的幾種實現方式
    前言設計是帶有主觀色彩的,同樣網頁設計中的 css 一樣讓人摸不頭腦。網上列舉的實現方式一大把,或許在這裡你都看到過,但既然來到這裡我希望這篇能讓你看有所收穫,畢竟這也是前端面試的基礎。只需在父級標籤上設置即可,雖然內部的子元素不管是塊級元素 or 非塊級元素都可以使用,但需注意塊級元素會佔用整行的寬度,文本是在這個寬度中作水平居中。
  • CSS實現水平垂直居中的1010種方式(史上最全)
    僅居中元素定寬高適用 absolute + 負margin absolute + margin auto absolute + calc居中元素不定寬高 absolute + transform lineheight
  • 你知道CSS實現水平垂直居中的第10種方式嗎?
    /* 公共代碼 */.wp {    border: 1px solid red;    width: 300px;    height: 300px;}.box {    background: green;    }.box.size{    width: 100px;    height: 100px;}/* 公共代碼 */絕對定位的百分比是相對於父元素的寬高
  • css常見問題:塊級元素和行內元素在水平和垂直方向怎樣居中呢?
    相信大家在寫css樣式的時候會經常遇到這樣一個問題,那就是塊級元素和行內元素在水平和垂直方向怎麼居中呢?又怎麼即在水平方向居中,又在垂直方向居中呢?利用margin:0 auto進行水平方向居中css部分代碼示例:
  • CSS實例:水平居中和垂直居中的多種解決方案
    在定義網頁的CSS樣式的時候,我們或許並不怎麼用到垂直居中。在站長書庫(book.chinaz.com)中,大量的文章介紹了這些知識。在和別人合作的時候,你的代碼的自適應性就需要做到最大程度的好。
  • 公司的一個面試題:如何用CSS讓一個容器水平垂直居中?
    DOCTYPE html>   <html>      <head>          <meta charset="UTF-8">          <title>demo</title>      </head>      <body>          <style type="text/css
  • DIV+CSS教程_DIV+CSS布局_DIV+CSS實例教程手冊
    風格5. css優先權6.Css盒模型組成第2天:列布局1,固定寬度2,一列固定寬度居中3,一列自適應寬度>4,一列自適應寬度居中5,兩對多的布局第3天:兩列和三列布局1,兩列自適應寬度2,兩列固定寬度
  • CSS的23個垂直居中技巧,你都學會了嗎?
    在一個絕對定位居中的方式,此方式應該算是最方便的了,因為此居中的定位元素不需要固定的寬高,我們利用絕對定位時的top 與right設置元素的上方跟左方各為50%,再利用translate(-50%,-50%)位移居中元素自身寬與高的50%就能達成居中的目的了。
  • 這些資源讓你成為CSS專家 (二)​
    http://askthecssguy.com/articles/showing-hyperlink-cues-with-css/52、10個你可能不知道的CSS訣竅 — 涵蓋了CSS字體、圖片替換、垂直居中等技巧。
  • CSS垂直居中、水平居中
    讓一個div或者一段文字亦或者一張照片居中顯示的問題,面試的過程中也經常被問到。
  • 23種CSS的垂直居中技巧,你都學會了嗎?
    ,而其困難度也始終沒有讓人輕鬆過,據說部分公司甚至將CSS的垂直居中技巧當成面試題,其重要性可見一斑,經過了Amos通靈了一下之後把垂直居中的寫法擴展到了23種,今天就帶著大家輕鬆的了解一下CSS的垂直居中的方式。
  • 用CSS如何實現單行圖片與文字垂直居中
    首頁 > 教程 > 關鍵詞 > CSS最新資訊 > 正文 用CSS如何實現單行圖片與文字垂直居中
  • CSS垂直居中技巧,我只會23個,你會幾個?
    作者 | @Amos原文| http://csscoke.com/2018/08/21/css-vertical-align
  • HTML技巧篇:實現元素水平與垂直居中的幾種方式
    本篇文章主要給大家介紹一下如何使用html+css實現元素的水平與垂直居中效果,這也是我們網頁在編碼製作中會經常用到的問題。1)單行文本的居中主要實現css代碼:水平居中:text-align:center;垂直居中:line-height:XXpx; /*line-height與元素的height的值一致*/我們先來看這樣一個例子,加入我們這裡有一個