Skip to content

元素垂直水平居中

说明

让一个子元素在父元素内,垂直水平居中。
这是一道常见的 css 笔试题, 这里汇总一些常用的解决思路。

1.利用绝对定位

子元素相对于父元素绝对定位,设置 top、left 为 50%,然后设置 margin-leftmargin-top 为自身宽高的负一半。缺点是必须知道自身的宽高,有一定的局限性。

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>定位居中</title>
    <style>
      * {
        box-sizing: border-box;
      }
      .parent {
        position: relative;
        height: 200px;
        border: 2px dashed #f69c55;
      }
      .parent .child {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 200px;
        height: 100px;
        margin-top: -50px;
        margin-left: -100px;
        padding: 20px;
        color: #fff;
        background: #000;
      }
    </style>
  </head>
  <body>
    <div class="parent">
      <div class="child">你毕业才两年,三年工作经验怎么来的?程序员回答:996</div>
    </div>
  </body>
</html>

2.利用 flex 布局

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>flex居中</title>
    <style>
      .parent {
        display: flex;
        justify-content: center;
        align-items: center;
        height: 140px;
        border: 2px dashed #f69c55;
      }
      .child {
        padding: 20px;
        color: #fff;
        background: #000;
      }
    </style>
  </head>
  <body>
    <div class="parent">
      <div class="child">解决问题很容易,找到问题却很难。</div>
    </div>
  </body>
</html>

3.利用 css3 的 transform 属性

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>transform居中</title>
    <style>
      .parent {
        position: relative;
        min-width: 300px;
        height: 140px;
        border: 2px dashed #f69c55;
      }
      .child {
        position: absolute;
        top: 50%;
        left: 50%;
        padding: 20px;
        color: #fff;
        background: #000;
        transform: translate(-50%, -50%);
      }
    </style>
  </head>
  <body>
    <div class="parent">
      <div class="child">世界上有10种人,一种是懂二进制的,另一种是不懂二进制的</div>
    </div>
  </body>
</html>

4.利用 table 布局

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>table居中</title>
    <style>
      .outer {
        display: table;
        width: 100%;
        height: 140px;
        border: 2px dashed pink;
      }
      .middle {
        display: table-cell;
        vertical-align: middle;
      }
      .inner {
        max-width: 300px;
        padding: 20px;
        margin: 0 auto;
        color: #fff;
        background: #000;
      }
    </style>
  </head>
  <body>
    <div class="outer">
      <div class="middle">
        <div class="inner">简单不先于复杂,而是在复杂之后。</div>
      </div>
    </div>
  </body>
</html>

5.利用 grid 布局

截止 2021 年,css 最为强大的布局属性。但考虑到浏览器兼容性,建议谨慎使用。

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>grid居中</title>
    <style>
      .parent {
        display: grid;
        height: 140px;
        border: 2px dashed #f69c55;
      }
      .child {
        padding: 20px;
        margin: auto;
        color: #fff;
        background: #000;
      }
    </style>
  </head>
  <body>
    <div class="parent">
      <div class="child">好的程序员能写出别人能读懂的代码。</div>
    </div>
  </body>
</html>