全面总结使用CSS实现水平垂直居中效果的方法


Posted in HTML / CSS onMarch 10, 2016

说起水平垂直居中大家常看到的是使用绝对定位与负margin的配合或者是inline-block配合vertical-align:middle等方法。当然还有其他一些解决方案,比如说,在水平垂直居中系列中介绍了一些制作方案。但这些方案或多或少都存在一些局限性。假设,要垂直水平居中的元素大小是未知的,你要使用绝对定位与负margin配合就难上加难。当然你会说,使用表格将解决我一切所需,的确是这样,那么除了这些方法,还有别的方案吗?接下来我们就针对这个自设问题,来一起探讨其他几种实现水平垂直居中的方案。

为了更好的阐述后面的方案,我们这里有一个命题:让未知大小容器(未知行数的文本)实现水平垂直居中。看到这样的命题,有人或许会说神经病又来了,如果你也这么认为,就让当是神病出现了吧。我们不纠结这个,还是看几种解决方案吧。

方法一:最原始的方式

这种方法用来实现单行垂直居中是相当的简单的,你只要保证元素内容是单行,并且其高度是固定不变的,你只要将其“line-height”设置成和“height”值一样就Ok了。不过这种方法局限性太大,只有单行文本的元素才适用,所以在多行元素中是不能使用这种方法的。

Html Markup

XML/HTML Code复制内容到剪贴板
  1. <div class="vertical">content</div>  

   
CSS Code:

CSS Code复制内容到剪贴板
  1. .vertical {   
  2.  height100px;   
  3.  line-height100px;/*值等于元素高度的值*/  
  4. }  

   
优点:

适合在所有浏览器,没有足够空间时,内容不会被切掉

缺点:

仅适合应用在文本和图片上,并且这种方法,当你文本不是单行时,效果极差,差到让你感到恶心。

这种方法对运用在小元素上是非常有用的,比如说让一个button、图片或者单行文本字段。

方法二:Flexbox方式

什么是Flexbox就不说了,对于让Flexbox实现水平垂直居中可以说是绝对的一流。假设我想让一张图片(图片大小不知)在body中实现水平垂直居中。

HTML

XML/HTML Code复制内容到剪贴板
  1. <body>  
  2.     <img src="http://img0.bdstatic.com/img/image/shouye/mxangel.jpg" alt="" />  
  3. </body>  

结构非常简单,body中有一张图片。

CSS

我们要做的是,如何使用Flexbox让img在body中实现水平垂直居中。

CSS Code复制内容到剪贴板
  1. *{   
  2.   margin: 0;   
  3.   padding:0;   
  4.   -webkit-box-sizing: border-box;   
  5.   box-sizing: border-box;   
  6. }   
  7. html,   
  8. body {   
  9.   height: 100%;   
  10. }   
  11. body {   
  12.   display: flex;   
  13.   align-items: center;   
  14.   justify-contentcenter;   
  15.   width: 100%;/*firefox下需要*/  
  16. }  

代码就这么几行,有一个关键之处,需要将html和body高度设置为100%;然后只需要在body中配置样式。此处使用了Flexbox中的居中属性。至于他们原理,这里就不多说了,感兴趣的同学可以看看Flexbox相关的教程。

方法三:transform与绝对定位方式

在当今天移动设备横行天下的年代,给我们前端人员制作页面带来无尽的烦恼,具体原因,大家都懂的。那么这里我们来模拟一个情形。有一个弹出层,我不知道他的大小有多大,我想让他在各种设备中永远水平居中。在下面示例中,我们用一个Dive来当作是弹出窗吧(偷懒了,不想花太多时间去做这个弹出窗效果)。

回到我们问题所在,在示例中有这样的一个结构:

XML/HTML Code复制内容到剪贴板
  1. <div class="modal">  
  2.     <div class="modal-header">弹出窗标题</div>  
  3.     <div class="modal-body">在当今天移动。。。</div>  
  4. </div>  

结构不分析了。直接看CSS:

