CSS是HTML元素的剪刀手,它极度的丰富了web页面的修饰。在众多CSS常见的样式需求中,有一奇葩式的存在【垂直居中】,因为不管是从逻辑实现方面还是从正常需求量来讲,这都没理由让这个需求在实践过程中,显的那么艰难。我们往往需要额外添加标签元素与充满hack味道的属性才能解决,而在涉及到不固定元素尺寸的时候,更显艰难。唉,日子还得照样过,工作还得继续干,这里就从实际需求的角度来归纳一些纯CSS方案。【特别说明,现实中的需求千变万化,请阅者根据实际需求】

文本内容的垂直居中这是一个烂大街的需求,比如在页面中某一块内容的标题上和单行列表上就会有用到。如下图:

现在我们就假设需要在一个宽400px,高32px的div上,使里面的一行文字垂直居中,主要效果如下图:

实现上面需求的HTML代码如下:

<div class="box"><span>标题标题</span></div>

CSS实现的代码如下:

.box{
width: 400px;
background-color: #ccc;
color: #333;
line-height:32px; /*主要实现代码*/
}

实现上面的需求,我们还可以用内填充来解决。不过用这个方法得事先了解我们事先的css reset或者浏览器对页面设置的默认行高是多少。假设为24px,那么我们把32px高度减去默认行高的24px,然后除以2得到4px,然后用内填充填上,所以我们可以改成这样:

.box{
width: 400px;
background-color: #ccc;
color: #333;
padding: 4px 0; /*主要实现代码*/
}

这样麻烦是麻烦了点,但总解决了问题。

需求是永无止境的,上面是实现了单行的文本问题,如果我们要实现多行文本的内容的垂直居中该怎么办呢?如下图,一个宽400px,高300px的div:

上面实现的HTML代码如下:

<div class="box">
<p>标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题</p>
</div>

你肯定想到了用内填充来解决这个问题,毕竟是固定高度的(代码就不附上了),可是如果我们里面的内容再多增加一行,或者减去一行,这种方法就行不通了。这时,我们就可以利用table的特性来解决;

    .box{
height:300px;
width: 400px;
background-color: #ccc;
color: #333;
display: table; /*设置父标签为table展示*/
}
.box > p{
display: table-cell;/*设置子标签为表格的单元格*/
vertical-align: middle;/*设置子标签单元格展现内容方式*/
}

这种方法是在IE7以及以下是没有用的,因为它们不支持标签转变为table的变化,即 display: table; 与display: table-cell;当然你可以直接用表格布局,这无所谓。好在聪明人很多,我们前端的前辈们研究了另外一种方法来实现上述内容,但html结构有变化,具体如下:

<!--html代码-->
<div class="box">
<div>
<div><p>标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题</p></div>
</div>
</div>
<!--css代码-->
<style>
.box{
width: 400px;
height: 300px;
position: relative;
background-color: #ccc;
color: #333;
}
.box > div{
position: absolute;
top: 50%;
left:;
}
.box > div > div{
position: relative;
top: -50%;
left:;
}
</style>

这只适用IE7及以下,随着浏览器的不断升级,我们可能不需要兼容这么低版本的浏览器,当做一种了解吧。

像上面的利用table的特性来布局,里面的内容是包括div和图片的。这个可以自己试试,放入固定高宽的块级元素和图片。(注意一点,p标签里面放入div,在一些浏览器中实际显示中会把p标签分割成两个,所以你可以把子元素改成div)

而如果单单你只想图片的垂直居中,你可以使用如下的方式:

<!--html代码-->
<div class="box1">
<img src="xxxxx.png">
</div>
<!--css代码-->
<style>
.box1{
background-color: #ccc;
line-height: 300px;
width: 400px;
}
.box1 > img{vertical-align: middle;}
</style>

具体效果自己看吧。

以上都是文本内容的垂直居中,但是我们平时工作中用的多的还有另外一种情况,即盒子居中,即div居中。如下图,下图是一个div,宽400px,高300px:

聪明如你,一定会用到了table来解决。这也是一种解决方案,我们还可以用定位来解决方法,如:

.box{
height:300px;
width: 400px;
background-color: #ccc;
color: #333;
position: absolute;/*这里也可以使用fixed,看自己情况而定*/
top: 50%;
left: 50%;
margin:-150px 0 0 -200px;
}

或者你也可以使用下面的代码

/*代码不适用与IE7及以下*/
.box{
height:300px;
width:400px;
background-color: #ccc;
color: #333;
position: fixed;/*这里也可以使用fixed,看自己情况而定*/
top:;
left:;
bottom:;
right:;
margin:auto;
}

