前面的话

  相对于水平居中,人们对于垂直居中略显为难,大部分原因是vertical-align不能正确使用。实际上,实现垂直居中也是围绕几个思路展开的。本文将介绍关于垂直居中的5种思路

line-height

【思路一】: 行高line-height实现单行文本垂直居中

  行内流传着一种说法,单行文本垂直居中要将高度和行高设置成相同的值,但高度其实没必要设置。实际上,文本本身就在一行中居中显示。在不设置高度的情况下,行高撑开高度

<style>
.test{
line-height: 50px;
background-color: lightblue;
}
</style>
<div class="test">测试文字</div>

vertical-align

【思路二】:设置vertical-align:middle实现垂直居中

【1】设置父元素的display为table-cell

  通过为table-cell元素设置vertical-align:middle,可使其子元素均实现垂直居中。这和表格里单元格的垂直居中是类似的

  [注意]若要IE7-浏览器支持,则可以将其改为<table>表格结构

  [注意]设置为table-cell的div不能使用浮动绝对定位,因为浮动或绝对定位会使元素具有块级元素特性,从而丧失了table-cell元素具有的垂直对齐的功能。若需要浮动或绝对定位处理,则需要外面再套一层div

<style>
.parent{
display: table-cell;
vertical-align: middle;
}
</style>
<div class="parent" style="background-color: gray;height: 100px;">
<div class="child" style="background-color: lightblue;">我是有点长的有点长的有点长的有点长的测试文字</div>
</div>

【2】若子元素是图片,通过设置父元素的行高来代替高度,且设置父元素的font-size为0

  vertical-align:middle的解释是元素的中垂点与父元素的基线加1/2父元素中字母X的高度对齐。由于字符X在em框中并不是垂直居中的,且各个字体的字符X的高低位置不一致。所以,当字体大小较大时,这种差异就更明显。当font-size为0时,相当于把字符X的字体大小设置为0,于是可以实现完全的垂直居中

<style>
.parent{
line-height: 100px;
font-size: 0;
}
.child{
vertical-align: middle;
}
</style>
<div class="parent" style="background-color: lightgray;width:200px;">
<img class="child" src="http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/img1.gif" width="50%" alt="test">
</div>

【3】通过新增元素来实现垂直居中的效果

  新增元素设置高度为父级高度,宽度为0,且同样设置垂直居中vertical-align:middle的inline-block元素。由于两个元素之间空白被解析,所以需要在父级设置font-size:0,在子级再将font-size设置为所需值;若结构要求不严格,则可以将两个元素一行显示,则不需要设置font-size:0

<style>
.parent{
height: 100px;
font-size: 0;
}
.child{
display: inline-block;
font-size: 20px;
vertical-align: middle;
}
.childSbling{
display: inline-block;
height: 100%;
vertical-align: middle;
}
</style>
<div class="parent" style="background-color: lightgray; width:200px;">
<div class="child" style="background-color: lightblue;">我是比较长的比较长的多行文字</div>
<i class="childSbling"></i>
</div>

absolute

【思路三】:通过绝对定位实现垂直居中

【1】配合translate()位移函数

  translate函数的百分比是相对于自身高度的,所以top:50%配合translateY(-50%)可实现居中效果

  [注意]IE9-浏览器不支持

  [注意]若子元素的高度已知,translate()函数也可替换为margin-top: 负的高度值

<style>
.parent{
position:relative;
}
.child{
position: absolute;
top: 50%;
transform: translateY(-50%);
}
</style>
<div class="parent" style="background-color: lightgray; height:100px;">
<div class="child" style="background-color: lightblue;">测试文字</div>
</div>

【2】若子元素定高,结合绝对定位的盒模型属性,实现居中效果

<style>
.parent{
position: relative;
}
.child{
position: absolute;
top: 0;
bottom: 0;
margin: auto 0;
height: 50px;
}
</style>
<div class="parent" style="background-color: lightgray; height:100px;">
<div class="child" style="background-color: lightblue;">测试文字</div>
</div>

<关于增加div层级的说明>

  在水平居中对齐中,元素外层套一层div并设置absolute,元素设置负margin-left或者relative的负left属性,可以实现水平居中的效果。但由于margin是相对于包含块宽度的,这样margin-top:-50%得到的是宽度而不是高度的-50%,所以不可行;对于relative的百分比取值而言,在包含块高度为auto的情况下,chrome、safari和IE8+浏览器都不支持设置元素的百分比top值,所以也不可行

flex

【思路四】:使用弹性盒模型flex实现垂直居中

  [注意]IE9-浏览器不支持

【1】在伸缩容器上设置侧轴对齐方式align-items: center

<style>
.parent{
display: flex;
align-items: center;
}
</style>
<div class="parent" style="background-color: gray; height: 100px;">
<div class="child" style="background-color: lightblue;">测试文字</div>
</div>

【2】在伸缩项目上设置margin: auto 0

<style>
.parent{
display: flex;
}
.child{
margin: auto 0;
}
</style>
<div class="parent" style="background-color: gray; height: 100px;">
<div class="child" style="background-color: lightblue;">测试文字</div>
</div>

grid

【思路五】: 使用栅格布局grid实现垂直居中

  [注意]IE10-浏览器不支持

【1】在网格容器上设置align-items或align-content

<style>
.parent{
display:grid;
align-items:center;
/*align-content:center;*/
}
</style>
<div class="parent" style="background-color: gray; height: 100px;">
<div class="child" style="background-color: lightblue;">测试文字</div>
</div>