CSS Code复制内容到剪贴板
  1. *{   
  2.   margin: 0;   
  3.   padding:0;   
  4.   -webkit-box-sizing: border-box;   
  5.   box-sizing: border-box;   
  6. }   
  7. html,   
  8. body {   
  9.   height: 100%;   
  10. }   
  11.   
  12. .modal {   
  13.   border1px solid #bbb;   
  14.   border-radius: 5px;   
  15.   box-shadow: 0 0 3px rgba(0,0,0,.5);   
  16.   
  17.   position:absolute;   
  18.   top:50%;   
  19.   left: 50%;   
  20.   -webkit-transform: translate(-50%, -50%);   
  21.   transform: translate(-50%, -50%);   
  22. }   
  23. .modal-header {   
  24.   padding10px 20px;   
  25.   background: rgba(0,0,0,.25);   
  26.   color:#fff;   
  27. }   
  28. .modal-body{   
  29.   padding20px;   
  30.   background#fff;   
  31. }  

方法四:div
使用div模拟表格效果,也就是说将多个<div>的“display”属性设置为禾“table”和“table-cell”,并设置他们的“vertical-align”的属性值为“middle”。
HTML Code

XML/HTML Code复制内容到剪贴板
  1. <div id="container">  
  2.  <div id="content">content</div>  
  3. </div>  

   
CSS Code

CSS Code复制内容到剪贴板
  1. #container {   
  2.  height300px;   
  3.  display: table;/*让元素以表格形式渲染*/  
  4. }   
  5. #content {   
  6.  display:table-cell;/*让元素以表格的单元素格形式渲染*/  
  7.  vertical-alignmiddle;/*使用元素的垂直对齐*/  
  8. }     

   
优点:

这种方法不会像前面的两种方法一样,有高度的限制,此方法可以要据元素内容动态的改变高度,从而也就没有空间的限制,元素的内容不会因为没足够的空间而被切断或者出现难看的滚动条。

缺点:

不足之处呢?这种方法只适合现代浏览器,在IE6-7下无法正常运行;而且较前两者而言,结构也更复杂。

这种方法在现代浏览器下是非常方便。但是在IE6-7中是不被支持的,因为display:table在IE6-7中不被支持,那么为了解决这种方法在IE6-7的兼容,需要额外增加一个div,并使用hack,下面我们一起来看看其解决办法。

HTML Markup

XML/HTML Code复制内容到剪贴板
  1. <div class="table">  
  2.  <div class="tableCell">  
  3.   <div class="content">content</div>  
  4.  </div>  
  5. </div>  

   
CSS Code

CSS Code复制内容到剪贴板
  1. .table {   
  2.  height300px;/*高度值不能少*/  
  3.  width300px;/*宽度值不能少*/  
  4.  display: table;   
  5.  positionrelative;   
  6.  float:left;   
  7. }     
  8.   
  9. .tableCell {   
  10.  displaytable-cell;   
  11.  vertical-alignmiddle;   
  12.  text-aligncenter;      
  13.  padding10px;   
  14.  *positionabsolute;   
  15.  *top: 50%;   
  16.  *left: 50%;   
  17. }   
  18. .content {   
  19.  *position:relative;   
  20.  *top: -50%;   
  21.  *left: -50%;   
  22. }  

   
还有一种方法、有点新意,用这种方法你需要在居中元素前面放一个空的<div>(块元素就可以),然后设置这个<div>的高度为50%,margin-bottom为元素高度的一半,而且居中元素需要清除浮动。需要注意的是,使用这种方法,如果你的居中元素是放在body中的话,你需要给html,body设置一个“height:100%”的属性。

HTML Markup

XML/HTML Code复制内容到剪贴板
  1. <body>  
  2.  <div id="floater"><!--This block have empty content --></div>  
  3.  <div id="content">Content section</div>  
  4. </body>  

   
CSS Code

CSS Code复制内容到剪贴板
  1. html,body {height: 100%;}   
  2. #floater{   
  3.  float:left;   
  4.  height:50%;/*相对于父元素高度的50%*/  
  5.  margin-bottom: -120px;/*值大小为居中元素高度的一半(240px/2)*/  
  6. }   
  7. #content {   
  8.  clear:both;/*清除浮动*/  
  9.  height240px;   
  10.  positionrelative;   
  11. }  

   
优点:

这种方法能兼容所有浏览器,在没有足哆空间下,内容不会被切掉

缺点:

元素高度被固定死,无法达到内容自适应高度,如果居中元素加上overflow属性,要么元素出现滚动条,要么元素被切掉;另外就是一个不算缺点的缺点,那就是加了一个空标签。

