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


      一,什么是.clearfix

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

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

      复制代码上面的代码就是.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就好了。

      构成BlockFormatting 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以达到目的。如果可以做到在什么条件下用哪种方法,我认为这样就足够了......

  • 相关阅读:
    Windows 创建 Redis 和 zookeeper 系统服务
    mysql 5.7 非正常安装,无法启动 服务没有报告任何错误
    将整个 project 资源打包
    使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
    所有子模块都要执行的checkstyle检查
    把项目通过maven生产源码包和文档包并发布到自己的私服上
    C#.NET常见问题(FAQ)-在VS程序如何取消.vshost的进程
    C#.NET常见问题(FAQ)-无法直接启动带有类库输出类型的项目怎么办
    C#.NET常见问题(FAQ)-VS如何整个项目中查找字符串
    C#.NET常见问题(FAQ)-如何在系统变量中加入新的环境变量
  • 原文地址:https://www.cnblogs.com/aobingyan/p/3832591.html
Copyright © 2020-2023  润新知