• 技术文章 >web前端 >css教程

    整理的最全的css clearfix清除浮动的方法

    PHPzhongPHPzhong2017-03-17 16:25:55原创2760
    CSS中经常使用clearfix清除浮动,作者列出了几个clearfix的不同的使用方法进行对比,需要的朋友可以参考下css clearfix清除浮动的方法.(css为什么要清除浮动(float)? 清除浮动的原理是什么)

    一,什么是.clearfix

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

    .clearfix:after {
      content: " ";
      display: block;
      clear: both;
      height: 0;
    }
    .clearfix {
      zoom: 1;
    }<p class="clearfix">
      <p class="floated"></p>
    </p>

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

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

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

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

    二,.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;
          width: 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>
      <p class="left-col">
      </p>
      <p 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>
        <p class="placeholder"></p>
      </p>
    </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和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;
      width: 100%;
    }

    四,总结

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

    更多关于css clearfix清除浮动的方法的相关文章,请关注php中文网

    相关文章:

    深入解析clearfix清除浮动

    css之clearfix的用法深入理解

    浅谈css清除浮动clearfix和clear的用法介绍

    CSS之关于clearfix清除浮动方法

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:css clearfix 浮动
    上一篇:css常用属性伪元素和伪元素的总结 下一篇:css为什么要清除浮动(float)? 清除浮动的原理是什么
    php培训_php实战培训【立即报名】-php中文网第20期

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• CSS变量是怎么工作的?如何使用内联CSS变量进行布局?• 一文了解CSS3中的新属性object-view-box• css3怎样实现不是直角的菱形效果• css样式中有文字描边吗• 12个值得收藏的 CSS 技巧!!
    1/1

    PHP中文网