CSS居中完全指南

itub3299 8年前發布 | 11K 次閱讀 CSS 前端技術 flexbox

來自: https://segmentfault.com/a/1190000004517401

原載于 CSS-Trick ,本文著重提取文中的方法,不完全翻譯。如有需要,直接原文查看。

人們經常抱怨在CSS中居中元素的問題,其實這個問題其實并不復雜,只是因為方法眾多,需要根據情況從眾多方法中選取一個出來。接下來,我們做一個‘決定樹’來幫我們把問題變的簡單一點。首先你需要居中:

  • 水平

    • 需要居中 inline 或者 inline-* 元素(如文字或者鏈接)?

    • 需要居中 block 類的元素?

    • 需要居中多個 block 元素?

  • 垂直

    • 需要居中 inline 或者 inline-* 元素(如文字或者鏈接)?

    • 需要居中 block 類的元素?

  • 既水平又垂直

    • 固定寬高

    • 不固定寬高

    • 使用 flexbox

水平居中

水平居中 inline 或者 inline-* 元素

你可以輕松的在一個 block 元素中水平居中一個 inline 元素,以下代碼對 inline , inline-block , inline-table 和 inline-flex 等有效

.parent {
  text-align: center;
}

水平居中 block 類的元素

在 block 元素被設定固定寬度的情況下,可以使用設置元素 margin-left 和 margin-right 的值為 auto 的方法實現水平居中。

.child {
  width: 400px;
  margin: 0 auto;
}

水平居中多個 block 類的元素

通過 inline-block 實現

.parent {
  text-align: center;
}
.child {
  display: inline-block;
  text-align: left;
}

通過 flexbox 實現

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

垂直居中

垂直居中 inline 或者 inline-* 元素

單行

inline/text 元素可以簡單的用設置相同的上下 padding 值達到垂直居中的目的。

.center {
  pading-top: 30px;
  padding-bottom: 30px;
}

如果因為某種原因不能使用 padding 的方法,你還可以設置 line-height 等于 height 來達到目的。

.center {
  height: 100px;
  line-height: 100px;
  white-space: nowrap;
}

多行

相同的上下 padding 也可以適用于此種情況,如果不能生效,你可以嘗試將該元素的父元素的 dispaly 設置為 table ,同時該元素的 dispaly 設置為 table-cell ,然后設置 vertical-align 。

.parent {
  display: table;
  width: 200px;
  height: 400px;
}
.child {
  display: table-cell;
  vertical-align: middle;
}

如果上述方法不能使用,你可以嘗試使用 flexbox ,一個單獨的 flexbox 子元素可以輕易的在其父元素中居中。謹記,這種方法需要父元素有固定的高度。

.parent {
  display: flex;
  justify-content: center;
  flex-direction: column;
  height: 400px;
}

如果上述兩種方式均不能使用,你可以使用“幽靈元素”技術,這種方法采用偽元素 ::before 撐開高度 ,文字垂直居中。

.parent {
  position: relative;
}
.parent::before {
  content: " ";
  display: inline-block;
  height: 100%;
  width: 1%;
  vertical-align: middle;
}
.child {
  display: inline-block;
  vertical-align: middle;
}

垂直居中 block 類的元素

已知元素高度

.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; */
}

未知元素高度

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

使用 flexbox

.parent {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

既水平又垂直

固定寬高

.parent {
  position: relative;
}

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

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

margin: -70px 0 0 -170px; }</pre>

不固定寬高

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

使用 flexbox

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
</div>

 本文由用戶 itub3299 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!