CSS中使用clearfix清除浮动的方法

   首先在很多很多年以前我们常用的清除浮动是这样的。

  CSS Code复制内容到剪贴板

  .clear{clear:both;line-height:0;}

  现在可能还可以在很多老的站点上可以看到这样的代码,相当暴力有效的解决浮动的问题。但是这个用法有一个致命伤,就是每次清除浮动的时候都需要增加一个空标签来使用。

  这种做法如果在页面复杂的布局要经常清楚浮动的时候就会产生很多的空标签,增加了页面无用标签,不利于页面优化。但是我发现大型网站中 居然还在使用这种清楚浮动的方法。有兴趣的同学可以上他们首页搜索一下他们的.blank0这个样式名称。

  因此有很多大神就研究出了 clearfix 清除浮动的方法,直接解决了上面的缺陷,不需要增加空标签,直接在有浮动的外层加上这个样式就可以了,这也是我们今天要讨论的clearfix进化史。

  起源

  CSS Code复制内容到剪贴板

  .clearfix:after {

  visibility: hidden;

  display: block;

  font-size: 0;

  content: " ";

  clear: both;

  height: 0;

  }

  .clearfix { display: inline-table; }

  * html .clearfix { height: 1%; }//Hides from IE-mac

  .clearfix { display: block; }//End hide from IE-mac

  解释一下以上的代码:

  对大多数符合标准的浏览器应用第一个声明块,目的是创建一个隐形的内容为空的块来为目标元素清除浮动。

  第二条为clearfix应用 inline-table 显示属性,仅仅针对IE/Mac。利用 * 对 IE/Mac 隐藏一些规则:

  height:1% 用来触发 IE6 下的haslayout。

  重新对 IE/Mac 外的IE应用 block 显示属性。

  最后一行用于结束针对 IE/Mac 的hack。(是不是觉得很坑爹,Mac下还有IE)

  起源代码可能也是很早期的时候了,再往后Mac下的IE5也发展到IE6了,各种浏览器开始向W3C这条标准慢慢靠齐了。所以就有了下面这个写法出现了。

  CSS Code复制内容到剪贴板

  .clearfix:after {

  visibility: hidden;

  display: block;

  font-size: 0;

  content: " ";

  clear: both;

  height: 0;

  }

  * html .clearfix { zoom: 1; } /* IE6 */

  *:first-child+html .clearfix { zoom: 1; } /* IE7 */

  IE6 和 IE7 都不支持 :after 这个伪类,因此需要后面两条来触发IE6/7的haslayout,以清除浮动。幸运的是IE8支持 :after 伪类。因此只需要针对IE6/7的hack了。

  在一个有float 属性元素的外层增加一个拥有clearfix属性的div包裹,可以保证外部div的height,即清除"浮动元素脱离了文档流,包围图片和文本的 div 不占据空间"的问题。

  Jeff Starr 在这里针对IE6/7用了两条语句来触发haslayout。我在想作者为什么不直接用 * 来直接对 IE6/7 同时应用 zoom:1 或者直接就写成:

  CSS Code复制内容到剪贴板

  .clearfix:after {

  visibility: hidden;

  display: block;

  font-size: 0;

  content: " ";

  clear: both;

  height: 0;

  }

  .clearfix{*zoom:1;}

  但是对于很多同学这种优化程度代码还是不够给力,clearfix 发展到现在的两个终极版。

  重构clearfix浮动

  构成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就会闭合内部元素的浮动。

  后面又有人对此进行了改良:

  终极版一:

  CSS Code复制内容到剪贴板

  .clearfix:after {

  content:"200B";

  display:block;

  height:0;

  clear:both;

  }

  .clearfix {*zoom:1;}/*IE/7/6*/

  解释下:content:"200B";这个参数,Unicode字符里有一个“零宽度空格”,即 U+200B,代替原来的“.”,可以缩减代码量。而且不再使用visibility:hidden。

  终极版二:

  CSS Code复制内容到剪贴板

  .clearfix:before,.clearfix:after{

  content:"";

  display:table;

  }

  .clearfix:after{clear:both;}

  .clearfix{

  *zoom:1;/*IE/7/6*/

  }

  这两个终极版代码都很简洁,终极版一和二都可以使用,以上代码都经过测试,大家赶紧用一下吧,如果有什么问题请及时跟我反馈,如果你还停留在clearfix的老代码的时候就赶紧更新一下代码吧。

