[css]常见的垂直居中实现方式

行内或类行内元素

例如:文本和链接等。

单行

  • case1

对于单行行内或者文本元素,只需为它们添加等值的 padding-toppadding-bottom (或者上下margin)就可以实现垂直居中:

.link {
  padding-top30px;
  padding-bottom30px;
}

上面的情况是父元素高度未设置的情况,使用margin或padding的目的就是使其高度撑开,让子元素位于中部。

  • case2

如果已知文本不会换行,那么还可以让 line-heightcenter 相等,从而实现垂直居中。

.center-text-trick { 
    height100px
    line-height100px
    white-space: nowrap; 
}

示例

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

    <style>
        body {
            background#f06d06;
            font-size80%;
        }

        main {
            background: white;
            margin20px 0;
            padding50px;
        }

        main a {
            border2px solid black;
            background: yellow;
            color: black;

            padding40px 40px;
             /*margin: 40px 40px;*/

            text-decoration: none;
        }
    
</style>
</head>
<body>
<main>
    <p>
        <a href="#0">We're</a>
        <a href="#0">Centered</a>
        <a href="#0">Bits of</a>
        <a href="#0">Text</a>
    </p>

</main>
</body>
</html>
[css]常见的垂直居中实现方式
img

示例2

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

    <style>
        body {
            background#f06d06;
            font-size80%;
        }

        main {
            background: white;
            margin20px 0;
            padding40px;
        }

        main div {
            border2px solid black;
            background: yellowgreen;
            color: white;

            height100px;
            line-height100px;

            /*padding: 20px;*/
            width50%;
            white-space: nowrap;
        }
        
    
</style>
</head>
<body>

<main>
    <div>
        测试测试测试测试测试测试测试测试测试
    </div>
</main>
</body>
</html>

多行

  • 对于多行文本,同样可以使用等值 padding-toppadding-bottom 的方式实现垂直居中。

  • 还可以通过 CSS 为文本设置一个类似 table-cell 的父级容器,然后使用 vertical-align 属性实现垂直居中。即,使用table的vertical-align属性实现垂直居中。

  • 值得注意的是,上述方法只适用于父级容器拥有确定高度的元素。

  • 此外,还可以使用 flexbox 实现垂直居中,对于父级容器为 display: flex 的元素来说,它的每一个子元素都是垂直居中的:

    .flex-center-vertically { 
     display: flex; 
        justify-content: center; 
        flex-direction: column; 
        height400px
    }
  • 还可使用被称为幽灵元素(ghost element)的非常规解决方式:在垂直居中的元素上添加伪元素,设置伪元素的高等于父级容器的高,然后为文本添加 vertical-align: middle; 样式,即可实现垂直居中。

.ghost-center {
    position: relative;
}

.ghost-center::before {
    content" ";
    display: inline-block;
    height100%;
    width1%;
    vertical-align: middle;
}

.ghost-center p {
    display: inline-block;
    vertical-align: middle;
}


示例1

通过table的vertical-align实现。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        table {
            width240px;
            border-collapse: separate;
            margin20px;
            height250px;
        }

        table td {
            background: yellow;
            color: black;
            border10px solid white;
            /* default is vertical-align: middle; */
        }

        .center-table {
            display: table;
            height250px;
            background: white;
            width240px;
            margin20px;
        }

        .center-table p {
            display: table-cell;
            margin0;
            background: yellow;
            color: black;
            /*padding: 20px;*/
            border10px solid white;
            vertical-align: middle;
        }
    
</style>
</head>
<body>
<table>
    <tr>
        <td>
            测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
        </td>
    </tr>
</table>

<div class="center-table">
    <p>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</p>
</div>
</body>
</html>

示例2

使用flex布局。

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

        main {
            background: yellow;
            width100%;
            /*margin: 20px;*/
        }

        .flex-center {
            width300px;
            height200px;

            background: yellow;
            color: black;
            border:2px solid black;

            /*核心 flex */
            display: flex;
            flex-direction: column;
            justify-content: center;

            /*resize 属性规定是否可由用户调整元素尺寸。*/
            resize: both;
            overflow: auto;
        }

        .flex-center p {
            margin0;
            padding20px;
        }
    
</style>
</head>
<body>
<main class="flex-center">
    <p>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</p>
</main>
</body>
</html>
[css]常见的垂直居中实现方式
img
[css]常见的垂直居中实现方式
img
[css]常见的垂直居中实现方式
img

可以看到,无论是单行还是多行,width和height如何改变,文本都始终位于中部。

