【CSS】一文掌握元素水平垂直居中

目录

一、前言

二、实现方法

1、定位+margin:auto

2、利用定位+margin:负值

3、利用定位+transform

[4、通过伪元素 :before 实现垂直居中](#4、通过伪元素 :before 实现垂直居中)

5、flex弹性布局(最常用、最简单)

6、table布局

7、grid网格布局

8、小结

三、总结

1、内联元素居中布局

2、块级元素居中布局


一、前言

水平垂直居中是一个非常基础但又是非常重要的应用场景,实现居中的方法存在很多,可以将这些方法分成两个大类:

  • 居中元素(子元素)的宽高已知
  • 居中元素宽高未知

二、实现方法

实现元素水平垂直居中有以下七种方法:

  1. 利用定位+margin:auto------子绝父相,设置top、left、right、bottom为0,在设置margin:auto
  2. 利用定位+margin:负值------子绝父相,设置left和top为50%,此时位置会偏右自身元素的宽高,再设margin-left和margin-top为自身元素宽高的负一半,实现水平垂直居中。
  3. 利用定位+transform------子绝父相,设置left和top为50%,此时位置会偏右自身元素的宽高,再设transform: translateX(-50px) translateY(-50px);
  4. 通过伪元素 :before 实现垂直居中;
  5. flex弹性布局------在父元素设置display: flex表示该容器内部的元素将按照flex进行布局,再设置align-items: center表示这些元素将相对于本容器水平居中,justify-content: center实现垂直居中。
  6. 设置父元素为display:table-cell,子元素设置 display: inline-block。利用verticaltext-align可以让所有的行内块级元素水平垂直居中。
  7. grid弹性布局------在父元素设置display: drid表示该容器内部的元素将按照flex进行布局,再设置align-items: center表示这些元素将相对于本容器水平居中,justify-content: center实现垂直居中。

1、定位+margin:auto

html 复制代码
<div class="father">
    <div class="son"></div>
</div>
<style>
    .father{
        width:500px;
        height:300px;
        border:1px solid #0a3b98;
        position: relative;   //父级设置为相对定位
    }
    .son{
        width:100px;
        height:40px;
        background: #f0a238;
        position: absolute;   //设置为子级绝对定位
        top:0;
        left:0;
        right:0;
        bottom:0;
        margin:auto;
    }
</style>

父级设置为相对定位,子级绝对定位 ,并且四个定位属性的值都设置了0,那么这时候如果子级没有设置宽高,则会被拉开到和父级一样宽高。这里子元素设置了宽高,所以宽高会按照我们的设置来显示,但是实际上子级的虚拟占位已经撑满了整个父级,这时候再给它一个margin:auto它就可以上下左右都居中了。

2、利用定位+margin:负值

绝大多数情况下,设置父元素为相对定位, 子元素移动自身50%实现水平垂直居中

html 复制代码
<div class="father">
    <div class="son"></div>
</div>
<style>
.father{
  width: 500px;
  height: 300px;
  background-color: pink;
  position: relative;
}
.son{
  width: 100px;
  height: 100px;
  background-color: skyblue;
  position: absolute;
  left: 50%;
  top: 50%;
  margin-left: -50px;
  margin-top: -50px;
}
</style>

这种方案不要求父元素的高度,也就是即使父元素的高度变化了,仍然可以保持在父元素的垂直居中位置,水平方向上是一样的操作。但是该方案需要知道子元素自身的宽高,但是我们可以通过下面transform属性进行移动。

3、利用定位+transform

html 复制代码
<div class="father">
    <div class="son"></div>
</div>

<style>
.father{
  width: 500px;
  height: 300px;
  background-color: pink;
  position: relative;
}
.son{
  width: 100px;
  height: 100px;
  background-color: skyblue;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translateX(-50px) translateY(-50px);
}
</style>

这种方法其实和最上面被否定掉的margin负值用法一样,可以说是margin负值的替代方案,并不需要知道自身元素的宽高。

4、通过伪元素 :before 实现垂直居中

html 复制代码
<div class="father">
    <div class="son"></div>
</div>

<style>
.father{
  width: 500px;
  height: 300px;
  background-color: pink;
  text-align: center;
}
.father::before{
  content : '';
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}
.son{
  width: 100px;
  height: 100px;
  background-color: skyblue;
  vertical-align: middle;
  margin: 0 auto;
  display: inline-block;
}
</style>

5、flex弹性布局(最常用、最简单)

html 复制代码
<div class="father">
    <div class="son"></div>
</div>

<style>
.father{
  width: 500px;
  height: 300px;
  background-color: pink;
  display: flex;
  justify-content: center;
  align-items: center;
}
.son{
  width: 100px;
  height: 100px;
  background-color: skyblue;
}
</style>

css3中了flex布局,可以非常简单实现垂直水平居中

这里可以简单看看flex布局的关键属性作用:

  • display: flex时,表示该容器内部的元素将按照flex进行布局

  • align-items: center表示这些元素将相对于本容器水平居中

  • justify-content: center也是同样的道理垂直居中

6、table布局

设置父元素为display:table-cell,子元素设置 display: inline-block。利用verticaltext-align可以让所有的行内块级元素水平垂直居中。

html 复制代码
<div class="father">
    <div class="son"></div>
</div>

<style>
    .father {
        display: table-cell;
        width: 200px;
        height: 200px;
        background: skyblue;
        vertical-align: middle;
        text-align: center;
    }
    .son {
        display: inline-block;
        width: 100px;
        height: 100px;
        background: red;
    }
</style>

7、grid网格布局

html 复制代码
​
<div class="father">
    <div class="son"></div>
</div>

<style>
.father{
  width: 500px;
  height: 300px;
  background-color: pink;
  display: grid;
  justify-content: center;
  align-items: center;
}
.son{
  width: 100px;
  height: 100px;
  background-color: skyblue;
}
</style>

​

8、小结

上述方法中,不知道元素宽高大小仍能实现水平垂直居中的方法有:

  • 利用定位+margin:auto
  • 利用定位+transform
  • 利用伪元素
  • flex布局
  • grid布局

三、总结

根据元素标签的性质,可以分为:

  • 行内元素居中布局
  • 块级元素居中布局

1、内联元素居中布局

水平居中

  • 行内元素可设置:text-align: center
  • flex布局设置父元素:display: flex; justify-content: center

垂直居中

  • 单行文本父元素确认高度:height === line-height
  • 多行文本父元素确认高度:display: table-cell; vertical-align: middle

2、块级元素居中布局

水平居中

  • 定宽: margin: 0 auto
  • 绝对定位+left:50%+margin:负自身一半

垂直居中

  • position: absolute设置left、top、margin-left、margin-top(定高)
  • display: table-cell
  • transform: translate(x, y)
  • flex(不定高,不定宽)
  • grid(不定高,不定宽),兼容性相对比较差
相关推荐
网络点点滴10 分钟前
前端与后端的区别与联系
前端
EnCi Zheng35 分钟前
M5-markconv自定义CSS样式指南 [特殊字符]
前端·css·python
kyriewen39 分钟前
你的网页慢,用户不说直接走——前端性能监控教你“读心术”
前端·性能优化·监控
广州华水科技39 分钟前
北斗GNSS变形监测在大坝安全监测中的应用与优势分析
前端
前端老石人1 小时前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
CAE虚拟与现实1 小时前
五一假期闲来无事,来个前段、后端的说明吧
前端·后端·vtk·three.js·前后端
Sarvartha1 小时前
三目运算符
linux·服务器·前端
晓晨的博客1 小时前
ROS1录制的bag包转换为ROS2格式
前端·chrome
Wect1 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript
donecoding2 小时前
别再让 pnpm 跟着 nvm 跑了!独立安装终极指南
前端·node.js·前端工程化