时间: 2024-12-26 00:11:27

CSS中使用clearfix清除浮动的方法的相关文章

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

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

一个老外弄的Clearing floats(清除浮动的方法)_经验交流

我常用的都是clear:both;方法,如 <div style="clear:both">    <div style="float:left"></div>   <div style="float:right"></div> </div> 今在PlanABC看到另外这种方法,特些记录下来. div.container {  border: 1px solid #00000

CSS中通过import方式导入的方法

在高性能网站设计的第五章,我简要的提到@import 对于网站的性能有某些负面的影响,然后我在 Web 2.0 Expo 的演讲上深入探讨了这个问题,并创建了一些测试页面和HTTP瀑布状图表,这些在下面将会用到.对于这个问题的底线是:如果你想样式表并行载入,以使页面更快,请使用LINK 替代@import. LINK vs. @import 大家都知道,有两种方法可以在你的页面中导入样式文件.你可以使用LINK标签:  <link rel='stylesheet' href='a.css' />

几种css 清除浮动的方法

1.采用伪类:after进行后续空制的高度位零的伪类层清除 2.采用css overflow:auto的方式撑高 3.采用css overflow:hidden的方式产生怪异适应 4.采用display:table将对象变成table形式 5.采用div标签,以及css的clear属性 6.采用br标签,以及css的clear属性 7.采用br标签,以及其自身html的clear属性 粗略的看,他们都能将问题解决:然而他们另外一方面又有着各自的利弊.(一一对应) 1.优点结构语义化完全正确,不会

css中div百分比垂直居中几种方法

前言 我们都知道,固定高宽的div在网页中垂直居中很简单,相信大家也很容易的写出来,但是不是固定高宽的div如何垂直居中呢?我们在网页布局,特别是手机等web端网页经常是不固定高宽的div,那么这些div如何垂直居中呢?这篇文章,我总结一下. 固定高宽div垂直居中 如上图,固定高宽的很简单,写法如下:  代码如下 复制代码  position: absolute;  left: 50%;  top: 50%; width:200px; height:100px; margin-left:-10

css中元素水平垂直居中4种方法介绍

  table-cell轻松设置文本图片水平垂直居中 让一个元素垂直居中的思路:把这个元素的容器设置为table-cell,也就是具有表格单元格的特性,再使用vertical-align(这个属性对block元素不起作用,但对table-cell元素是有效的)设置元素垂直居中,即可达到我们想要的效果. IE7及以下版本不支持此方法,IE8及以上版本及大部分的主流浏览器都很好的支持. HTML代码  代码如下   <div class="img">     <img s

clearfix清除浮动闭合容器之:after与:before

在平常我们coding时候经常会发生子元素浮动而引起父级元素不能完全撑开的状况, 可能很多朋友给父级元素用overflow:hidden简单粗暴的解决,但这种方式有弊端,一是在IE6下不能完美解决,二是假如在该模块有定位的层就有定位层显示不完整的可能. 也有可能有些朋友是在父级元素里最后添加一个<div style="clear:both"></div>来解决这个问题,但这样我们的HTML代码里就多了些冗余的代码且从语义化角度来看这也是不合理的. 伪类:befo

css中解决vertical-align: middle垂直居中无效方法

 div水平居中很容易,设置css样式 text-align: center;  就可以了. 垂直居中也有个属性 vertical-align: middle; 这个属性普通设置是没有效果的. 第一种方法:通过一个空白图片可以达到垂直居中的效果.    代码如下 复制代码 <html>  <title>图片居中</title>  <style> /*定义垂直居中*/ #test * {  margin: 0px;  padding: 0px;  vertic

iOS中 SDWebImage手动清除缓存的方法 技术分享

1.找到SDImageCache类 2.添加如下方法: - (float)checkTmpSize { float totalSize = 0; NSDirectoryEnumerator *fileEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:diskCachePath]; for (NSString *fileName in fileEnumerator) { NSString *filePath = [diskC