每天一点点--css 垂直居中

1,070 阅读6分钟
原文链接: github.com

PC端有兼容性要求,宽高固定,推荐absolute + 负margin
PC端有兼容要求,宽高不固定,推荐css-table
PC端无兼容性要求,推荐flex
移动端推荐使用flex

1、absolute+calc 定宽高

这种方式也要求居中元素的宽高必须固定
感谢css3带来了计算属性,既然top的百分比是基于元素的左上角,那么在减去宽度的一半就好了
这种方法兼容性依赖calc的兼容性,缺点是需要知道子元素的宽高
calc(50% - 50px);减号两边要有空格

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .wp {
            border: 1px solid red;
            width: 300px;
            height: 300px;
            position: relative;
        }
        .box {
            width: 100px;
            height: 100px;
            background: green;
            position: absolute;
            top: calc(50% - 50px);
            left: calc(50% - 50px);
        }
    </style>
</head>
<body>
    <div class="wp">
        <div class="box"></div>
    </div>
</body>
</html>

2、absolute + margin auto 定宽高

这种方式也要求居中元素的宽高必须固定
这种方式通过设置各个方向的距离都是0,此时再讲margin设为auto,就可以在各个方向上居中了
这种方法兼容性也很好,缺点是需要知道子元素的宽高

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .wp {
            border: 1px solid red;
            width: 300px;
            height: 300px;
            position: relative;
        }
        .box {
            width: 100px;
            height: 100px;
            background: green;
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            margin: auto;
        }
    </style>
</head>
<body>
    <div class="wp">
        <div class="box">123123</div>
    </div>
</body>
</html>

3、absolute + transform 未知宽高

还是绝对定位,但这个方法不需要子元素固定宽高
修复绝对定位的问题,还可以使用css3新增的transform,transform的translate属性也可以设置百分比,其是相对于自身的宽和高,所以可以讲translate设置为-50%,就可以做到居中了
这种方法兼容性依赖translate2d的兼容性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .wp {
            border: 1px solid red;
            width: 300px;
            height: 300px;
            position: relative;
        }
        .box {
            background: green;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
        }
    </style>
</head>
<body>
    <div class="wp">
        <div>aaaaaaaa</div>
    </div>
</body>
</html>

4、absolute + 负margin 定宽高

绝对定位的百分比是相对于父元素的宽高,通过这个特性可以让子元素的居中显示,但绝对定位是基于子元素的左上角,期望的效果是子元素的中心居中显示
为了修正这个问题,可以借助外边距的负值,负的外边距可以让元素向相反方向定位,通过指定子元素的外边距为子元素宽度一半的负值,就可以让子元素居中了,
这是我比较常用的方式,这种方式比较好理解,兼容性也很好,缺点是需要知道子元素的宽高

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .wp {
            border: 1px solid red;
            width: 300px;
            height: 300px;
            position: relative;
        }

        .box {
            width: 100px;
            height: 100px;
            background: green;
            position: absolute;
            top: 50%;
            left: 50%;
            margin-left: -50px;
            margin-top: -50px;
        }
    </style>
</head>
<body>
    <div class="wp">
        <div class="box">123123</div>
    </div>
</body>
</html>

5、flex 未知宽高

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        #box {
            height: 500px;
            width: 500px;
            border: 1px solid red;
            display: flex;
        }
        #box img {
            margin: auto;
        }
        #box1 {
            height: 500px;
            width: 500px;
            border: 1px solid red;
            display: flex;
            justify-content: center;
            align-items: center;
        }
    </style>
</head>
<body>
    <div id="box">
        <img src="./img/147x147.png" alt="">
    </div>
    <div id="box1">
        <img src="./img/147x147.png" alt="">
    </div>
</body>
</html>

6、grid 未知宽高

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .wp {
            display: grid;
            height:300px;
            width:300px;
            border:1px solid red;
        }
        .box {
            align-self: center;
            justify-self: center;
        }
    </style>
</head>
<body>
    <div class="wp">
        <div class="box">123123</div>
    </div>
</body>
</html>

7、line-height 未知宽高

利用行内元素居中属性也可以做到水平垂直居中
把box设置为行内元素,通过text-align就可以做到水平居中,但很多同学可能不知道通过通过vertical-align也可以在垂直方向做到居中
这种方法需要在子元素中将文字显示重置为想要的效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .wp {
            border: 1px solid red;
            width: 300px;
            height: 300px;
            line-height: 300px;
            text-align: center;
            font-size: 0px;
        }
        .box {
            font-size: 16px;
            display: inline-block;
            vertical-align: middle;
            line-height: initial;
            text-align: left;
            background-color: green;
        }
    </style>
</head>
<body>
    <div class="wp">
        <div class="box">123456789</div>
    </div>
</body>
</html>

8、table 未知宽高

1、首先我们先要创建一个div元素以及另外一个包含图片的div元素,然后我们开始设置它的样式。
2、给img父元素设置display属性为table
3、把包裹图片的那个div元素的display属性设置为table-cell
4、为了实现垂直居中,我们现在要做的就是给包裹图片的div元素设置vertical-align: middle;属性

注意:如果你也想实现水平居中,你可以给最外层的div元素添加text-align: center属性,注意不是id=”img”的div

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        #wrapper {
            display: table;
            height: 200px;
            width: 200px;
        }
        #cell {
            text-align: center;
            background-color: green;
            display: table-cell;
            vertical-align: middle;
        }

        #box {
            height: 500px;
            width: 500px;
            border: 1px solid red;
            display: table;
            text-align: center;
        }
        #boxImg {
            display: table-cell;
            vertical-align: middle;
        }

        .wp {
            display: table-cell;
            text-align: center;
            vertical-align: middle;
            height:300px;
            width:300px;
            border:1px solid red;
        }
        .box {
            display: inline-block;
        }
    </style>
</head>
<body>
    <div id="wrapper">
        <div id="cell">
            <div class="content">Content goes here</div>
        </div>
    </div>
    <div id="box">
        <div id="boxImg">
            <img src="./img/147x147.png" alt="">
        </div>
    </div>
    <div class="wp">
        <div class="box">123123</div>
    </div>
</body>
</html>