使用CSS使内容垂直居中的N中方法。

使用css+div使页面内容水平居中的方法大家并不陌生,那么如何使内容垂直居中呢?

OK,下面进入正题,不如我们使用做高中数学题时经常用的思想:分情况讨论。

1.当待垂直居中的DIV高宽为已知时:

  1.1绝对定位法:

  CSS:

    

    .middle-div{
          width:300px;
          height:200px;
          position:absolute;
          left:50%;
          top:50%;
          margin:-100px 0 0 -150px
     }
    .parent-div{
          position:relitive;
     }

  html:

    

    

    <div class="parent-div">
        <div class="middle-div">
            <p>我是个高度已知的DIV,我里面的内容可以垂直+水平居中吗?</p>
        </div>
    </div>

此方法即实现了水平居中,也实现了垂直居中。但是限制颇多,最显著的缺陷是使用了绝对定位,居中的DIV脱离了流布局,故而这种方法应用在弹出居中panel时使用较多,配合jquery:

    

    $(".mydiv").css({
               position: "absolute",
               left: ($(window).width() - $(".mydiv").outerWidth())/2,
               top: ($(window).height() - $(".mydiv").outerHeight())/2
     });  

  1.2外补DIV法:

  CSS:

    

    .floater{
        float:left;
        height:50%;
        margin-bottom:-120px;
    }
    .middle-div{
        clear:both;
        height:240px;
        position:relitive;
        background:#eee;
    }

  html:

    

    <div class="floater"></div>
    <div class="middle-div"></div>

  1.3 margin:auto法

  CSS:

   

    

    #content {
        position:absolute;
        top:0;
        bottom:0;
        left:0;
        right:0;
        margin:auto;
        height:240px;
        width:70%;
        background:#eee;
    }
        

  html:

 <div id="content"> </div>

该方法比较简单,遗憾的是在IE6-7下是无效的。


2.当待垂直居中的对象为单行文本或图片,高宽未知时(line-height法):
     大家公认的最简洁有效的方法:设置容器height与line-height相等,另外,加上overflow:hidden防止意外发生(此处指的容器内字体大于容器高度时的意外)。

  CSS:

  
    p.middle-p{
        font:bold 12px/24px Helvertica,Arial,sans-serif;
        overflow:hidden;
    }
     .demo{
        height:24px;
        color:#fff;
        background:#a5a5a5;
        font:bold 12px Helvertica,Arial,sans-serif;
    }

  html:

  
    <p class="demo middle-p">
        文本垂直在P中居中。去掉class中的”middle-p“,再看看效果是什么?添上”middle-p“设置字体大小为30px,看看有什么效果,去掉overflow之后呢?
    </p>
    

     该方法的缺点是只支持单行,且当<p>中为纯文字时,兼容各浏览器;当<P>中只有图片时,IE7+可使图片垂直居中。然而在FF,chrome和IE6均无效;当<p>中有图片和文字时,在IE6中无效,在IE7+,FF,Chrome下有效。
     让我们试着解决只有图片时,在FF,Chrome等现代浏览器下无效的情况,在上述CSS中增加:
  CSS:

    p:after{
        content:‘,‘;
        font-size:1px;
        visibility:hidden;
    }


  html:

    
    <p class="demo middle-p">
        <img src="http://img.sootuu.com/vector/2006-4/2006419181421600.jpg" height="12px" width="12px">
    </p>


     OK!只有图片时在FF,Chrome下也可以垂直居中了!

3.当待垂直居中的对象为多行文本或其它,高宽未知时:  3.1当容器高度不固定时(padding法):
  为容器添加CSS:    
    .middle-div{
          padding:20px 5px;
          background:#eee;
     }

    html:    
    <div class="middle-div">
        <p>你好,我在DIV中垂直居中。</p>
        <p>你好,我在DIV中垂直居中。</p>
        <p>你好,我在DIV中垂直居中。</p>
        <p>你好,我在DIV中垂直居中。</p>
    </div>

    <div class="middle-div">
        <img src="http://img.sootuu.com/vector/2006-4/2006419181421600.jpg">
    </div>

     使容器padding上下相等,这是最简单的一种方法。支持各浏览器。

  3.2当容器高度固定时(display:table-cell法):
     你仍然可以使用padding,不过你需要清楚知道内容的高度和精确的数学计算...这显然是不可取的。
     那么当容器高度固定,待垂直居中的内容又是多行时,该如何去做呢?
     一种有效的做法是将容器display:table-cell,然后使用td,th,caption等标签专有属性:vertical-align:middle;
    CSS:
  
    .middle-div{

          display:table-cell;

          vertical-align:middle;

          height:500px;

          background:#eee;

     }

    html:
  
    <div class="middle-div">

          <p>我想垂直居中,在一个固定高度的DIV中,可以吗?</p>

          <p>我想垂直居中,在一个固定高度的DIV中,可以吗?</p>

          <p>我想垂直居中,在一个固定高度的DIV中,可以吗?</p>

     </div>

     Great!在IE8+,FF,Chrome下确实有效。遗憾的是IE6-7仍然无法垂直居中,因为IE6-7并不认识:table-cell属性,将其自动忽略了。
     也许你会想使用table布局,这样不就可以兼容IE6-7了吗。不要试图这样做,因为使用table进行页面布局早已不被赞成。html标签是负责语义的,而不是样式。不要灰心,想让内容在IE6-7下垂直居中不妨试试这种方法:
    CSS:
  
    .parent{

          height:500px;

          position:relative;

          background:#eee;

     }

     .sub-parent{

          position:absolute;

          top:50%;     

     }

     .middle-div{

          position:relative;

          top:-50%;

     }

    html:
  
    <div class="parent">

          <div class="sub-parent">

               <div class="middle-div">

                    <p>我能垂直居中吗?</p>

                    <p>我能垂直居中吗?</p>

                    <p>我能垂直居中吗?</p>

               </div>

          </div>

     </div>

     让人心塞的是这种方法只在IE6-7下可行,在IE8+以及FF等现代浏览器下效果反而差强人意。为什么呢?是middle-div的top:-50%出了问题。由于父容器的高度根据子容器高度计算出来的,导致-50%无效。可能的解决办法:middle-div的top:-(使用JS得出sub-parent的高度/2)px.
     如果你了解一些CSS hack的技巧,结合上面的display:table-cell方法,那么一个完美的垂直居中方案将会诞生:
    html与上一致;
    CSS:    
    .parent{

          height:500px;

          display:table-cell;

          vertical-align:middle;

          *position:relative;

          background:#eee;

     }

     .sub-parent{

          *position:absolute;

          *top:50%;     

     }

     .middle-div{

          *position:relative;

          *top:-50%;

     }



     在浏览器中看一下效果吧!这个方法看起来还不错,如果非要找一个缺点,那就是DIV嵌套多了一点.
     当允许使用JS时,完全可以动态获得内容的高度,然后结合display:table-cell和margin-top:-(height/2)px来解决。从而避免了多层嵌套.具体方法见1.1

