zoukankan      html  css  js  c++  java
  • 元素垂直居中的各种实现方式

    一点感悟

    曾子曰:"吾日三省吾身", 意思就是说每天要多次想一想自己到底干了什么 O(∩_∩)O~。好吧,这个其实大家都知道,那为什么还要在这里扯呢?很简单,就是知道的人很多,但做到的人很少。结合自己的工作经验,谈谈前端开发的一些认识误区:

    • 只知其然,不知其所以然;
    • 解决过的问题,下次同样还是忘记,要查找相关的资料;
    • google,百度一个方法,实现了就可以了;

    这些认识的误区,我相信很多人(包括我自己)都会犯,原因是多种多样的:

    • 项目有时候确实很急,我们没有时间来捣鼓这些东西;
    • 哎,以后遇到再找资料好了,反正自己已经知道怎么查找关键字了;
    • 我去,哥(姐)还要和女(男)盆友去逛街呢,没空搞这些细节;
    • ......

    总结原因,那就是对技术的专注度不够,没有热情往纵深的方向去挖掘。有人可能会反驳了: "擦,css就那些有限的的属性,感觉没什么好学的"(ps:自己以前就是报这种态度的,惭愧)。其实这是正确的吗?css其实是很精深的一门学问,别看只有一些属性,但属性的各种值,属性之间的搭配,属性之间的差异......,还有浏览器不同的表现,这些都了解清楚了吗?我们常常在感慨为什么别人会实现一些很好的效果出来,会提出很好的解决方案,其实就是因为他们对属性,属性值了解得很透彻,知道怎样的搭配能产生怎样的效果。所以,骚年们,如果想在前端有些进步,好好静下心来学习吧。专注,实践,学习,归纳

    本文是css学习总结的开篇之作,也是我最近感悟的一些总结,希望对您有一些思考吧,废话什么的就不多说了。

    本文地址: http://forkme.info/element-vertical-align/或者http://www.cnblogs.com/blackmanba/p/element-vertical-align.html, 转载请注明源地址。

    开始

    最近在捣鼓页面的时候遇到一个问题,如何实现文字与图片的垂直居中?如图:

    problem

    其实这个问题网上答案一大堆,很多同行也都有自己的各种解决方法,下面查找资料再经过自己实验总结的方法,会着重介绍优缺点。说了这么多,接下来就是展示最终的显示效果,如果不知道效果是什么的话,请点击我思密达

    1. inline-height法

    这种方法相信很多人都知道并且尝试过,主要是利用inline元素(或者inline-block元素)的inline-box模型(ps:这个可以查看@旭哥的文章拜拜了,浮动布局-基于display:inline-block的列表布局,原理什么的旭哥都讲得很清楚了,这里就不要再瞎子点灯——多此一举了), 只要设置inline-heigth的值和父元素的height一致即可让文字居中显示,样式如下:

    .inline {
    	display: inline;
    	*display: inine;
    	zoom: 1;
    }
    .lg{
    	font-size: 18px;
    	font-weight: bold;
    	line-height: 80px; /* 注意:line-height和容器的高度一致 */
    }
    

    最终效果图上面已经截过,这里就不再搞多一张了,免得浪费亲们宝贵的时间。 O(∩_∩)O~,
    最终效果请点击这里查看,
    源代码在可以在开发者工具中查看, 下同。

    1.1 优点

    • 简单,使用很少的样式就可以实现;
    • 兼容性强,兼容IE6+, chrome和Firefox(opera没试过)

    1.2 缺陷

    • 只能用于单行文字,多行文字间距过大,效果请点击
    • 要知道父容器高度,如果不想定死高度的话只能通过javascript获取并设置,复杂度增大;
    • line-height只能适用于inline和block级别的元素;

    1.3 总结

    line-height让文字垂直居中这个方法对于单行文字来说那是再好不过,不用理相邻元素是什么,图片啊,文字啊什么都妥妥的没影响。经过之前一段时间的使用,可以说效果不错。当然,如果您的需求是多行文字或者是做自适应布局的话,建议不要用这个方法,因为~~~~不适合。%>_<%

    2. 采用absolute+margin:auto

    这个方法涉及到一个概念,就是margin属性的属性的定位问题,绝对定位的元素在填充的时候会根据自身的高度和margin值来决定最终位置。如果什么都木有设置,默认就是填充整个父容器,尺寸固定就会通过margin来决定最后的位置。概念什么的比较绕,我们可以点击这里查看最终结果,css如下:

    .parent {
    	position: relative;
    }
    .abs {
    	    position: absolute;
    	    top: 0;
    	    bottom: 0;
    	    right: 0;
    	    left: 0;
    	    margin: auto;
    	    height: 20%;
    }
    

    2.1 优点

    • 简单
    • 文字多的话,兄弟元素也能对应居中,不管兄弟元素是什么,效果请点击
    • 适应性强,父容器不用限死高度

    2.2 缺陷

    • IE6,7 不兼容

    2.3 总结

    这个方法对于不用兼容IE6, 7的应用来说是十分高效并且实用的,在实际项目的使用中并不推荐这种用法,因为绝对定位脱离了文档流,会带来一些维护上的问题,并且也不利于重用。当然,这一切都是权衡,综合考虑开发和维护成本后,如果觉得合适,就可以采用。

    3. 采用display: table-cell

    这个方法使用到了table-cell来布局,其实table-cell,顾名思义就是单元格,设置了table-cell的元素其实和传统的td标签效果是一致的,最终效果请点击这里,代码如下:

    .cell {
        display: table-cell;
        height: 80px;
        vertical-align: middle;
    }
    

    3.1 优点

    • 简单,高效
    • 适应性强

    3.2 缺点

    • IE6,7 不兼容(如果是图片居中可以使用font-size,文字不可以)
    • 容器高度固定,设置overflow: hidden 会导致文字不显示
    • 文字撑开兄弟元素不居中,效果

    3.3 总结

    使用table-cell的方式总体来说是不错的解决方案。当然,缺点也很明显,见上面。根据具体情况具体分析使用即可

    4. 采用inline-block 方法

    这个方法是目前为止我个人觉得最好的方法。原因很简单:简单易懂,容易上手,兼容性强。此方法本质上是利用了inline-block的垂直居中对齐特性。废话不多说,请点击我。不想看效果的童鞋可以直接看代码,如下

    .inline-block {
    	    display: inline-block;
    	    *display: inline;
    	    zoom: 1;
    	    vertical-align: middle;
    }
    

    4.1 一点小结

    此方法没有什么好说的,无论是兼容性还是其他特性都能完美呈现,并且不必知道文字高度,对于高度超过图片的文字也能够完美适应。真要说不好也就是先要理解inline box模型(ps:⊙﹏⊙b汗,有硬想缺点的嫌疑)。

    5. 采用button 方法

    这个方法是无意中看到的,其实原理很简单,但很有创意。那就是利用控件的特有属性。button标签就是这样的一个例子,因为其特性,我们就可以利用它来实现对应的效果了。请点击我。代码如下:

    <button>
    	<a href="#" class="inline-block w60p verticalmiddle" style="text-align: left;">盛松成:中国信贷结构继续改善</a>
    
    	<img src="http://jsfiddle.qiniudn.com/news3.png" alt="news" class="fn nomargin verticalmiddle">
    </button>
    

    5.1 优点

    • 利用button本身的属性,简单明了,甚至可以不用写css
    • 扩展性好,能根据文字高度自适应

    5.2 缺点

    • 典型的为了效果使用标签,可维护性低
    • 不满足标签的语义化,对搜索引擎不友好

    结语

    本文算作是自己前端开发的一个开端,主要是对自己知道的方法的总结和思考,并写成文章方便自己以后查阅。希望对您的学习有所帮助。随时欢迎交流意见,请在下方评论,多多益善!!

  • 相关阅读:
    Python推导式(Comprehension)
    mysql中文乱码
    入门学习hibernate
    什么是ORM?
    Java网站中的权限管理
    Java的8中基本数据类型
    Python获取文件夹大小
    Python技巧
    Python中取整的方法floor,ceil,round
    Python线程join和setDaemon
  • 原文地址:https://www.cnblogs.com/blackmanba/p/element-vertical-align.html
Copyright © 2011-2022 走看看