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

夜景如诗,豪放浪漫;夜景似文,美妙动人,夜景如画,在笔墨的淡妆浓抹里,星星月亮与灯光呈现出一幅灿烂的画卷。

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

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


方法一:最原始的方式

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

Html Markup

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


CSS Code:

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


优点:

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

缺点:

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

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

方法二:Flexbox方式

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

HTML

XML/HTML Code复制内容到剪贴板
  1. <body>
  2. <imgsrc="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-content:center;
  15. width:100%;/*firefox下需要*/
  16. }

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


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

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

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

XML/HTML Code复制内容到剪贴板
  1. <divclass="modal">
  2. <divclass="modal-header">弹出窗标题</div>
  3. <divclass="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. .modal{
  12. border:1pxsolid#bbb;
  13. border-radius:5px;
  14. box-shadow:003pxrgba(0,0,0,.5);
  15. position:absolute;
  16. top:50%;
  17. left:50%;
  18. -webkit-transform:translate(-50%,-50%);
  19. transform:translate(-50%,-50%);
  20. }
  21. .modal-header{
  22. padding:10px20px;
  23. background:rgba(0,0,0,.25);
  24. color:#fff;
  25. }
  26. .modal-body{
  27. padding:20px;
  28. background:#fff;
  29. }

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

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


CSS Code

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


优点:

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

缺点:

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

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

HTML Markup

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


CSS Code

CSS Code复制内容到剪贴板
  1. .table{
  2. height:300px;/*高度值不能少*/
  3. width:300px;/*宽度值不能少*/
  4. display:table;
  5. position:relative;
  6. float:left;
  7. }
  8. .tableCell{
  9. display:table-cell;
  10. vertical-align:middle;
  11. text-align:center;
  12. padding:10px;
  13. *position:absolute;
  14. *top:50%;
  15. *left:50%;
  16. }
  17. .content{
  18. *position:relative;
  19. *top:-50%;
  20. *left:-50%;
  21. }


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

HTML Markup

XML/HTML Code复制内容到剪贴板
  1. <body>
  2. <divid="floater"><!--Thisblockhaveemptycontent--></div>
  3. <divid="content">Contentsection</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. height:240px;
  10. position:relative;
  11. }


优点:

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

缺点:

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


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

Html Markup

XML/HTML Code复制内容到剪贴板
  1. <divid="parent">
  2. <divid="vertically_center">
  3. <p>Iamverticallycentered!</p>
  4. </div>
  5. <divid="extra"><!--iecomment--></div>
  6. </div>


CSS Code

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


优点:

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

缺点:

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

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

Html Code

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


CSS Code

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


优点:

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

缺点:

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

本文全面总结如何使用CSS如何实现水平垂直居中效果的方法到此结束。在生活中,最受到赞许的恰恰是那些从不寻求赞许并且并不竭力获得赞许的人。小编再次感谢大家对我们的支持!

标签: