万恶的垂直居中问题(包括多行文本)

在实际项目开发中,经常会遇到需要垂直居中的问题,下面给出常见的垂直居中问题解决方案,以及我在实际操作中遇到的问题和解决办法
第一种情况: 知道居中元素的高度
1、relative+absolute+负margin

给其父元素设置相对定位 position:relative;
给居中元素设置绝对定位 position:absolute;
对居中元素垂直方向进行定位 top:50%;
给居中元素设置上外边距 margin-top:-(居中元素的高度);

假设居中元素的高度为100px,下面给出详细代码:

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.parent{
    position: relative;
    }
.child{
    height: 100px;
    position: absolute;
    top: 50%;
    margin-top: -50px;
    }
</style>
2、top:0+bottom:0+margin:auto

给其父元素设置相对定位 position:relative;
给居中元素设置相对定位 position:absolute;
对居中元素垂直方向进行定位 top:0;borttom:0;
给居中元素设置外边距:margin:auto;
(由于居中元素本身有高度,所以不可能top、bottom都为0,而margin:auto则会将它拉至垂直居中)

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.parent{
    position: relative;
}
.child{
    height: 100px;
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
}
</style>
3、position+calc

给其父元素设置相对定位 position:relative;
给居中元素设置绝对定位 position:absolute;
对居中元素进行垂直方向定位 top:calc(50%-自身高度的一半);
(其中50%代表其父元素高度的一半)

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.parent{
    position: relative;
}
.child{
    height: 100px;
    position: absolute;
    top: calc(50%-50px);
}
</style>
4、padding+calc

直接给居中元素设置内边距 padding:calc(50%-自身高度的一半);
(50%同样表示父元素高度的一半)

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.child{
    height: 100px;
    padding: calc(50%-50px);
}
</style>

需要注意的是 calc方法不支持IE8以下的浏览器,并且对IE8支持也不是很友好

第二种情况:居中元素高度未知
1、line-height

已知其父元素的高度;
给居中元素设置行高等于其父元素高度 line-height:height;
(此方法仅适用于块元素、行内块元素、单行文本)

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.parent{
    height: 100px;
}
.child{
    line-height: 100px;
}
</style>
2、vertical-align + inline-block

给居中元素设置 display:inline-block;
给居中元素设置垂直居中 vertical-align:middle;
(此方法仅对行内块元素有效)

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.child{
    display: inline-block;
    vertical-align: middle;
}
</style>
3、absolue+transform

给其父元素设置相对定位 position:relative;
给居中元素设置绝对定位 position:absolute;
对居中元素进行垂直方向定位 top:50%;
对居中元素进行垂直方向平移 transform:translate(-50% , 0);
(top参考的是父元素高度,translate参考的是本身高度,此方法若有其它transform属性可能会相互影响,建议在没有其它transform属性时使用)

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.parent{
    position: relative;
}
.child{
    position: absolute;
    top: 50%;
    transform: translate(-50%,0);
}
</style>
4、flex布局

给父元素设置 display:flex;
给居中元素设置 align-self:center;
(若同时存在其它布局容易产生影响)

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.parent{
    display: flex;
}
.child{
    align-self: center;
}
</style>
第三种情况:多行文本动态垂直居中
1、 table+table-cell

给其父元素设置 display:table;
给居中元素设置 display:table-cell;
给居中元素设置 vertical-align:middle;

这种方法比较常见,但是实际操作中却有一定限制,比如我遇到的如下情况
在这里插入图片描述
该图表由多层div嵌套,需要居中的div的父元素无法设置display:table,用简单的line-height设置行高则会导致多行文本显示不全,对于这种,一般是需要垂直居中的多行文本,另一半是图片的情况时,推荐使用如下方法:

2、line-height + inline-block

给其父元素设置 line-height 为自身高度 height;
把居中元素转换为行内块元素 display:inline-block;
给居中元素设置垂直居中 vertical-align:middle;
给居中元素设置合适的行高 line-height:合适的高度;
(我这里的文本最多只有两行,所以统一给行内块元素设置行高为1/2的父元素高度)

代码如下:

<div class='parent'>
    <div class='child'>
        我是居中元素
    <div>
</div>

<style>
.parent{
    line-height: 40px;
}
.child{
    display: inline-block;
    vertical-align: middle;
    line-height: 20px;
}
</style>

当然这种方法并不是没有缺点,也有以下几点需要注意

① vertical-align属性应该设置到 行内元素上(行内块元素也可)

② 如果文字的总高度超出了 容器(这里是div)的高度,那么垂直居中会失效。

③ ie7以下 span结束标签和内部内容不能有间隔空白,也就是说span的结束标签和内部内容要连在一起。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值