4.小结

  使用CSS布局尤其需要注意浏览器的兼容,一个垂直居中让我初窥各浏览器兼容混战的冰山一角。  想要掌握垂直居中,至少要了解display,position,margin,veritcla-align,line-height,padding以及float,CSS hack等知识。CSS的知识王国不就是一个个小问题堆积出来的吗?  上述只是部分方法,可能存在错误和纰漏,欢迎指正~
时间: 2024-12-24 15:04:57

使用CSS使内容垂直居中的N中方法。的相关文章

使用CSS使内容垂直居中的N中方法

用css+div使页面内容水平居中的方法大家并不陌生,那么如何使内容垂直居中呢? OK,下面进入正题,不如我们使用做高中数学题时经常用的思想:分情况讨论. 1.当待垂直居中的DIV高宽为已知时: 1.1绝对定位法: CSS: .middle-div{ width:300px; height:200px; position:absolute; left:50%; top:50%; margin:-100px 0 0 -150px } .parent-div{ position:relitive;

CSS总结div中的内容垂直居中的五种方法

文章目录 一.行高(line-height)法 二.内边距(padding)法 三.模拟表格法 四.CSS3的transform来实现 五:css3的box方法实现水平垂直居中 六:flex布局(2018/04/17补充) 一.行高(line-height)法 如果要垂直居中的只有一行或几个文字,那它的制作最为简单,只要让文字的行高和容器的高度相同即可,比如: p { height:30px; line-height:30px; width:100px; overflow:hidden; } 这

CSS 使元素垂直居中

重点内容:负外边距,绝对垂直居中,box 拓展点:设置inline-block,使元素居中 1.实现文字居中对齐 水平居中:text-align:center 垂直居中:设置line-height和height一样 2.实现元素居中对齐 使用元素定位,并移动元素  方法1:负外边距法(兼容IE) 原理:使用绝对定位,定位元素left和top值都为50%:然后使用margin移动负的元素半宽高 条件:需要知道当前元素的宽高. 代码: #content1{ position: relative; w

CSS教程:div垂直居中的N种方法[转]

在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中的确是有vertical-align属性,但是它只对(X)HTML元素中拥有valign特性的元素才生 效,例如表格元素中的<td>.<th>.<caption>等,而像<div>.<span>这样的元素是没有valign特性的,因此使用vertic

CSS教程:div垂直居中的N种方法以及多行文本垂直居中的方法

在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中的确是有vertical-align属性,但是它只对(X)HTML元素中拥有valign特性的元素才生 效,例如表格元素中的<td>.<th>.<caption>等,而像<div>.<span>这样的元素是没有valign特性的,因此使用vertic

css设置元素垂直居中的几个方法

最近有人问我怎么设置元素垂直居中?我....(这么基础的东西都不会?我有点说不出话来),  不过还是耐心的教了他几个方法,好吧教完他们,顺便把这些方法整理一下 第一种:通过设置成为表格元素的方式来实现垂直居中 (适应于父级有固定高度的元素) 第一步,写html代码,如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>元素垂直居中</title&

css使div垂直居中

<h3>css+div使div块元素垂直居中</h3>

css 实现元素水平垂直居中总结5中方法

个人总结,如有错误请指出,有好的建议请留言.o(^▽^)o 一.margin:0 auto:text-align:center:line-height方法 1 <div id="divAuto">margin,text-align;水平居中</div> 1 /* 2 margin:0 auto; 设置块元素(或与之类似的元素)的水平居中 3 text-align:center;设置文本或img标签等一些内联对象(或与之类似的元素)的水平居中 4 line-hei

用纯css使内容永远居在页面底部

在wap开发中,经常会有各种屏幕尺寸logo居页面底部的需求,内容大于一屏时logo跟在内容后面,内容小于一屏时,logo在当屏底部. 之前用过js,但是页面渲染中会有闪跳,效果不理想 方法一:用一个高度大于等于底部内容的空白块填充在全局块,让底部内容距离全局块自身高度的负值,这个方法比较保险,对各种浏览器都适用 方法二:让全局中最底的元素设置一个padding-bottom,值大于等于底部内容 方法三:用calc()函数,这个方法有些浏览器还不支持,并不是个完美的方法,虽然代码最简洁 此外,如