`
xiaoluode
  • 浏览: 13633 次
  • 来自: 深圳
社区版块
存档分类
最新评论

清除浮动的各种方法总结

 
阅读更多

问题的提出:

最简单的一种情形就是我们把一个小的、固定宽度的div元素(比如导航、引用等)和其他元素内容一起包含在一个大的div中。比如下面这段代码:

  1. <div id="outer">     
  2.   <div id="inner"> <h2>A Column</h2> </div>     
  3.   <h1>Main Content</h1>     
  4.   <p>Lorem ipsum</p>     
  5. </div>  

我们可以为“#inner”设定一个宽度值(比如说20%),但是由于div是块级元素,即使我们设定了宽度,其后面的内容也只能在下一行中显示,除非我们给它设定一个浮动属性(无论是向左浮动或者向右浮动)。那么此时会产生我们上面提到的问题了。

如果“#inner”的宽度和高度都比“#outer”小,这不会有问题。

但是,如果“#inner”的高度超过了“#outer”,那么的底部就会超出“#outer”的底部。这是因为我们为“#inner”设定了float属性后,它就会脱离的文本流,无论其宽度和高度怎么变化都不会使“#outer”跟随变化。

例一:未清除浮动时的布局表现

在这个例子中,最开始由于“#inner”的高度小于“#outer”所以不会有问题,但是当你点击“加长”后你会发现“#inner”的底边已经超出了“#outer”的范围,而“#outer”没有发生改变。这就是我们所提到的“清除浮动(闭合浮动元素)”或者是“闭合浮动”问题

解决办法:

1)额外标签法

第一个,也是W3C推荐的方法就是使用额外标签的办法。这种方法就是在内容的末尾增加一个空的标签,典型的做法就是使用类似

<br style="clear:both;" />

或者使用

<div style="clear:both;"></div>

这种办法通过增加一个HTML元素迫使外部容器撑开。不过这个办法会增加额外的标签使HTML结构看起来不够简洁。

例二:使用空div闭合浮动元素

我发现在Internet Explorer中(无论是6还是7)<br style="clear:both" />可以清除浮动,但是不能闭合浮动元素,在Firefox中就没有这个问题,不知道是什么原因?!

2)使用after伪类

使用after伪类和内容声明在指定的现在内容末尾添加新的内容。经常的做法就是添加一个“点”,因为它比较小不太引人注意。然后我们再利用它来清除浮动(闭合浮动元素),并隐藏这个内容:

 

  1. #outer:after{  
  2.     content:".";  
  3.     height:0;  
  4.     visibility:hidden;  
  5.     display:block;  
  6.     clear:both;  

但奇怪的是Windows中的Internet Explorer 6及以下版本并不支持CSS 2.1中的after伪类而Mac中的Internet Explorer却可以正常使用,所以我们还要单独针对Win/IE进行处理。在区分Win和Mac中Internet Explorer的诸多方法中,最常用就是Holly招数。Holly招数的原理是这样的,CSS代码

  1. /* 这段代码只有IE/Win可以看见 \*/  
  2. CSS 规则  
  3. /* 结束Hack */  

上面的代码中有两行注释,其中第一行结束时出现了反斜杠(\),在Mac的Internet Explorer中会认为注释并没有结束,于是继续向下直到第一个完事的“*/”出现,这中间的所有字符都被当作是注释,而IE/Win却也只会把第一行和第三行看作是注释,中间的为有效代码。所以这样就区分出来了不同平台上的IE了。

正是基于以上原理,在windows的IE 6上的清理浮动,可以使用如下代码:

  1. #outer {  
  2.     display:inline-block;  
  3. }  
  4. /* Holly Hack Begine \*/  
  5. * html #outer {  
  6.     height:1%;  
  7. }  
  8. #outer {  
  9.     display:block;  
  10. }  
  11. /* End Hack */  
  12.   

例三:使用:after伪类清理浮动

如果你不考虑 IE6/Mac用户的话你只需要写* html #outer {height:1%;}即可。

另外,似乎在Internet Explorer 7中不高display:inline-block也不好使。因此要使用最完整的Hack招数。

3)浮动外部元素,float-in-float

这种方法很简单,就是把“#outer”元素也进行浮动(向左或者向右)。

但是这种方法带来的别外一个问题就是和“#outer”相邻的下一个元素会受到“#outer”的影响位置会产生变化,所以使用这种方法一定要小心。有选择把页面中的所有元素都浮动起来,最后使用一个适当的有意义的元素(比如页脚)进行清理浮动,这有助于减少不必要的标记,但是过多的浮动会增加布局的难度。

例四:float-in-float

4)设置overflow为hidden或者auto

把“#outer”的属性overflow值设置为hidden或者auto同样可以清理浮动

这种方法不需要添加额外的标记。但是使用overflow的时候一定要小心,因为它会影响浏览器的表现。另外,在Internet Explorer 6中单纯地设置overflow为hidden或者auto并不能有效清除浮动(闭合浮动元素),还要指定“#outer”的一个维度,即要么给它指定一个宽度,要么指定一个高度:

#outer {
     overflow:auto;
     width:100%;
}

注意:如果你要在IE5/Mac上使用这种方法清除浮动(闭合浮动元素)的话,你就必须设定overflow的属性为值为hidden。

比较与选择

    

四种方法中使用哪种最好呢?首先,不推荐使用after伪类,对比其它三种方法,holly招数有点太烦琐,不好掌握,我上面讲到的holly招数中并不仅仅是IE/Win上有问题,当出现:hover时还会有其它问题,所以我们又加上了inline-block等属性,也就是说这种方法存在更多的不确定性。推荐对代码有“洁癖”并且技术较高的人使用。

那么其它三种方法其实都可以考虑。

  • 不过使用overflow的时候,可能会对页面表现带来影响,而且这种影响是不确定的,你最好是能在多个浏览器上测试你的页面;
  • 而对于使用额外标签清除浮动(闭合浮动元素),是W3C推荐的做法。至于使用<br />元素还是空<div></div>可以根据自己的喜好来选(当然你也可以使用其它块级元素)。不过要注意的是,<br />本身是有表现的,它会多出一个换行出来,所以要设定它的heigh为0,以隐藏它的表现。所以大多数情况下使用空<div>比较合适。
  • float-in-float,也是一个很好的选择,把你要进行清理浮动的元素外层再加上一层<div>并设置属性fload:left即可,不过要注意相邻元素的变化。

参考:

http://www.positioniseverything.net/easyclearing.html

http://www.sitepoint.com/blogs/2005/02/26/simple-clearing-of-floats/

分享到:
评论

相关推荐

    DIV+CSS 清除浮动常用方法总结

    DIV+CSS 清除浮动是页面布局中常见的问题,相信各位高手也都有自己的方法,今天在这里对常见的几种方法进行总结(PS:谈不上是原创,这里是我自己做的归纳总结,也是我自己内化的过程),希望对您能够有所帮助。...

    CSS清除浮动大全共8种方法

    下面总结8种清除浮动的方法(测试已通过 ie chrome firefox opera,后面三种方法只做了解就可以了): 1,父级div定义 height 复制代码代码如下: &lt;style type=”text/css”&gt; .div1{background

    CSS清除浮动方法总结

    在阿里云首页看到很多div都有加上:before和:after的属性.但是大都只是做了类似的如下处理,请问这样的意义是什么呢?研究了一番,原来是清除浮动用的,下面来总结下清除浮动的几种方法吧

    详解css清除浮动float的七种常用方法总结和兼容性处理

    在清除浮动前我们要了解两个重要的定义: 浮动的定义:使元素脱离文档流,按照指定方向发生移动,遇到父级边界或者相邻的浮动元素停了下来。 高度塌陷:浮动元素父元素高度自适应(父元素不写高度时,子元素写了浮动...

    关于清除浮动塌陷的几种方法总结

    在大家在使用css的过程中,多多少少会遇到清除浮动这个问题。所以这篇文章给大家总结了div+css中关于清除浮动塌陷的4种方法,相信会对大家学习或者使用div+css能有所帮助,有需要的朋友们下面来一起看看吧。

    CSS教程:总结清除浮动的方法

    很多人都有研究闭合浮动元素的问题,但是解决方法却不一样,也并不是每一种方法都尽善尽美。闭合浮动元素(或者叫清除浮动)是web标准设计中经常会遇到的一个问题,因此,这里我想总结一下目前经常用到

    常用的清除浮动的方法

    本文主要对常用的清除浮动的方法进行原理分析,总结其优缺点。具有一定的参考价值,下面跟着小编一起来看下吧

    html+css 清除浮动的相关技巧心得

    下面总结8种清除浮动的方法(测试已通过 ie chrome firefox opera,后面三种方法只做了解就可以了): 1,父级div定义 height  XML/HTML Code复制内容到剪贴板 &lt;style type="text/css"&gt;  .div1{...

    html、css最全知识点总结

    5、清除浮动的一些方法 6、隐藏元素的三种方法及其特点(敲黑板:overflow:hidden是隐藏元素的溢出部分,可以解决margin-top 作用在父元素上的问题) 6、表格、表单的一些属性及属性值 7、html、css常见问题的解决...

    CSS教程 伪清除浮动

    一个多月前总结了《清理浮动的全家》,当时看了之后没什么新鲜的东西也就忽略了,今天偶然又翻到那篇文章,想到了另外一个的方法(N久前在书店翻到的),在网上没看到有人提起过,写出来大家一起讨论下。 HTML: 无序...

    tastebile:日常代码归类整理总结学习

    基础部分HTMLCSS box-sizing属性详解 CSS的选择器有哪些 CSS伪类、伪元素用法介绍 CSS单位px、pt、em、rem介绍 CSS清除浮动的方法有哪些 Postcss用法 CSS图形动画 纯CSS3绘画之眨眼的螳螂 纯CSS3绘画之小黄人 蝙蝠侠...

    前端面试题之CSS篇

    常用清除浮动的方法,如不清除浮动会怎样?5. 删格化的原理6. 纯css实现三角形7. 高度不定,宽100%,内一p高不确定,如何实现垂直居中?8. 至少两种方式实现自适应搜索9. 设置一段文字的大小为6px10. css菊花图11. ...

    CSS学习总结

    1.清除浮动 老生常谈的话题,面试经常问的问题 解决方法有很多种,这里讲几种 1.1 子元素加clear 复制代码代码如下:”news”&gt; &lt;p&gt;Some Text&lt;/p&gt; ”clear”&gt; &lt;/div&gt; .news{ background: gray; border: solid 1px ...

    Visual Basic 2010入门经典.part1.rar

    8.5.3 清除所有节点 147 8.6 总结 147 8.7 问与答 147 8.8 作业 148 8.8.1 测验 148 8.8.2 答案 148 8.8.3 练习 148 第九章 给窗体添加菜单和工具栏 149 9.1 创建菜单 149 9.1.1 创建顶级菜单项 150 ...

    Visual Basic 2010入门经典.part2.rar

    8.5.3 清除所有节点 147 8.6 总结 147 8.7 问与答 147 8.8 作业 148 8.8.1 测验 148 8.8.2 答案 148 8.8.3 练习 148 第九章 给窗体添加菜单和工具栏 149 9.1 创建菜单 149 9.1.1 创建顶级菜单项 150 ...

Global site tag (gtag.js) - Google Analytics