zoukankan      html  css  js  c++  java
  • 闲聊CSS之关于clearfix--清除浮动[转]

    .clearfix:after {
     content: " ";
     display: block;
     clear: both;
     height: 0;
    }
    .clearfix {
     zoom: 1;
     display: table;
    }

    转载地址:http://www.imooc.com/wenda/detail/11605

    闲聊CSS之关于clearfix--清除浮动

    一,什么是.clearfix

    你只要到Google或者Baidu随便一搜"css清除浮动",就会发现很多网站都讲到"盒子清除内部浮动时可以用到.clearfix"。

    .clearfix:after {
     content: " ";
     display: block;
     clear: both;
     height: 0;
    }
    .clearfix {
     zoom: 1;
    }

    <div class="clearfix">
     <div class="floated"></div>
    </div>

    上面的代码就是.clearfix的定义和应用,简单的说下.clearfix的原理:

    1、在IE6, 7下zoom: 1会触发hasLayout,从而使元素闭合内部的浮动。

    2、在标准浏览器下,.clearfix:after这个伪类会在应用到.clearfix的元素后面插入一个clear: both的块级元素,从而达到清除浮动的作用。

    <div>
     <div class="floated"></div>
    </div>
    <div style="clear: both"></div>

    二,.clearfix的弊端

    在上面的代码中可以看到,抛开IE6, 7不谈,.clearfix在标准浏览器下插入了一个clear: both的元素,这样很可能清除掉不必要的浮动。举例来说明:

    <!DOCTYPE html>
    <html>
    <head>
     <title>Demo</title>
     <style type="text/css">
       html, body { padding: 0; margin: 0; }
       ul { margin: 0; padding: 0; } 
     
       .clearfix:after {
         content: " ";
         display: block;
         clear: both;
         height: 0;
       }
       .clearfix {
         zoom: 1;
       }
     
       .left-col {
         background: red;
         float: left;
          100px;
         height: 300px;
       }
       .right-col {
         margin-left: 100px;
       }
       .menu {
         border: 1px solid #000;
       }
       .menu li {
         float: left;
         display: block;
         padding: 0 1em;
         margin: 0 1em 0 0;
         background: #ccc;
       }
       .placeholder {
         background: yellow;
         height: 400px;
       }
     </style>
    </head>
    <body>
     <div class="left-col">
     </div>
     <div class="right-col">
       <ul class="menu">
         <li>Menu Item</li>
         <li>Menu Item</li>
         <li>Menu Item</li>
         <li>Menu Item</li>
         <li>Menu Item</li>
         <li>Menu Item</li>
       </ul>
       <div class="placeholder"></div>
     </div>
    </body>
    </html>

    上面的代码构成一个两列布局的页面。注意.menu这个菜单设置了边框,但是由于.menu的li元素是左浮动的,导致.menu没有高度,于是可以用.clearfix来清除.menu内部的浮动。代码如下:

    <ul class="menu clearfix">
     <li>Menu Item</li>
     <li>Menu Item</li>
     <li>Menu Item</li>
     <li>Menu Item</li>
     <li>Menu Item</li>
     <li>Menu Item</li>
    </ul>

    但是应用完.clearfix后,在标准浏览器下页面变得很乱,这是因为.clearfix:after把.left-col的浮动也给清除掉了。

    三,重构.clearfix

    在遭遇到上面的错误之后,分析一下除了.clearfix:after这种方式之外还有没有别的方法清除元素内部的浮动。答案是有的,在白话Block Formatting Contexts这篇文章中提到过构成Block Formatting Context的元素可以清除内部元素的浮动。那么只要使.clearfix形成Block Formatting Context就好了。构成Block Formatting Context的方法有下面几种:

    float的值不为none。overflow的值不为visible。display的值为table-cell, table-caption, inline-block中的任何一个。position的值不为relative和static。

    很明显,float和position不合适我们的需求。那只能从overflow或者display中选取一个。因为是应用了.clearfix和.menu的菜单极有可能是多级的,所以overflow: hidden或overflow: auto也不满足需求(会把下拉的菜单隐藏掉或者出滚动条),那么只能从display下手。

    我们可以将.clearfix的display值设为table-cell, table-caption, inline-block中的任何一个,但是display: inline-block会产生多余空白,所以也排除掉。剩下的只有table-cell, table-caption,为了保证兼容可以用display: table来使.clearfix形成一个Block Formatting Context,因为display: table会产生一些匿名盒子,这些匿名盒子的其中一个(display值为table-cell)会形成Block Formatting Context。这样我们新的.clearfix就会闭合内部元素的浮动。下面是重构之后的.clearfix。

    .clearfix {
     zoom: 1;
     display: table;
    }

    四,总结

    在IE6, 7下面只要是触发了hasLayout的元素就可以清除内部浮动了。而在标准浏览器下面清除元素内部浮动的方法有很多,除了.clearfix:after这种方式,其余的方法无非就是产生新的Block Formatting Context以达到目的。如果可以做到在什么条件下用哪种方法,我认为这样就足够了......

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/lixiangyong/p/4783670.html
Copyright © 2011-2022 走看看