CSS教程之div垂直居中的多种方法
在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中的确是有vertical-align属性,但是它只对(X)HTML元素中拥有valign特性的元素才生效,例如表格元素中的<td>、<th>、<caption>等,而像<div>、<span>这样的元素是没有valign特性的,因此使用vertical-align对它们不起作用。
一、单行垂直居中
如果一个容器中只有一行文字,对它实现居中相对比较简单,我们只需要设置它的实际高度height和所在行的高度line-height相等即可。
如:
- div {
- height:25px;
- line-height:25px;
- overflow:hidden;
- }
这段代码很简,后面使用overflow:hidden的设置是为了防止内容超出容器或者产生自动换行,这样就达不到垂直居中效果了。
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title> 单行文字实现垂直居中 </title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style type="text/css">
- body { font-size:12px;font-family:tahoma;}
- div {
- height:25px;
- line-height:25px;
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- }
- </style>
- </head>
- <body>
- <div>现在我们要使这段文字垂直居中显示!</div>
- </body>
- </html>
二、多行未知高度文字的垂直居中
如果一段内容,它的高度是可变的那么我们就可以使用上一节讲到的实现水平居中时使用到的最后一种方法,就是设定Padding,使上下的padding值相同即可。同样的,这也是一种“看起来”的垂直居中方式,它只不过是使文字把<div>完全填充的一种访求而已。可以使用类似下面的代码:
- div {
- padding:25px;
- }
这种方法的优点就是它可以在任何浏览器上运行,并且代码很简单,只不过这种方法应用的前提就是容器的高度必须是可伸缩的。
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title> 多行文字实现垂直居中 </title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style type="text/css">
- body { font-size:12px;font-family:tahoma;}
- div {
- padding:25px;
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- }
- </style>
- </head>
- <body>
- <div><pre>现在我们要使这段文字垂直居中显示!
- div {
- padding:25px;
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- }
- </pre></div>
- </body>
- </html>
三、多行文本固定高度的居中
在本文的一开始,我们已经说过CSS中的vertical-align属性只会对拥有valign特性的(X)HTML标签起作用,但是在CSS中还有一个display属性能够模拟<table>,所以我们可以使用这个属性来让<div>模拟<table>就可以使用vertical-align了。注意,display:table和display:table-cell的使用方法,前者必须设置在父元素上,后者必须设置在子元素上,因此我们要为需要定位的文本再增加一个<div>元素:
- div#wrap {
- height:400px;
- display:table;
- }
- div#content {
- vertical-align:middle;
- display:table-cell;
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- }
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title> 多行文字实现垂直居中 </title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style type="text/css">
- body { font-size:12px;font-family:tahoma;}
- div#wrap {
- height:400px;
- display:table;
- }
- div#content {
- vertical-align:middle;
- display:table-cell;
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- }
- </style>
- </head>
- <body>
- <div id="wrap">
- <div id="content"><pre>现在我们要使这段文字垂直居中显示! Webjx.Com
- div#wrap {
- height:400px;
- display:table;
- }
- div#content {
- vertical-align:middle;
- display:table-cell;
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- }
- </pre></div>
- </div>
- </body>
- </html>
这个方法应该是很理想了,但是不幸的是Internet Explorer 6 并不能正确地理解display:table和display:table-cell,因此这种方法在Internet Explorer 6及以下的版本中是无效的。嗯,这让人很郁闷!不过我们还其它的办法
四、在Internet Explorer中的解决方案
在Internet Explorer 6及以下版本中,在高度的计算上存在着缺陷的。在Internet Explorer 6中对父元素进行定位后,如果再对子元素进行百分比计算时,计算的基础似乎是有继承性的(如果定位的数值是绝对数值没有这个问题,但是使用百分比计算的基础将不再是该元素的高度,而从父元素继承来的定位高度)。例如,我们有下面这样一个(X)HTML代码段:
- <div id="wrap">
- <div id="subwrap">
- <div id="content">
- </div>
- </div>
- </div>
如果我们对subwrap进行了绝对定位,那么content也会继承了这个这个属性,虽然它不会在页面中马上显示出来,但是如果再对content进行相对定位的时候,你使用的100%分比将不再是content原有的高度。例如,我们设定了subwrap的position为40%,我们如果想使content的上边缘和wrap重合的话就必须设置top:-80%;那么,如果我们设定subwrap的top:50%的话,我们必须使用100%才能使content回到原来的位置上去,但是如果我们把content也设置50%呢?那么它就正好垂直居中了。所以我们可以使用这中方法来实现Internet Explorer 6中的垂直居中:
- div#wrap {
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- height:400px;
- position:relative;
- }
- div#subwrap {
- position:absolute;
- border:1px solid #000;
- top:50%;
- }
- div#content {
- border:1px solid #000;
- position:relative;
- top:-50%;
- }
当然,这段代码只能在Internet Exlporer 6等计算存在问题的浏览器中才会有作用。(不过我不解,我查阅了很多文章,不知道是因为出处相同还是什么原因,似乎很多人都不愿意去解释Internet Exlporer 6中这这个Bug的原理,我也只是了解了一点皮毛,还要再研究)
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title> 多行文字实现垂直居中 </title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style type="text/css">
- body { font-size:12px;font-family:tahoma;}
- div#wrap {
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- height:400px;
- position:relative;
- }
- div#subwrap {
- position:absolute;
- top:50%;
- }
- div#content {
- position:relative;
- top:-50%;
- }
- </style>
- </head>
- <body>
- <div id="wrap">
- <div id="subwrap">
- <div id="content"><pre>现在我们要使这段文字垂直居中显示!
- div#wrap {
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- height:500px;
- position:relative;
- }
- div#subwrap {
- position:absolute;
- border:1px solid #000;
- top:50%;
- }
- div#content {
- border:1px solid #000;
- position:relative;
- top:-50%;
- }</pre>
- </div>
- </div>
- </div>
- </body>
- </html>
五、完美的解决方案
那么我们综合上面两种方法就可以得到一个完美的解决方案,不过这要用到CSS hack的知识。对于如果使用CSS Hack来区分浏览器,你可
以参考这篇“简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera”:
- div#wrap {
- display:table;
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- height:400px;
- _position:relative;
- overflow:hidden;
- }
- div#subwrap {
- vertical-align:middle;
- display:table-cell;
- _position:absolute;
- _top:50%;
- }
- div#content {
- _position:relative;
- _top:-50%;
- }
至此,一个完美的居中方案就产生了。
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title> 多行文字实现垂直居中 </title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style type="text/css">
- body { font-size:12px;font-family:tahoma;}
- div#wrap {
- display:table;
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- height:400px;
- _position:relative;
- overflow:hidden;
- }
- div#subwrap {
- vertical-align:middle;
- display:table-cell;
- _position:absolute;
- _top:50%;
- }
- div#content {
- _position:relative;
- _top:-50%;
- }
- </style>
- </head>
- <body>
- <div id="wrap">
- <div id="subwrap">
- <div id="content"><pre>现在我们要使这段文字垂直居中显示!
- div#wrap {
- border:1px solid #FF0099;
- background-color:#FFCCFF;
- width:760px;
- height:500px;
- position:relative;
- }
- div#subwrap {
- position:absolute;
- border:1px solid #000;
- top:50%;
- }
- div#content {
- border:1px solid #000;
- position:relative;
- top:-50%;
- }</pre>
- </div>
- </div>
- </div>
- </body>
- </html>
以上就是本文的全部内容,希望对大家的学习有所帮助。
相关文章
- 下面小编就为大家带来一篇关于div中img,span垂直居中的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2016-09-26
- 这篇文章主要为大家详细介绍了兼容IE浏览器CSS设置DIV垂直居中的N种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-07-05
- 这篇文章主要介绍了CSS文本和div垂直居中方法总结,包括多行文本垂直居中,单行文本垂直居中,子div垂直居中,感兴趣的小伙伴们可以参考一下2016-07-04
- 这篇文章主要介绍了CSS在固定宽高的div内实现垂直居中的实例详解,即在div内部元素相对于div垂直居中的方法,需要的朋友可以参考下2016-06-03
- 下面小编就为大家带来一篇让DIV水平垂直居中的两种完美方法推荐。一起跟随小编过来看看吧。希望给大家一个参考2016-03-15
- 这篇文章主要介绍了让Div实现水平或垂直居中的相关方法,包括使用js来对实际产生的居中问题进行修正的方法,需要的朋友可以参考下2015-08-06
- 对于页面上的块级元素,只须定宽及设置margin:auto 0;即可在垂直上居中,但对于浮动的元素垂直居中是无效的。那么我们如何来处理这个问题呢,今天我们来探讨下。2014-09-12
- 之前看到很多人一直都问这个问题,不过当时我没当一回事,因为在 CSS 中要垂直居中,多数是在有高度的情况下,或者容器高度不定的情况下才用,看上去比较舒服,而且实现的2014-09-12
- 下面小编就为大家带来一篇不定宽高的文字在div中垂直居中实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-03-30
最新评论