zoukankan      html  css  js  c++  java
  • CSS 水平居中,垂直居中

    CSS之居中

     
    CSS的居中会遇到很多种情况,不同的情况使用的方法不同。
     
     

    1.水平居中

        (1)文本、图片等行内元索的水平居中
        给父元素设置text-align: center可以实现文本、图片等行内元素的水平居中,如代码清单1所示。
    代码清单1      行内元素的水平居中 
    1. <style type="text/CSS"> 
    2.  .wrap{
    3. background:#000; 500px; height:100px; 
    4. margin-bottom:10px; color:#fff; text-align:center}  
    5. </style> 
    6. <div class="wrap">hello world</div> 
    7. <div class="wrap"><img src="test.gif" /></div> 

     效果如图1,图2所示:

    文本元素行内水平居中

    图1   文本元素行内水平居中

    图片元素行内水平居中
    图2   图片元素行内水平居中
     
     
        (2)确定宽度的块级元素的水平居中
        确定宽度的块级元素水平居中是通过设置margin-left:auto和margin.right:auto来实现的,如代码清单2所示。
       
     
    代码清单2      确定宽度的块级元素的水平居中  
    1.  <style type="text/CSS"> 
    2.  .wrap{background:#000; 500px; height:100px}  
    3.  .test{background:red; 200px; height:50px; margin-left:auto;  
    4. right:auto}  
    5. </style> 
    6. <div class="wrap"><div class="test"></div></div> 
    效果如图3所示。
    块级元素水平居中

    图3    块级元素水平居中
     

     
     
        (3)不确定宽度的块级元素的水平居中
        不确定宽度的块级元素有三种方式可以实现居中。以分页模块为例,因为分页的数量是不确定的,所以我们不能通过设置宽度来限制它的弹性。
     
     
    方法一如代码清单3所示。
     
     
        代码清单3     不确定宽度的块级元素的水平居中方法一
    1. <style type="text/CSS"> 
    2. ul{list-style:none; margin:0; padding:0}  
    3. table{margin-left:auto; margin-right:auto;}  
    4.  .test li{float:left; display:inline; margin-right:5px;}  
    5.  .test a{
    6. float:left; 20px; height:20px; text-align:center; 
    7. line- height:20px;   background:#316AC5;   
    8. color:#fff; border:1px solid #316AC5; text-decoration:none;}  
    9.  .test a:hover{background:#fff; color:#316AC5}  
    10. </style> 
    11. <div class="wrap"> 
    12.          <table><tbody><tr><td> 
    13.                           <ul class="test"> 
    14.                                 <li><a href="#">1</a></li> 
    15.                           </ul> 
    16.          </td></tr></tbody></table> 
    17.          <table><tbody><tr><td> 
    18.                           <ul class="test"> 
    19.                                 <li><a href-"#">1</a></li> 
    20.                                 <li><a href="#">2</a></li> 
    21.                                 <li><a href="#">3</a></li> 
    22.                           </ul> 
    23.          </td></tr></tbody></table> 
    24.          <table><tbody><tr><td> 
    25.                           <ul class="test"> 
    26.                                <li><a href="#">l</a></li> 
    27.                                <li><a href="#">2</a></li> 
    28.                                <li><a href-"#">3</a></li> 
    29.                                <li><a href="#">4</a></li> 
    30.                                <li><a href-"#">5</a></li> 
    31.                           </ul> 
    32.    </td></tr></tbody></table> 
    33. </div> 
     
     
    效果如图4所示
    不确定宽度的块级元素的水平居中
    图4   不确定宽度的块级元素的水平居中 
     
     
     
          方法一演示了有一个分页,三个分页和五个分页的情况下,分页模块都能居中的示例。ul标签是整个分页模块的根元素,它包含的li数量不确定,所以ul本身的宽度也没办法确定,不能通过设置固定宽度,margin-left:auto和margin-right:auto来实现居中。这里用到了一个有趣的标签table来帮助实现了不确定宽度的块级元素的水平居中,table有趣的地方在于它本身并不是块级元素,如果不给它设定宽度的话,它的宽度由内部元素的宽度“撑起”,但即使不设定它的宽度,仅设置margin-left:auto和margin-right:auto就可以实现水平居中!将ul包含在table标签内,对table设置margin-left:automargin-right:auto 就可以使table水平居中,间接使ul实现了水平居中。
     
        这种做法很巧妙,但缺点是增加了无语义标签,加深了标签的嵌套层数。
     
     
     
     
        方法二如代码清单4所示
     
     
        代码清单4      不确定宽度的块级元素的水平居中方法二
    1. <style type="text/CSS"> 
    2.   ul{list-style:none;margin:0;padding:0}  
    3.   .wrap{background:#000; 500px; height:100px}  
    4.   .test{text-align:center;padding:5px;}  
    5.   .test li{display:inline;}  
    6.   .test a{padding:2px 6px;background:#316AC5;color:#fff;
    7. border:1px solid #316AC5;text-decoration:none;}  
    8.   .test a:hover{background:#fff;color:#316AC5}  
    9. </style> 
    10. <div class="wrap"> 
    11. <ul class="test"> 
    12.           <li><a href="#">1</a></li> 
    13. </ul> 
    14. <ul class="test"> 
    15.           <li><a href="#">1</a></li> 
    16.           <li><a href="#">2</a></li> 
    17.           <li><a href-"#">3</a></li> 
    18. </ul> 
    19. <ul class="test"> 
    20.           <li><a href="#">1</a></li> 
    21.           <li><a href="#">2</a></li> 
    22.           <li><a href="#">3</a></li> 
    23.           <li><a href="#">4</a></li> 
    24.           <li><a href="#">5</a></li> 
    25. </ul> 
    26. </div> 
     
     
      效果如图4所示。
     
     
     
       方法二换了种思路,改变块级元素的display为inline类型,然后使用text-align:center来实现居中。相较于方法一,它的好处是不用增加无语义标签,简化了标签的嵌套深度,但它也存在一定问题:它将块级元素的display类型改为inline,变成了行内元素,而行内元素比起块级元素缺少一些功能,比如设定长宽值,在某些特殊需求的CSS设置中,这种方法可能会带来一些限制。
      
     
     
      方法三如代码清单5所示
     
     
        代码清单5      不确定宽度的块级元素的水平居中方法三
     
    1. <style type="text/CSS"> 
    2.    ul{list-style:none; margin:0; padding:0}  
    3.    .wrap{background:#000; 500px; height:100px}  
    4.    .test{clear:both; padding-top:5px; float:left; position:relative; left:50%;}  
    5.    .test li{float:left; display:inline; margin-right:5px; position:relative; left:-50%;}  
    6.    .test  a{float:left; 20px; height:20px; 
    7. text-align:center; line- height:20px;   
    8. background:#316AC5;   color:#fff;   
    9. border:1px solid #316AC5; text-decoration:none;}  
    10.    .test a:hover{background:#fff; color:#316AC5}  
    11.        </style> 
    12. <div class="wrap"> 
    13.      <ul class="test"> 
    14.          <li><a href="#">1</a></li> 
    15. </ul> 
    16. <ul class="test"> 
    17.          <li><a href="#">1</a></li> 
    18.          <li><a href="#">2</a></li> 
    19.          <li><a href="#">3</a></li> 
    20. </ul> 
    21. <ul class="test"> 
    22.          <li><a href="#">1</a></li> 
    23.          <li><a href="#">2</a></li> 
    24.          <li><a href="#">3</a></li> 
    25.          <li><a href="#">4</a></li> 
    26.          <li><a href="#">5</a></li> 
    27. </ul> 
    28. </div> 
     
        效果如图4所示
     
     
     
        方法三通过给父元素设置float,然后父元素设置position:relative和left:50%,子元素设置position:relative和left:-50%来实现水平居中。它可以保留块级元素仍以display:block的形式显示,而且不会添加无语义标签,不增加嵌套深度,但它的缺点是设置了position:relative,带来了一定的副作用。
     
     
     
        这三种方法使用得都非常广泛,各有优缺点,具体选用哪种方式可以视具体情况而定。
     
     
     

        2.竖直居中

        (1)父元素高度不确定的文本、图片、块级元素的竖直居中
        父元素高度不确定的文本、图片、块级元素的竖直居中是通过给父容器设置相同上下边距实现的,如代码清单6所示。
     
     
        代码清单6      父元素高度不确定的文本、图片、块级元素的竖直居中
    1.  <style type="text/CSS"> 
    2.  .wrap{background:#000;   500px;   
    3. color:#fff;   margin-bottom:10px; 
    4. padding-top:20px; padding-bottom:20px}  
    5.  .test{200px;height:50px;background:red;}  
    6. </style> 
    7. <div class="wrap">hello world</div> 
    8. <div class="wrap"><img src="54.gif" /></div> 
    9. <div class="wrap"><div class="test"></div></div> 


     

     
    果如图5,图6,图7所示
    文本垂直居中
     图5   文本垂直居中
     
    图片垂直居中
     图6   图片垂直居中
     
    块级元素垂直居中
    图7   块级元素垂直居中
     
     
     
        (2)父元素高度确定的单行文本的竖直居中
        父元素高度确定的单行文本的竖直居中,是通过给父元素设置line-height来实现的,line-height值和父元素的高度值相同,如代码清单7所示。
     
     
        代码清单7      父元素高度确定的单行文本的竖直居中 
    1. <style type-"text/CSS"> 
    2.  .wrap{background:#000;   500px;   color:#fff;height:100px;line- height:100px;}  
    3. </style> 
    4. <div class="wrap">hello world</div> 
     
    效果如图8所示。
     父元素高度确定的单行文本的竖直居中

    图8     父元素高度确定的单行文本的竖直居中
     

     
        (3)父元素高度确定的多行文本、图片、块级元素的竖直居中
        父元素高度确定的多行文本、图片、块级元素的竖直居中有两种方法。
     
     
        方法一:说到竖直居中,CSS中有一个用于竖直居中的属性vertical-align,但只有 当父元素为td或者th时,这个vertical-align属性才会生效,对于其他块级元素,例如 div、p等,默认情况下是不支持vertical-align属性的。在Firefox和IE 8 下,可以设置块级元素的display类型为table-cell,激活vertical-align属性,但IE 6和IE 7并不支持display:table-cell,所以这种方法没办法跨浏览器兼容。但我们可以使用最原始的笨方法来实现兼容——既然不支持块级元素设置为display:table-cell来模拟表格,那么,我们就直接使用表格好了。如代码清单8所示。其效果如图5,图6,图7所示。
     
     
        代码清单8     父元素高度确定的多行文本、图片、块级元素的竖直居中方法一
    1. <style type="text/CSS"> 
    2. .wrap{background:#000; 500px; color:#fff;height:100px} 
    3. .test{200px;height:50px;background:red;}  
    4. </style> 
    5. <table><tbody><tr><td class="wrap"> 
    6. hello world<br /> 
    7. hello world<br /> 
    8. hello world  
    9. </td></tr></tbody></table> 
    10.  
    11. <table><tbody><tr><td class="wrap"> 
    12. <img src="54.gif" /> 
    13. </td></tr></tbody></table> 
    14.  
    15. <table><tbody><tr><td class="wrap"> 
    16. <div class="test"></div> 
    17. </td></tr></tbody></table> 
     
     
     
     
        因为td标签默认情况下就隐式地设置了vertical-align的值为middle,所以我们不需要再显式地设置一遍。
     
       方法一可以很好地实现竖直居中效果,且不会带来任何样式上的副作用,但它添加了无语义标签,并增加了嵌套深度。
     
     
     
     
        方法二:对支持display:table-cell的IE 8和Firefox用display:table-cell和vertical- align:middle来实现居中,对不支持display:table-cell的IE 6和IE 7,使用特定格式的hack,如代码清单9所示。其效果如图5,图6,图7所示。


     

     
    代码清单9    父元素高度确定的多行文本、图片、块级元素的竖直居中方法二
    1. <style type="text/CSS"> 
    2.  .mblO{margin-bottom:10px}  
    3.  .wrap{background:#000; 500px; color:#fff;margin-bottom:10px;height:100px;
    4. display:table-cell;vertical-align:iddle;
    5. *position:relative}  
    6.  .test{200px;height:50px;background:red}  
    7.  .verticalWrap{*position:absolute;*top:50%}  
    8.  .vertical{*position:relative;*top:-50%}  
    9. </style> 
    10. <div class="mblO"> 
    11.     <div class="wrap"> 
    12.           <div class="verticalWrap''> 
    13.                    <div class="vertical"> 
    14.                                   hello world<br /> 
    15.                                   hello world<br /> 
    16.                                   hello world  
    17.                    </div> 
    18.           </div> 
    19.     </div> 
    20.  </div> 
    21.  <div class="mblO"> 
    22.           <div class="wrap"> 
    23.                     <div class="verticalWrap"> 
    24.                              <img src="54.gif" class="vertical" /> 
    25.                     </div> 
    26.           </div> 
    27.  </div> 
    28.  <div class="mb10"> 
    29.           <div class="wrap"> 
    30.                     <div class="verticalWrap" > 
    31.                               <div class="test vertical"></div> 
    32.                      </div> 
    33.           </div> 
    34.  </div> 
     
        方法二.利用hack技术区别对待Fire fox、IE 8和IE 6、IE 7,在不支持display:table- cellIE 6和IE 7 F,通过给父子两层元素分别设置top:50%和top:-50%来实现居中。这种方法的好处是没有增加额外的标签,但它的缺点也很明显,一方而它使用了hack.不利于维护,另一方面,它需要设置position:relative和position:absolute,带来了副作用。
  • 相关阅读:
    手写一个call、apply、bind
    setTimeout
    meta标签及Keywords
    用VSCode插件来一键填满Github的绿色格子吧-AutoCommit
    前端工具-定制ESLint 插件以及了解ESLint的运行原理
    JS基础-全方面掌握继承
    JS基础-该如何理解原型、原型链?
    前端中等算法-无重复字符的最长子串
    前端面试 js 你有多了解call,apply,bind?
    博客图片失效?使用npm工具一次下载/替换所有失效的外链图片
  • 原文地址:https://www.cnblogs.com/csdttnk/p/2848407.html
Copyright © 2011-2022 走看看