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

本文转自:http://www.missage.com/1220.html

原文連結:http://www.45eggs.com/xhtml-css/2011/css-clearfix.html

CSS之关于clearfix--清除浮动的更多相关文章

  1. [笔记]使用clearfix清除浮动

    转载自奶牛博客 .clearfix { *zoom: 1; } .clearfix:before, .clearfix:after { display: table; line-height: 0; ...

  2. css用clearfix清除浮动

    本文从http://www.studyofnet.com/news/196.html复制.   本文导读:写css 时总为浮动而烦恼,如果用了浮动,浮动的父层不会跟着浮动框的高度增加而增加,在Fire ...

  3. clearfix清除浮动进化史

    我想大家在写CSS的时候应该都对清除浮动的用法深有体会,今天我们就还讨论下clearfix的进化史吧. clearfix清除浮动 首先在很多很多年以前我们常用的清除浮动是这样的. .clear{cle ...

  4. clearfix清除浮动

    首先在很多很多年以前我们常用的清除浮动是这样的. 1 .clear{clear:both;line-height:0;} 现在可能还可以在很多老的站点上可以看到这样的代码,相当暴力有效的解决浮动的问题 ...

  5. clear-fix清除浮动的两种写法

    1. [代码]clearfix 清除浮动 .clearfix:after { content: "."; display: block; height: 0; font-size: ...

  6. CSS - clearfix清除浮动

    首先,我们来解释一下为什么要使用 clearfix(清除浮动). 通常我们在写html+css的时候,如果一个父级元素内部的子元素是浮动的(float),那么常会发生父元素不能被子元素正常撑开的情况, ...

  7. css中clearfix清除浮动的用法及其原理示例介绍

    clearfix的定义: .clearfix:after {}{ content: "."; /**//*内容为“.”就是一个英文的句号而已.也可以不写.*/ display: b ...

  8. [Web 前端] CSS篇之2. 清除浮动,什么时候需要清除浮动,清除浮动都有哪些方法

    cp: https://blog.csdn.net/zengyonglan/article/details/53304487 2. 清除浮动,什么时候需要清除浮动,清除浮动都有哪些方法 ? 一.什么时 ...

  9. CSS 小结笔记之清除浮动

    浮动是一个非常好用的属性,但是有时会出现一些问题,需要进行清除浮动.例如 <!DOCTYPE html> <html lang="en"> <head ...

  10. CSS(7)--- 通俗讲解清除浮动

    CSS(7)--- 通俗讲解清除浮动 上一篇讲了CSS浮动 博客地址:CSS(6)---通俗讲解浮动(float) 一.理解清除浮动 1.为什么要清除浮动 我们前面说过,浮动本质是用来做一些文字混排效 ...

随机推荐

  1. 【http】

    var qs = require('querystring') require('http').createServer(function(req, res) { //res.writeHead(20 ...

  2. 使用SQL Server 2014内存数据库时需要注意的地方

    作者 王枫发布于2014年7月4日 本文从产品设计和架构角度分享了Microsoft内存数据库方面的使用经验,希望你在阅读本文之后能够了解这些新的对象.概念,从而更好地设计你的架构. 内存数据库,指的 ...

  3. 【转】Ubuntu下配置samba服务器--不错

    原文网址:http://my.oschina.net/junn/blog/171388 设置虚拟机的网络方式为桥接方式: 一. samba的安装: sudo apt-get insall samba  ...

  4. jQuery Ajax 全解析

    转自:http://www.cnblogs.com/qleelulu/archive/2008/04/21/1163021.html 本文地址: jQuery Ajax 全解析 本文作者:QLeelu ...

  5. 浅谈pageobject模式

    先来看两段代码 代码1: package com.zlshuo.selenium.nonaming.pageobject; /** * @author leshuo * @version 2014年5 ...

  6. selenium webdriver(4)---模拟鼠标键盘操作

    webdriver提供Actions来模拟鼠标悬浮.拖拽和键盘输入等操作,详细代码见org.openqa.selenium.interactions.Actions.本文通过几个实例来说明Action ...

  7. PHPcurl抓取AJAX异步内容(转载)

    PHPcurl抓取AJAX异步内容 其实抓ajax异步内容的页面和抓普通的页面区别不大.ajax只不过是做了一次异步的http请求,只要使用firebug类似的工具,找到请求的后端服务url和传值的参 ...

  8. Kia's Calculation(HDU 4267)

    Problem Description Doctor Ghee is teaching Kia how to calculate the sum of two integers. But Kia is ...

  9. hdoj 1869 六度分离【最短路径求两两边之间最长边】

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. Power of Cryptography

    //只用一行核心代码就可以过的天坑题目............= = 题目: Description Current work in cryptography involves (among othe ...