以上方法都需要一个固定的高度的,如果们不确定内容的高度该怎么实现呢?利用上面的table是可以办到的,如果你的项目不用兼容不支持CSS3的浏览器话,可以试试以下的方法:

.box{
width:200px;
background-color: #ccc;
color: #333;
position: fixed;/*可以切换为absolute*/
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

既然你的项目这么超前,我们也可以使用flexbox(伸缩盒)来布局,使用这种方法我们是可以不用指定宽度的,,代码如下:

    body {
display: flex;
min-height: 100vh;
margin:;
}
.box {
background-color: #ccc;
margin: auto 20px;
}

总结:这么多的方法都不是那么完美的,具体情况具体而定吧,据说CSS发展到未来,会直接用一个属性align-self: center;来搞定所有元素的垂直居中,期待那天的到来吧。

使用纯CSS方案,解决垂直居中的更多相关文章

  1. 从项目需求角度,使用纯CSS方案解决垂直居中

    CSS是HTML元素的剪刀手,它极度的丰富了web页面的修饰.在众多CSS常见的样式需求中,有一奇葩式的存在[垂直居中],因为不管是从逻辑实现方面还是从正常需求量来讲,这都没理由让这个需求在实践过程中 ...

  2. 纯CSS制作水平垂直居中“十字架”

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 纯CSS基于窗口垂直居中

    都是IE8+的 <!DOCTYPE html> <html> <head> <title>基于窗口垂直居中 by 司徒正美</title> ...

  4. 纯css使div垂直居中,div垂直,div居中的方法

    首先编写一个简单的html代码,设置一个父div类名为boxFather,再设置一个子div类名为box1.html代码如下: <div class="boxFather"& ...

  5. 未知高度-纯css实现水平垂直居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  7. 纯css实现div中未知尺寸图片的垂直居中

    1.淘宝的方法 在曾经的"淘宝UED招聘"中有这样一道题目: “使用纯CSS实现未知尺寸的图片(但高宽都小于200px)在200px的正方形容器中水平和垂直居中.” 当然出题并不是 ...

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

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

  9. 一个常见下拉菜单的样式:一体化小三角(纯css手写解决)

    类似下拉菜单2个一体化小三角,习惯上用字体图标加jQuery处理,比较方便,但是下面纯css手写解决方式,效果也还不错,对CSS知识也是一个比较好的孔固. 小三角用了2种不同处理方式:1.利用bord ...

随机推荐

  1. Python3.5 numpy,scipy,安装

    不是特别难,先保证环境变量正确配置 首先,安装了VS2015; 第二,在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下: 第三,下载相对应的 ...

  2. JS中的this 指向问题

    我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...

  3. JS入门(四)

    接之前一篇的函数.写之前的函数的时候讲的比较笼统,在这重新写一下函数的内容. 函数: 之前提过,函数就是代码复用的一种机制或是将代码封装成功能的代码段.函数的声明在这边就不多提了,因为相对来说比较简单 ...

  4. 说说如何用js实现一个模板引擎

    本文同步更新在: https://github.com/whxaxes/blog/issues/4 ,在 github 看文章显示效果会更好一些. 前言 不知不觉就很长时间没造过什么轮子了,以前一直想 ...

  5. SDWebImage下载图片的使用

    第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 1 #import "UII ...

  6. C++ Primer 5 CH2 变量和基本类型

    C++ 是一种静态数据类型语言,它的类型检查发生在编译时.因此,编译器需要知道每一个变量对应的数据类型. 2.1 基本内置类型 算术类型 C++ 标准并没有规定带符号类型应如何表示,但是约定了在表示范 ...

  7. MySQL基准测试(benchmark)

    基准测试是唯一方便有效的.可以学习系统在给定的工作负载下会发生什么的方法.基准测试可以观察系统在不同压力下的行为,评估系统的容量,掌握哪些是重要的变化,或者观察系统如何处理不同的数据. 验证基于系统的 ...

  8. SignalR的一点点东西

    JS部分 $.connection.hub.start().done(function () { alert(ok); }).fail(function (error) { alert(error); ...

  9. 第37篇 Asp.Net源码解析(二)--详解HttpApplication

    这篇文章花了点时间,差点成烂到电脑里面,写的过程中有好几次修改,最终的这个版本也不是很满意,东西说的不够细,还需要认真的去看下源码才能有所体会,先这样吧,后面有时间把细节慢慢的再修改.顺便对于开发的学 ...

  10. NOI全国赛(2001)--食物链

    今天写了道并查集的题,看来并查集的题刷少了,,,,,用法好神奇啊!!!开三倍并查集 用i表示自己,i+n存天敌,i+2*n存可以克制de,再逻辑判断一下即可. 所以,要意识到并查集的分类处理可以开不同 ...