方式五:display:inline-block
这种方法是采用的display:inline-block,然后借助另一个元素的高度来实现居中

Html Markup

XML/HTML Code复制内容到剪贴板
  1. <div id="parent">  
  2.  <div id="vertically_center">  
  3.   <p>I am vertically centered!</p>  
  4.  </div>  
  5.  <div id="extra"><!-- ie comment --></div>  
  6. </div>  

   
CSS Code

CSS Code复制内容到剪贴板
  1. <style type="text/css">   
  2. html,   
  3. body{   
  4.  height: 100%;   
  5. }   
  6.   
  7. #parent {   
  8.  height500px;/*定义高度,让线盒型div#extra有一个参照物,可以是固定值,也可以是百分比*/  
  9.  border1px solid red;   
  10. }   
  11. #vertically_center,   
  12. #extra {   
  13.  displayinline-block;/*把元素转为行内块显示*/  
  14.  vertical-alignmiddle;/*垂直居中*/  
  15. }   
  16. #extra {   
  17.  height: 100%; /*设置线盒型为父元素的100%高度*/  
  18. }   
  19. </style>   
  20.   
  21. <!--[if lt IE 8]>   
  22.  <style type="text/css">   
  23.   /*IE6-7不支持display:inline-block,所以在ie6-7另外写一个hack,用来支持ie6-7*/  
  24.   #vertically_center,   
  25.   #extra {   
  26.    displayinline;   
  27.    zoom: 1;   
  28.   }   
  29.   #extra {   
  30.   width1px;   
  31.   }   
  32.  </style>   
  33. <![endif]-->  

   
优点:

可以自适应高度,简单易懂

缺点:

需要给元素的父元素设置一个高度,这个高度可以是一个固定值或者百分值高度,另外需要增加一个额外的标签,当作线盒型,如div#extra,并且需要设置其高度为100%。另外就是ie6-7不支持display:inline-block,需要给他们另外写一个样式。

方式六:
这个方法是针对多行内容居中,而且容器高度是可变的,方法很简单,就是给出上下一样的padding值

Html Code

XML/HTML Code复制内容到剪贴板
  1. <div class="columns">  
  2.  <div class="item">test</div>  
  3. </div>  

    
CSS Code

CSS Code复制内容到剪贴板
  1. .item {padding-top:30px;padding-bottom:30px;}  

    
优点:

在所有浏览器下能正常工作,支持所有元素,简单易懂,结构清晰

缺点:

使用这种方法不能给容器固定高度,如果固定高度将无法达到效果。

HTML / CSS 相关文章推荐
CSS实现鼠标滑过鼠标点击代码写法
Dec 26 HTML / CSS
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
Aug 11 HTML / CSS
CSS3按钮鼠标悬浮实现光圈效果源码
Sep 11 HTML / CSS
CSS3中的弹性布局em运用入门详解 1em等于多少像素
Feb 08 HTML / CSS
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
Dec 22 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
Aug 02 HTML / CSS
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
Aug 31 HTML / CSS
html5 初试 indexedDB(推荐)
Jul 21 HTML / CSS
HTML5制作表格样式
Nov 15 HTML / CSS
htnl5利用svg页面高斯模糊的方法
Jul 20 HTML / CSS
HTML5视频播放插件 video.js介绍
Sep 29 HTML / CSS
Html5与App的通讯方式详解
Oct 24 HTML / CSS
纯CSS3实现3D旋转书本效果
Mar 21 #HTML / CSS
CSS3实现粒子旋转伸缩加载动画
Apr 22 #HTML / CSS
一款利用html5和css3实现的3D立方体旋转效果教程
Apr 26 #HTML / CSS
CSS3弹性盒模型开发笔记(一)
Apr 26 #HTML / CSS
CSS3弹性盒模型开发笔记(三)
Apr 26 #HTML / CSS
浅析两列自适应布局的3种思路
May 03 #HTML / CSS
CSS3 3D位移translate效果实例介绍
May 03 #HTML / CSS
You might like
在PHP中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
PHP7匿名类用法分析
2016/09/26 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
python实现与redis交互操作详解
2020/04/21 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
携程英文网站:Trip.com
2017/02/07 全球购物
Crabtree & Evelyn欧盟:豪华洗浴、身体和护发
2021/03/09 全球购物
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
护理见习报告范文
2014/11/03 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL