2022面试系列:CSS 水平垂直居中方式汇总

目录
文章目录隐藏
  1. 居中元素宽高已知
  2. 居中元素宽高未知
  3. 场景推荐

无论是实际开发中,还是求职面试中,css 垂直居中往往都是一个绕不开的话题,其中有许多面试者在遭受多次打击之后,却没有一个很好的反击点,刚好结合自己的经历与痛处,来给大家一个锤爆面试官大佬们的机会。

垂直居中主要分为了两种类型:居中元素宽高已知 和 居中元素宽高未知,那么我们就结合这两种类型来一一举例。

居中元素宽高已知

1、absolute + margin auto

注意:父元素与当前元素的宽高已知。

.parent{
  position: relative;
  width: 500px;
  height: 500px;
  border: 1px solid blue;
}
 
.child{
  background: green;
  width: 200px; 
  height: 200px;
  /* 核心代码 */
  position:absolute;
  top: 0; 
  bottom: 0; 
  left: 0; 
  right: 0;
  margin: auto;
}

2、absolute + 负 margin

注意:负 margin 是基于自身的高度和宽度来进行位移的(设置为自身的 -1/2)。

.parent{
  position:relative;
  width: 500px;
  height: 500px;
  border: 1px solid blue;
}
 
.child{
  background: green;
  width: 200px; 
  height: 200px;
  /* 核心代码 */
  position:absolute;
  top: 50%; 
  left: 50%;
  margin-top: -100px;
  margin-left: -100px;
}

3、absolute + calc

注意:使用 CSS3 的一个计算函数calc来进行计算(相当于负 margin 的简化版)。

.parent{
  position:relative;
  width: 500px;
  height: 500px;
  border: 1px solid blue;
}
 
.child{
  background: green;
  width: 200px; 
  height: 200px;
  /* 核心代码 */
  position:absolute;
  top: calc(50% - 100px);
  left: calc(50% - 100px);
}

居中元素宽高未知

1、absolute + transform

注意:transform 的 translate 属性值如果是一个百分比,那么这个百分比是基于自身的宽高进行计算。

.parent{
  position: relative;
  width: 500px;
  height: 500px;
  border: 1px solid blue;
}
 
.child{
  background: green;
  /* 核心代码 */
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

2、line-height + vertical-align

把当前元素设置为行内元素,然后通过设置父元素的text-align: center来实现水平居中;同时通过设置当前元素的vertical-align: middle来实现垂直居中;最后设置当前元素的line-height: initial来继承父元素的line-height

.parent{
  width: 500px;
  border: 1px solid blue;
  /* 核心代码 */
  line-height: 500px;
  text-align: center;
}
 
.child{
  background: green;
  /* 核心代码 */
  display: inline-block;
  vertical-align: middle;
  line-height: initial;
}

3、table 表格元素(不推荐)

通过经典的 table 来进行布局(不推荐)。

<table>
  <tbody>
    <tr>
      <td class="parent">
        <div class="child"></div>
      </td>
    </tr>
  </tbody>
</table>
 
<style>
  .parent{
    width: 500px;
    height: 500px;
    border: 1px solid blue;
    /* 核心代码 */
    text-align: center;
  }
  .child{
    background: green;
    /* 核心代码 */
    display: inline-block;
  }
</style>

4、css-table(display:table-cell)

不写 table 元素,也可以使用 table 的特性,需使用 css-table(display:table-cell)

.parent{
  width: 500px;
  height: 500px;
  border: 1px solid blue;
  /* 核心代码 */
  display: table-cell;
  text-align: center;
  vertical-align: middle;
}
 
.child{
  background: green;
  /* 核心代码 */
  display: inline-block;
}

5、flex 布局(推荐)

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

justify-content:设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式;

align-items:设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式。

更多细节请参考本人对 flex 布局的详细介绍:css3 Flex 布局教程详解

6、flex + margin auto

.parent{
  width: 500px
  height: 500px;
  border: 1px solid blue;
  /* 核心代码 */
  display: flex;
}
 
.child{
  background: green;
  /* 核心代码 */
  margin: auto;
}

7、grid 网格布局(一)

注意:由于 grid 布局实在是太超前,导致了兼容性不是那么理想。

更多细节请参考本人对 grid 布局的详细介绍:CSS Grid 网格布局实例教程

.parent{
  width: 500px;
  height: 500px;
  border: 1px solid blue;
  /* 核心代码 */
  display: grid;
  justify-content: center;
  align-items: center;
}
 
.child{
  background: green;
}

仔细观察,以上样式与 flex 相似,且主要在父元素设置。

8、grid 网格布局(二)

跟第 7 点不同,以下主要在子元素设置。

.parent{
  width: 500px;
  height: 500px;
  border: 1px solid blue;
  /* 核心代码 */
  display: grid;
}
 
.child{
  background: green;
  /* 核心代码 */
  justify-self: center;
  align-self: center;
}

场景推荐

  • PC 端有兼容性要求并且宽高固定,推荐使用 absolute + margin: auto 方法实现;
  • PC 端有兼容性要求并且宽高不固定,推荐使用 css-table(display:table-cell)方式实现;
  • PC 端无兼容性要求 ,推荐使用 flex ,如果不考虑 IE 的话,grid 也是个不错的选择;
  • 移动端 ,推荐使用 flex ,grid 也可作为备选。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
码云笔记 » 2022面试系列:CSS 水平垂直居中方式汇总

发表回复