详解元素的垂直居中

前言:这是本人的笔记,花了点时间整理出来,希望可以帮助一些朋友少走弯路,可能有些不足之处,欢迎评论区留言,请多指正(如果您觉得有所帮助,点赞支持哦)


元素的垂直居中分两种情况:父元素高度确定的单行文本父元素高度确定的多行文本

一、父元素高度确定的单行文本

方法:

设置父元素的height和line-height高度一致

<style type="text/css">
.parent{ /* 父div */
    height:100px;
    line-height:100px;
    background:#999;
}
</style>

<div class="parent">
    <h2>Hello World</h2>
</div>

效果:

补充:


1.font-size:字体大小。即:该行的“上基线”和该行的“下基线”之间的距离(也可以说:上一行的“下基线”和下一行的“上基线”之间的距离)

2.line-height:行高。即:font-size+行距=line-height

3.行距:字体的上下空白部分之和。即:上半行距+下半行距=行距

4.基线:文本的上边界和下边界,而不是该行的最顶部和最顶部的线(除非行距为0)

正常情况:

下面各实例都要先清除浏览器默认的间隙,以免影响结果的观察:

*{
    margin: 0;
    padding: 0;
}

(1)当font-size=line-height时,行距=0(即无任何上下空白)则每行紧贴着:

<style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    p{
        font-size: 32px;
        line-height: 32px;
    }
</style>

<p>这是第一行文本</p>
<p>这是第二行文本</p>

效果:

(2)当font-size<line-height时,行距>0(即上下空白相等),则为正常情况:

(3)当font-size>line-height时,行距<0(即不仅无上下空白,而且会重合):

 

二、父元素高度确定的多行文本

父元素高度确定的多行文本、图片等的竖直居中的方法有两种

方法一:

使用插入table  (包括tbody、tr、td)标签,同时设置 vertical-align:middle(因为td 标签默认情况下就默认设置了 vertical-align 为 middle,所以可省)

html代码:

<!-- 多行文本的垂直居中 -->
<table><tbody><tr><td>
    <div id="parent">
        <p>这是第一行文本</p>
        <p>这是第二行文本</p>
        <p>这是第三行文本</p>
    </div>
</td></tr></tbody></table>

<!-- 图片的垂直居中 -->
<table><tbody><tr><td>
    <div id="parent">
        <img src="images/kenny_feng.jpg">
    </div>
</td></tr></tbody></table>

css代码(可省):

td{    
    height: 300px;
    background:#ccc;  /* 添加此属性只是为了便于观察结果 */
}

方法二:

step1:设置 display 为:table-cell

step2:设置vertical-align:middle

总结:这种方法的好处是不用添加多余的无意义的标签,但此方法兼容性比较差,在 chrome、firefox 及 IE8 以上的浏览器下可以,而在E6、7 并不支持这个样式, 兼容性比较差。而且这样将display:block变成了display:table-cell,破坏了原有的块状元素的性质,使块级元素变成行级元素

table-cell

此元素会作为一个表格单元格显示(类似 <td> 和 <th>)

html代码:

<!-- 多行文本的垂直居中 -->
<div id="box1">     <!-- 将变成行级元素 -->
    <p>这是第一行文本</p>
    <p>这是第二行文本</p>
    <p>这是第三行文本</p>
</div>

<!-- 图片的垂直居中 -->
<div id="box2">     <!-- 将变成行级元素 -->
    <img src="images/kenny_feng.jpg">
</div>

css代码:

#box1{
    height: 300px;
    display:table-cell;/*IE8以上及Chrome、Firefox*/
    vertical-align:middle;/*IE8以上及Chrome、Firefox*/
    background:#ccc;   /* 添加此属性只是为了便于观察结果 */
}

#box2{
    height: 500px;
    display:table-cell;/*IE8以上及Chrome、Firefox*/
    vertical-align:middle;/*IE8以上及Chrome、Firefox*/
    background:lightpink;   /* 添加此属性只是为了便于观察结果 */
}

效果:

问题:对div,将display:block变成display:table-cell,则块级的div会变成行级的单元格(tr),所以两个div会在同一行排列。由于如果同行的单元格高度不一致,则取最大的那个单元格的高度作为此行的高度,所以两个div都是height:500px;

解决:在两个“行级元素”的div之间加<br>,或两个div外部都加<div>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值