css 水平居中(8种方法)、垂直居中(8种方法)

34,213 阅读2分钟

总结:

  • flex
  • 绝对定位 同时适用于水平居中和垂直居中。

一、水平居中 ( 八种方法 )

1.1 行内元素 - 方法一

image.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
    .parent {
        text-align: center;
    }
</style>
</head>
<body>
	<div class='parent'>
		<span>123</span>
	</div>
</body>
</html>

1.2 块级元素

1.2.1 一般情况 - 方法二

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box {
            background: skyblue;
            width:200px;
            height:200px;
            margin: 0 auto;
        }
    </style>
</head>
<body>
    <div class='box'>123</div>
</body>
</html>

1.2.2 子元素含 float - 方法三(使用fit-content)

  • fit-content是CSS3中给width属性新加的一个属性值,它配合margin可以轻松实现水平居中, 目前只支持Chrome 和 Firefox浏览器.\
  • 无fit-content情况

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            margin: 0 auto;
            /*width: -moz-fit-content;*/
            /*width: -webkit-fit-content;*/
            /*width:fit-content;*/
        }
        .son{
            float: left;
            background: pink;
            width:50px;
            height:50px;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">

        </div>
    </div>
</body>
</html>
  • 有fit-content情况

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            margin: 0 auto;
            width: -moz-fit-content;
            width: -webkit-fit-content;
            width:fit-content;
        }
        .son{
            float: left;
            background: pink;
            width:50px;
            height:50px;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">

        </div>
    </div>
</body>
</html>

1.2.3 Flex 弹性盒子

  • 2012版 - 方法四
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            display: flex;
            justify-content: center;
        }
        .son{
            float: left;
            background: pink;
            width:50px;
            height:50px;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">

        </div>
    </div>
</body>
</html>
  • 2009版 - 方法五
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            display: box;
            box-orient: horizontal;
            box-pack: center;

            /*webkit*/
            display: -webkit-box;
            -webkit-box-orient:horizontal;
            -webkit-box-pack:center;

            /*moz*/
            display: -moz-box;
            -moz-box-orient: horizontal;
            -moz-box-pack: center;
            
            /*o*/
            display: -o-box;
            -o-box-orient: horizontal;
            -o-box-pack: center;

            /*ms*/
            display: -ms-box;
            -ms-box-orient: horizontal;
            -ms-box-pack: center;
        }
        .son{
            float: left;
            background: pink;
            width:50px;
            height:50px;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">

        </div>
    </div>
</body>
</html>

1.2.4 绝对定位

  • CSS3 新增的 transform - 方法六
  • transform: translate(x,y) | 根据左(X轴)和顶部(Y轴)位置给定的参数,从当前元素位置移动。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {

        }
        .son{
            float: left;
            background: pink;
            width:50px;
            height:50px;

            position: absolute;
            left: 50%;
            transform: translate(-50%, 0);
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">

        </div>
    </div>
</body>
</html>
  • left: 50% - 方法七
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {

        }
        .son{
            float: left;
            background: pink;
            width:50px;
            height:50px;

            position: absolute;
            left: 50%;
            /*负的一半width*/
            margin-left: -25px; 
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">

        </div>
    </div>
</body>
</html>
  • left: 0; right: 0 - 方法八
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {

        }
        .son{
            float: left;
            background: pink;
            width:50px;
            height:50px;

            position: absolute;
            left:0;
            right:0;
            margin:0 auto;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">

        </div>
    </div>
</body>
</html>

二、垂直居中 ( 八种方法 )

2.1 行内元素 - 方法一

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            background: #ccc;
            height: 200px;
        }
        .son{
            width: 50px;
            height: 50px;

            line-height: 200px;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <span class="son">123</span>
    </div>
</body>
</html>

2.2 块级元素

2.2.1 行内块级元素 - 方法二

  • 拥有内在尺寸,可设置高宽,不会自动换行,有:(button,input,textarea,select), img等
  • 基本思想是使用display: inline-block, vertical-align: middle和一个伪元素让内容块处于容器中央.

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            background: #ccc;
            height: 200px;
        }
        .son{
            width: 50px;
            height: 50px;
            background: pink;
        }
        .parent::after, .son{
            display:inline-block;
            vertical-align:middle;
         }
        .parent::after{
            content:'';
            height:100%;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <button class="son">123</button>
    </div>
</body>
</html>

2.2.2 table - 方法三

  • 元素高度可以动态改变, 不需再CSS中定义, 如果父元素没有足够空间时, 该元素内容也不会被截断。
  • 但是在 IE6~7, 甚至IE8 beta中无效。

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            background: #ccc;

            display: table;
        }
        .son{
            background: pink;

            display: table-cell;
            vertical-align: middle;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">123</div>
    </div>
</body>
</html>

2.2.3 Flex 弹性盒子

  • 2012版 - 方法四
    优点

    • 内容块的宽高任意, 优雅的溢出。
    • 可用于更复杂高级的布局技术中。

    缺点

    • IE8/IE9不支持。
    • 需要浏览器厂商前缀。
    • 渲染上可能会有一些问题。

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            background: #ccc;
            height: 200px;
            width: 200px;

            display: flex;
            align-items: center;
        }
        .son{
            width: 50px;
            height: 50px;
            background: pink;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">123</div>
    </div>
</body>
</html>
  • 2009版 - 方法五
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {
            background: #ccc;
            height: 200px;
            width: 200px;

            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-box-pack: center;
        }
        .son{
            width: 50px;
            height: 50px;
            background: pink;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">123</div>
    </div>
</body>
</html>

2.2.4 绝对定位

  • CSS3 新增的 transform - 方法六
  • parent无宽高

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {

        }
        .son{
            width: 50px;
            height: 50px;
            background: pink;

            position: absolute;
            top: 50%;
            transform: translate( 0, -50%);
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">123</div>
    </div>
</body>
</html>
  • top: 50% - 方法七
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {

        }
        .son{
            width: 50px;
            height: 50px;
            background: pink;

            position: absolute;
            top: 50%;
            /*-0.5 height*/
            margin-top: -25px;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">123</div>
    </div>
</body>
</html>
  • top/bottom: 0; - 方法八
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .parent {

        }
        .son{
            width: 50px;
            height: 50px;
            background: pink;

            position: absolute;
            top: 0;
            bottom: 0;
            margin: auto 0;
        }
    </style>
</head>
<body>
    <div class='parent'>
        <div class="son">123</div>
    </div>
</body>
</html>