CSS元素垂直水平居中实现及其原理

CSS实现元素水平垂直居中的方式有多种,在这里分析一下这些实现方式的原理,做一个简单的总结。

1.利用position:absolute完成居中布局。

原理

在css中,当元素设置了position:absolute,元素在视图中的水平定位满足如下约束:

left + margin-left + border-left + padding-left + content-width + padding-right + border-right + margin-right + right = 包含块元素的宽度(content-width)

这个叫做元素在水平方向定位的过渡约束。

  • 如果上面9个值中没有auto,则自动调整right的值以使等式成立。
  • 如果有auto,则自动调整auto的值以使等式成立。

其中,可以设置auto的值有5个:

left margin-left content-width margin-right right

同样的,在垂直方向上,元素的定位也满足过渡约束:

top + margin-top + border-top + padding-top + content-height + padding-bottom + border-bottom + margin-bottom + bottom = 包含块元素的高度(content-height)

注意:leftrighttopbottom这四个值默认都是auto,如果不对这四个值进行设置,那么浏览器将会优先调整这个四个属性的值来满足过渡约束。

因此,根据这两个过渡约束条件,如果我们要设置元素水平、垂直方向都居中,可以:

  • leftrighttopbottom设置为0;
  • margin四个方向设置为auto

实例代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>position设置元素居中</title>
    <style>
        .box1{
            border: 1px solid red;
            height: 400px;
            width: 800px;
            position: relative;
        }
        .box2{
            width: 200px;
            height: 200px;
            background-color: pink;
            
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            margin: auto;

        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html>

效果:

image-20210913223741199

2.利用position:relative结合transform:translate()完成居中布局

原理

当元素设置了相对定位,topbotttom如果设置百分比,则相对于父元素的height属性来确定距离;同理,如果leftright设置百分比,则根据父元素的width属性来确定距离。

因此,如果对子元素设置了:

position: relative;
top: 50%;
left: 50%;

那么元素将偏离重心,子元素所在盒子的左上角将指向父元素的中心:

image-20210913224551828

因此,可以借用transform: translate()来平移,使元素垂直水平居中。

实例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>position设置元素居中</title>
    <style>
        .box1{
            border: 1px solid red;
            height: 400px;
            width: 800px;
        }
        .box2{
            width: 200px;
            height: 200px;
            background-color: pink;
            
            position: relative;
            top: 50%;
            left: 50%;
            /* 调整位置 */
            transform: translate(-50%,-50%);

        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html>

效果

image-20210913224632056

3.利用flex布局

原理

根据flex布局的相关特点,很快能实现垂直居中布局。

实例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>position设置元素居中</title>
    <style>
        .box1{
            border: 1px solid red;
            height: 400px;
            width: 800px;

            display: flex;
            justify-content: center;
            align-items: center;
        }
        .box2{
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html>

效果

image-20210913224833800

4.利用table布局实现垂直水平居中

原理

将父元素设置成display: table-cell,子元素将被看成单元格td来处理。此时,可以设置vertical-align:middle来使元素垂直居中。同时,借用margin: 0 auto来设置垂直居中。

实例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>position设置元素居中</title>
    <style>
        .box1{
            border: 1px solid red;
            height: 400px;
            width: 800px;
            /* 实现垂直居中 */
            display: table-cell;
            vertical-align: middle;
        }
        .box2{
            width: 200px;
            height: 200px;
            background-color: pink;
            /* 实现水平居中 */
            margin: 0 auto;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html>

效果

image-20210913225605611

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值