CSS 实现水平垂直居中的总结

·  阅读 178

一. 水平垂直居中

1. 绝对定位 + 负margin

HTML

<div class="parent">
    <div class="child">一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字</div>
</div>
复制代码

CSS

.parent {
  height: 500px;
  border: 1px solid red;
  position: relative;
}
.child {
  width: 300px;
  height: 100px;
  border: 1px solid green;
  position: absolute;
  top: 50%;
  left: 50%;
  margin-left: -150px;  /* 宽度的-50% */
  margin-top: -50px;    /* 高度的-50% */
}
复制代码

缺点:需要固定居中元素的宽高。

2. 绝对定位 + margin: auto

HTML

<div class="parent">
    <div class="child">一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字</div>
</div>
复制代码

CSS

.parent {
  height: 500px;
  border: 1px solid red;
  position: relative;
}
.child {
  border: 1px solid green;
  width: 300px;
  height: 200px;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
}
复制代码

缺点:需要固定居中元素的宽高,否则其宽高会被设为100%

3. 绝对定位 + translate

HTML

<div class="parent">
    <div class="child">一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字</div>
</div>
复制代码

CSS

.parent {
  height: 500px;
  border: 1px solid red;
  position: relative;
}
.child {
  border: 1px solid green;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
复制代码

优点:不需要固定居中元素的宽高。

4. flex 布局

HTML

<div class="parent">
    <div class="child">一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字</div>
</div>
复制代码

CSS

.parent {
  height: 500px;
  border: 1px solid red;
  display: flex;
  justify-content: center;  /* 水平居中 */
  align-items: center;      /* 垂直居中 */
}
.child {
  border: 1px solid green;
  width: 300px;
}
复制代码

优点:不需要固定居中元素的宽高。

兼容性:目前移动端已经完全可以使用 Flex 布局,而 PC 端某些旧浏览器支持度不高。

5. 单行文本的水平垂直居中

HTML

<p class="content">
    单行文本单行文本单行文本
</p>
复制代码

CSS

.content {
  border: 3px solid red;
  line-height:300px;
  text-align:center;
}
复制代码

二. 水平居中

1. margin auto

HTML

<div class="parent">
    <div class="child">一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字</div>
</div>
复制代码

CSS

.parent {
  border: 3px solid red;
}
.child {
  border: 3px solid blue;
  width: 300px;
  margin: 0 auto;
}
复制代码

缺点:需要固定居中元素的宽。

2. text-align + inline-block

HTML

<div class="parent">
    <div class="child">一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字</div>
</div>
复制代码

CSS

.parent {
  border: 3px solid red;
  text-align: center;
}
.child {
  border: 3px solid blue;
  width: 300px;
  display: inline-block;
  text-align:left;  /* 重置文本位置 */
}
复制代码

缺点:为了居中元素,文本也跟着居中了,因此可能需要重置文本位置。

三. 垂直居中

1. table 自带功能

HTML

<table class="parent">
    <tr>
      <td class="child">
        一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字
      </td>
    </tr>
</table>
复制代码

CSS

.parent {
  border: 1px solid red;
  height: 600px;
}
.child {
  border: 1px solid green;
}
复制代码

2. div 伪装成 table

HTML

<div class="table">
    <div class="td">
      <div class="child">一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字</div>
    </div>
</div>
复制代码

CSS

div.table {
  display: table;
  border: 1px solid red;
  height: 500px;
}
div.tr {
  display: table-row;
  border: 1px solid green;
}
div.td {
  display: table-cell;
  vertical-align: middle;
  border: 1px solid blue;
}
.child {
  border: 3px solid black;
}
复制代码

3. 100% 高度的 after before 加上 inline-block

HTML

<div class="parent">
    <div class="child">一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字一段文字</div>
</div>
复制代码

CSS

.parent {
  border: 3px solid red;
  height: 500px;
  text-align: center;
}
.child {
  border: 3px solid black;
  display: inline-block;
  width: 300px;
  vertical-align: middle;
}
.parent::before {
  content: '';
  outline: 3px solid red;
  display: inline-block;
  height: 100%;
  vertical-align: middle;
}
.parent::after {
  content: '';
  outline: 3px solid red;
  display: inline-block;
  height: 100%;
  vertical-align: middle;
}
复制代码
分类:
前端
标签: