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

时间: 2024-08-03 03:51:44

css利用clearfix方法清除浮动详解的相关文章

彻底理解浮动float CSS浮动详解 清除浮动的方法

原文:彻底理解浮动float CSS浮动详解 清除浮动的方法  我们把网页的常用的布局格式分为以下三种:   1.标准流.  所谓的标准流就是,行内元素自己单独一行,而块级元素是上下显示的. 以前我们学习的都是标准流.   注意:标准流使我们网页布局中最稳定的一种结构       2. 浮动流  使我们学习的脱离标准流的第一种方式.会影响我们标准流的排列.所以,我们布局的时候,能用标准流做的,就不用浮动做.       3. 定位流   定位流也是脱离标准流的一种模式.它完全脱离标准流,不会对标

HTML中的CSS盒子模型边界(box-model)问题详解

HTML中的元素我们把他分为一个一个的盒子,盒子里面可以再放盒子,也可以放置文本,默认情况下,我们给盒子设置maring.padding和border的时候,不管设置的是什么单位的值,这些值都会计算在盒子的总体面积以内,这虽然是很基础的CSS技术,但是很多编写代码的人却不甚了解,导致网页错位却不知道怎么解决. HTML中的CSS盒子模型边界(box-model)问题详解 我一直到很不喜欢CSS和填充间距边框的关系,你忙着去定义宽度来满足你的网格布局比例,然后接下来你开始添加文本和设置适量的间距和

JavaScript中reduce()方法的使用详解

  这篇文章主要介绍了JavaScript中reduce()方法的使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下 JavaScript 数组reduce()方法同时应用一个函数针对数组的两个值(从左到右),以减至一个值. 语法 ? 1 array.reduce(callback[, initialValue]); 下面是参数的详细信息: callback : 函数执行在数组中每个值 initialValue : 对象作为第一个参数回调的第一次调用使用 返回值: 返回数组的减少单一个值

JavaScript中String.match()方法的使用详解

  这篇文章主要介绍了JavaScript中String.match()方法的使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下 此方法用于当匹配针对正则表达式的字符串来检索匹配. 语法 ? 1 string.match( param ) 下面是参数的详细信息: param : 正则表达式对象 返回值: 如果正则表达式不包括g标志,返回的结果相同于regexp.exec(string) 如果正则表达式包含g标志,则该方法返回一个包含所有匹配的数组 例子: ? 1 2 3 4 5 6 7

JavaScript中toString()方法的使用详解

  这篇文章主要介绍了JavaScript中toString()方法的使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下 JavaScript Boolean.toSource()方法返回表示对象的源代码的字符串. 注意:此方法不会在Internet Explorer中运行. 语法 ? 1 boolean.toSource() 下面是参数的详细信息: NA 返回值 返回表示对象的源代码的字符串. 例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1

JavaSacript中charCodeAt()方法的使用详解

  这篇文章主要介绍了JavaSacript中charCodeAt()方法的使用详解,是JS入门学习中的基本知识,需要的朋友可以参考下 该方法返回一个数字,表示给定索引处的字符的Unicode值. Unicode码点范围为0到1114111.前128个Unicode码点的ASCII字符编码的直接匹配.charCodeAt()将始终返回一个值小于65,536. 语法 ? 1 string.charCodeAt(index); 下面是参数的详细信息: index: 0和1之间小于字符串的长度的整数;

Python中tell()方法的使用详解

  这篇文章主要介绍了Python中tell()方法的使用详解,是Python入门学习中的基础知识,需要的朋友可以参考下 tell()方法返回的文件内的文件读/写指针的当前位置. 语法 以下是tell()方法的语法: ? 1 fileObject.tell() 参数 NA 返回值 此方法返回该文件中读出的文件/写指针的当前位置. 例子 下面的例子显示了tell()方法的使用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #

Eclipse中改变默认的workspace的方法及说明详解_java

eclipse中改变默然的workspace的方法可以有以下几种: 1.在创建project的时候,手动选择使用新的workspace,如创建一个web project,在向导中的Location选项,取消使用"Use default location",同时在下面选择新的workspace. 2.在file菜单中选择switch workspace项,即可选择一个新的workspace 3.在eclipse安装目录下configuration/.settings目录下的 org.ec

数据-java中android中onTouchEvent方法的问题详解,谢谢解答!

问题描述 java中android中onTouchEvent方法的问题详解,谢谢解答! public boolean onTouchEvent(MotionEvent event) { //调用warp方法根据触摸屏事件的座标点来扭曲verts数组 warp(event.getX(), event.getY()); return true; } //MotionEvent event这两个哪个是数据类型,哪个是数值 //event.getX(), event.getY() 返回的是什么值是什么数