【2】在网格项目中设置align-self或者margin: auto 0

<style>
.parent{
display:grid;
}
.child{
align-self:center;
/*margin: auto 0;*/
}
</style>
<div class="parent" style="background-color: gray; height: 100px;">
<div class="child" style="background-color: lightblue;">测试文字</div>
</div>

CSS实现垂直居中的5种思路的更多相关文章

  1. CSS实现垂直居中的4种思路

    × 目录 [1]line-height [2]vertical-align [3]absolute [4]flex 前面的话 相对于水平居中,人们对于垂直居中略显为难,大部分原因是vertical-a ...

  2. 顽石系列:CSS实现垂直居中的五种方法

    顽石系列:CSS实现垂直居中的五种方法 在开发过程中,我们可能沿用或者试探性地去使用某种方法实现元素居中,但是对各种居中方法的以及使用场景很不清晰.参考的内容链接大概如下: 行内元素:https:// ...

  3. 有趣的css—隐藏元素的7种思路

    css隐藏元素的7种思路 前言 display.visibility.opacity三个属性隐藏元素之间的异同点一直是前端面试面试的常考题. 属性 值 是否在页面上显示 注册点击事件是否有效 是否存在 ...

  4. CSS实现垂直居中的5种方法

    利用 CSS 来实现对象的垂直居中有许多不同的方法,比较难的是选择那个正确的方法.我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站. 使用 CSS 实现垂直居中并不容易.有些方法在一些浏览器 ...

  5. CSS实现水平居中的4种思路

    × 目录 [1]text-align [2]margin [3]absolute [4]flex 前面的话 水平居中是经常遇到的问题.看似方法较多,条条大路通罗马.但系统梳理下,其实都围绕着几个思路展 ...

  6. 纯CSS实现垂直居中的7种方法

    今天申请博客通过了,给大家讲讲我所看到过的纯css实现垂直居中的各种方法.为什么要把它作为第一篇文章呢?因为这是我刚开始接触前端学到的对我最有用的知识,希望大家也可以从中获益! 在CSS中实现水平居中 ...

  7. CSS实现水平居中的5种思路

    前面的话 水平居中是经常遇到的问题.看似方法较多,条条大路通罗马.但系统梳理下,其实都围绕着几个思路展开.本文将介绍关于水平居中的5种思路 text-align [思路一]:在父元素中设置text-a ...

  8. [转]-CSS 元素垂直居中的6种方法

    原文地址:http://blog.zhourunsheng.com/2012/03/css-%E5%85%83%E7%B4%A0%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD ...

  9. CSS 实现垂直居中的几种方案

    最近在学关系型数据库相关,MySQL 和 Postgre,捎带着学了 PHP,为了练手这几天就忙着自己搭博客,项目部署在某云上,该云算是良心,给的空间自己搭博客用足够了.本来想着每日一bo的,所以有的 ...

随机推荐

  1. PAT A1150 Travelling Salesman Problem (25 分)——图的遍历

    The "travelling salesman problem" asks the following question: "Given a list of citie ...

  2. AI 主成分分析(PCA)

    主成分分析(principal components analysis,简称PCA),

  3. spring HibernateTemplate.save() 方法的自动提交问题

    如题: service1: dao1.save(obj);   //失败,应该给spring捕获,但没有,程序继续执行下去了. redisService.fun1();  //被执行 service2 ...

  4. ng-include文件实现ng-repeat

    Angularjs实现自由度很高.比如ng-repeat可以以包含的文件中实现数据循环. 如: 当我们把这html文件被ng-include包含时,它完全能正常呈现对应的数据: 创建应用app: 创建 ...

  5. Flutter - 创建自适应的Android app 图标

    上一篇文章说到  Flutter - 自动生成Android & iOS图标 通过flutter_launcher_icons 可以一键生成所有的Icon 到此基本什么问题也没有,如果你用io ...

  6. Microsoft Office软件自定义安装目录

    Microsoft Office安装时不能手动设置安装目录,本文描述通过修改注册表的方式自定义安装目录 1.同时按下快捷键 win + r 启动运行 2.输入 regedit 打开注册表 3.找到   ...

  7. Linux下通过受限bash创建指定权限的账号

    在日常业务运维中,有时为了配合解决问题,需要给非运维人员开通系统账号,用于查询日志或代码.通常为了系统安全或避免不必要的误操作等目的,会将账号权限降至最低.下面介绍下在Linux下通过受限bash创建 ...

  8. mysql操作命令梳理(2)-alter(update、insert)

    在mysql运维操作中会经常使用到alter这个修改表的命令,alter tables允许修改一个现有表的结构,比如增加或删除列.创造或消去索引.改变现有列的类型.或重新命名列或表本身,也能改变表的注 ...

  9. 个人对vuex的表象理解(笔记)

    一个东西,首先要知道为什么用它,为什么要vuex,官方解释为了解决繁杂事件订阅和广播,那么事件的$dispatch,$on,怎么就复杂了?许多人是不是感觉后者还挺简单的,对的 如果简单小型项目,那么不 ...

  10. 北航MOOC客户端

    我们的团队作业终于完成了,欢迎下载使用我们的北航MOOC手机客户端软件(Android端)——北航学堂,学习北航的公开课程. 安装包下载地址: http://pan.baidu.com/s/1jGvH ...