示例3

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

        div {
            border2px solid black;
            background: yellow;
            width240px;
            height200px;
            margin20px;
            color: black;
            resize: vertical;
            overflow: auto;
            padding20px;
        }

        .ghost-center {
            position: relative;
        }

        .ghost-center::before {
            content" ";
            display: inline-block;
            height100%;
            width1%;
            vertical-align: middle;
        }

        .ghost-center p {
            display: inline-block;
            vertical-align: middle;
            width190px;
            margin0;
            padding20px;
            background: burlywood;
        }
    
</style>
</head>
<body>
<div class="ghost-center">
    <p>
        测试测试测试测试测试测试测试测试测试测试测试测试测
    </p>
</div>
</body>
</html>

[css]常见的垂直居中实现方式
img

块级元素

已知元素的高度

无法获知元素的具体高度是非常常见的一种状况,比如:视区宽度变化,会触发布局重绘,从而改变高度;对文本施加不同的样式会改变高度;文本的内容量不同会改变高度;当宽度变化时,对于宽高比例固定的元素(比如图片),也会自动调整高度……

如果我们知道元素的高度,可以这样来实现垂直居中:

.parent {
    position: relative;
}

.child {
    position: absolute;
    top50%;
    height100px;
    margin-top: -50px;
}

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        main {
            background: yellow;

            height400px;
            width400px;
            margin20px;


            position: relative;

            /* 可拖拽调整大小 */
            resize: vertical;
            overflow: auto;
        }

        main div {
            position: absolute;
            left0;
            background: greenyellow;
            color: black;

            border2px solid black;

            /* 核心 */
            top50%;
            height100px;
            margin-top: -50px;

        }
    
</style>
</head>
<body>
<main>
    <div>
        测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
    </div>
</main>
</body>
</html>
[css]常见的垂直居中实现方式
img


未知元素的高度

transform 属性是css3的特性,即向元素应用 2D 或 3D 转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜。

如果不知道元素的高度,那么就需要先将元素定位到容器的中心位置,然后使用 transformtranslate 属性,将元素的中心和父容器的中心重合,从而实现垂直居中。

.parent {
    position: relative;
}

.child {
    position: absolute;
    top50%;
    transformtranslateY(-50%);
}

示例

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

        main {
            background: greenyellow;
            height300px;
            margin20px;
            width300px;
            position: relative;

            border2px solid black;

            resize: vertical;
            overflow: auto;
        }

        main div {
            position: absolute;
            top50%;
            left20px;
            right20px;
            background: black;
            color: white;
            padding20px;
            transformtranslateY(-50%);
            resize: vertical;
            overflow: auto;
        }
    
</style>
</head>
<body>
<main>

    <div>
        测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
    </div>

</main>
</body>
</html>

无论如何拖拽改变父盒子高度,子盒子都始终处于中间。

[css]常见的垂直居中实现方式
img

使用 transform 有一个缺陷,就是当计算结果含有小数时(比如 0.5),会让整个元素看起来是模糊的,一种解决方案就是为父级元素设置 transform-style: preserve-3d; 样式:

.parent-element {
    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    transform-style: preserve-3d;
}

.element {
    position: relative;
    top50%;
    transformtranslateY(-50%);
}

flexbox

使用 flexbox 实现水平和垂直居中,只需使用两条居中属性即可:

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        main {
            background: yellow;

            height200px;
            width60%;

            border2px solid black;

            margin0 auto;

            /*核心*/
            display: flex;


            /*垂直居中,针对的是main的子元素,不包含“孙子”元素*/
            align-items: center;

            /*水平居中,针对的是main的子元素,不包含“孙子”元素*/
            justify-content: center;

            /*拖拽改变宽高*/
            resize: both;
            overflow: auto;
        }

        main div {
            border2px solid black;
            background: green;
            color: black;
            width30%;

            margin-right20px ;
            /*拖拽改变宽高*/
            resize: both;
            overflow: auto;
        }
    
</style>
</head>
<body>
<main>

    <div>
        测试测试测试测试测试测试测试测试测
        试测试测试测试测试测试测试测试测试测试测试测试测试测
        试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
        测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试

    </div>
    <div>
        测试测试测试测试测试测试测试测试测
        试测试测试测试测试测试测试测试测试测试测试测试测试测
        试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
        测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试

    </div>

</main>
</body>
</html>

如图,无论如何拖拽,它们都是水平垂直居中的。关于flex更多详情,可点击这里查阅。

[css]常见的垂直居中实现方式
img


原文始发于微信公众号(豆子前端):[css]常见的垂直居中实现方式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/56953.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!