[讨论]闭合浮动元素的方法与差别

本文探讨了CSS中闭合浮动元素的几种方法,包括利用clear属性、:after伪元素及overflow属性,并通过实例展示了不同浏览器下的表现差异。
提示:本文不是教程,而是对闭合浮动元素的方法在某个特定情况下的现象的讨论,涉及float、clear、overflow、:after等知识,新手勿入。


float属性在页面排版上非常有用,但是也带来很多问题。最常见的就是浮动元素的闭合问题。
如果一个没有设定高度的不浮动元素的子元素浮动,则该元素的高度不会包括浮动子元素的高度,而只会包含其内部不浮动元素的高度,因为浮动元素不属于常规流向,它脱离了文档流。因此如果要元素能够自动包含浮动子元素,则需要闭合浮动元素。
目前比较常用的有3种方法:

  • 利用浮动子元素后的元素清除浮动(包括添加1个空的元素以清除浮动)。
  • 使用:after伪元素,在元素最后插入清除。
  • 为元素设定overflow属性除“visible”之外的值。


还有1个方法可以使元素自适应高度:

  • 浮动元素,浮动的元素会包含浮动的后代元素。

下列代码,其显示如图1所示。

提示:所列代码只是关键代码,完整代码请查看示例页面


CSS:

p,
div 
{
margin
: 5px;
}

.wrap 
{
width
: 440px;
margin
: 10px;
clear
: both;
}

.div1,
.div2p 
{
float
: left;
width
: 80px;
margin
: 8px;
+display
: inline;
}


XHTML:
< div  class ="wrap" >
  
< div  class ="div1" > div1,浮动 </ div >
  
< div  class ="div2" >
    
< class ="div2p" > div2内p1 </ p >
   
< class ="div2p" > div2内p2 </ p >
    
< class ="div2p3" > div2内p3,不浮动 </ p >
  
</ div >
  
< div  class ="div3" > div3,不浮动 </ div >
</ div >

提示:截图是Firefox 2.0(以下简称FF)中的效果,如无特殊声明,则表示在Windows IE7.0(以下简称IE)、Opera 9.2(以下简称Op)、Safari 3.0(以下简称Sa)中效果相同。

图1:浮动元素与子元素浮动的元素
/web/css/format/clearFloat/clearFloat_01.gif

如果对.div2p增加CSS:
.div2p  {
......
clear
:left;
}

由于“clear:left”含义为:不允许本元素左边有浮动框,而div1也是浮动元素,因此,p1和p2下移到了div1的下面,如图2所示。

图2:不浮动的元素内的浮动子元素设定“clear:left”后的效果
/web/css/format/clearFloat/clearFloat_02.gif


而在IE中,整个div2都将下移到div1下,如图3所示。
图3:不浮动的元素内的浮动子元素设定“clear:left”后IE的显示
/web/css/format/clearFloat/clearFloat_03.gif


由图3可以发现,虽然在图1中IE正确地显示了溢出的元素,但是,对于出发了layout的wrap,IE仍旧会扩展最外层的高度,以容纳浮动元素。


闭合浮动元素方法1

此时,div2的高度只包括其内未浮动元素的高度,因此使用第1种方法闭合浮动元素,为浮动元素后面的元素p3设定clear属性:
.div2p3  {
clear
:left;
}

此时显示如图4所示,在IE中如图5所示。

图4:p3清除浮动后的效果
/web/css/format/clearFloat/clearFloat_04.gif


图5:p3清除浮动后IE内的效果
/web/css/format/clearFloat/clearFloat_05.gif

(啊!伟大的IE,居然多出来与div2的margin一样多的间隙。= =b)

此时如果为div2增加左边距(原设定为margin:5px):
.div2  {
......
margin-left
: 120px;
}

则显示如图6所示,在IE中如图7所示。

图6:增加左边距后的效果
/web/css/format/clearFloat/clearFloat_06.gif

图7:p增加左边距后IE内的效果
/web/css/format/clearFloat/clearFloat_07.gif


至此的效果,是左右2栏布局常用的方法,左栏固定宽度,右栏不设定宽度以求能自适应。


闭合浮动元素方法2

尝试方法2,利用:after清除浮动:
.div2:after  {
content
: "."; 
display
: block;
height
: 0; 
clear
: both; 
visibility
: hidden;
}

显示效果如图8所示。(IE不支持,不用试了。= =b)
图8:使用:after清除浮动
/web/css/format/clearFloat/clearFloat_08.gif

可以看到div2内的p3没有清除浮动,位置仍在div2的顶端。

增加div2的左边距,显示如图9所示。
.div2  {
margin-left
:120px;
}

图9:增加div2的左边距
/web/css/format/clearFloat/clearFloat_09.gif

由此可见使用:after清除浮动,不适合于浮动元素后面还有不浮动元素的情况。

闭合浮动元素方法3

尝试方法3,使用overflow属性:
.div2  {
overflow
:auto;
+height
:100%; /* 针对ie6 */
}

此时,最热闹的情况出现了:

图10:FF的效果
/web/css/format/clearFloat/clearFloat_10.gif

图11:Op和Sa的效果
/web/css/format/clearFloat/clearFloat_11.gif

图12:IE的效果(注:如果用IE 6,效果也不一样,= =|||)
/web/css/format/clearFloat/clearFloat_12.gif

首先,div2的宽度收缩到div1的右边了,也许这正好是期望的结果?
更热闹的在后面,增加div2的margin-left:
.div2  {
margin-left
:120px;
}

图13:FF的效果
/web/css/format/clearFloat/clearFloat_13.gif

图14:Op和Sa的效果
/web/css/format/clearFloat/clearFloat_14.gif

图15:IE的效果(注:如果用IE 6,效果也不一样,= =|||)
/web/css/format/clearFloat/clearFloat_15.gif

都是margin-left惹的祸,去掉margin-left:
.div2  {
margin-left
: 0;
}

终于接近统一了。

图16:去掉margin-left的效果
/web/css/format/clearFloat/clearFloat_16.gif

图17:去掉margin-left在IE内的效果
/web/css/format/clearFloat/clearFloat_17.gif

由此可见,overflow还是有很大局限性的。
但是造成FF、Op和Sa的显示结果的原因又是什么呢?

浮动

div2浮动,浮动元素的高度会包含其内部的浮动元素。
这种方法的局限性就是,div2浮动后宽度会被压缩,因此必须给它一个宽度值,但是这样就无法自适应宽度。
.div2  {
float
: left;
}

.div3 
{
clear
: both;
}

效果如图18所示。

图18:浮动div2
/web/css/format/clearFloat/clearFloat_18.gif

div2的浮动,还会造成wrap的高度问题,因此需要div3清除浮动。
由这个例子可以发现,由于div2的浮动,其内的p元素清除浮动,并没有受到div1的影响,因此,解决由于前2种方法中p1和p2下降到div1的高度之下的方法之一,可以将p1和p2外面套1个浮动的div,当然这可能影响到结构,还需要结合具体情况来决定。 
<think>好的,用户现在想解决CSS中清除浮动的问题,特别是关于clear fix的方法。我需要结合之前提供的引用内容,给出详细的解答。首先,用户之前的问题是关于文字竖排,但现在转向了清除浮动,这可能是因为在实现布局时遇到了浮动导致的问题,比如父元素高度塌陷。首先,我应该回顾用户提供的引用内容,尤其是引用[1]、[2]、[3]、[4]、[5],这些引用详细讨论了清除浮动的各种方法,包括伪元素、额外标签法、overflow方法等。用户特别提到了clearfix,所以重点应该放在伪元素方法上,尤其是.clearfix类的使用。接下来,我需要整理这些方法,并按照推荐程度排序。引用[2]提到几种清除浮动的方式,其中伪元素方法被认为符合闭合浮动思想,结构语义化正确,但需要注意IE兼容性。而引用[3]提供了不同的.clearfix写法,包括Bootstrap中的版本,这可能是一个常用的方案。 用户可能希望了解不同方法的优缺点,以及如何选择。需要解释清楚每种方法的原理,比如使用:after伪元素在父容器末尾插入一个块级元素来清除浮动,同时处理父元素的高度问题。此外,还要提到兼容性问题,比如旧版IE需要zoom:1来触发hasLayout。 还要注意用户提到的引用[4]中的例子,其中父元素因为子元素浮动导致高度为0,这时候使用clearfix可以解决。同时,引用[5]提到在兄弟元素上使用clear:both的方法,但这种方法需要每个受影响的元素都添加,比较麻烦,不如clearfix方便。 最后,要确保回答结构清晰,分点说明,并给出代码示例,比如标准的.clearfix实现,Bootstrap的版本,以及可能的其他方法如overflow:hidden。同时,生成的相关问题要围绕清除浮动的其他方法、BFC机制、兼容性处理等展开。</think>### CSS清除浮动的五种方法及原理 在CSS布局中,浮动元素会导致父元素高度塌陷,以下是专业开发者推荐的解决方案: --- #### **方法一:clearfix伪元素法(最佳实践)** 通过`:after`伪元素在容器尾部插入不可见块级元素,兼容现代浏览器及IE6+[^1][^3] ```css .clearfix::after { content: ""; display: block; clear: both; /* 清除两侧浮动 */ visibility: hidden; /* 隐藏元素但保留布局空间 */ height: 0; /* 避免意外撑开高度 */ } .clearfix { *zoom: 1; /* 触发IE6/7的hasLayout */ } ``` **使用场景**:需要语义化清除浮动的现代布局,Bootstrap等框架标准方案[^3] --- #### **方法二:双伪元素优化版** 同时使用`:before`和`:after`伪元素,增强布局稳定性 ```css .clearfix:before, .clearfix:after { content: ""; display: table; /* 触发BFC防止外边距合并 */ } .clearfix:after { clear: both; } .clearfix { *zoom: 1; } ``` **优势**:通过`display: table`创建匿名表格单元,防止子元素外边距穿透[^3] --- #### **方法三:overflow触发BFC** 利用块级格式化上下文特性自动包含浮动元素 ```css .container { overflow: hidden; /* 或 auto/scroll */ zoom: 1; /* 兼容IE6/7 */ } ``` **限制**:可能隐藏溢出内容或产生滚动条[^2] --- #### **方法四:额外标签法** 在浮动元素末尾添加空标签 ```html <div class="float-left"></div> <div style="clear: both;"></div> <!-- 清除元素 --> ``` **缺点**:引入无意义标签破坏HTML结构[^2][^5] --- #### **方法五:inline-block清除法** 通过改变父元素显示模式实现 ```css .clearfix { display: inline-block; /* 自动包含浮动元素 */ width: 100%; /* 保持块级特性 */ } ``` **注意**:可能影响元素间的默认间距[^3] --- ### 原理对比表 | 方法 | 核心机制 | 兼容性 | 代码侵入性 | |-----------------|-----------------------|-----------|------------| | clearfix伪元素 | 生成清除块 | IE6+ | 低 | | overflow | BFC布局上下文 | IE6+ | 中 | | 额外标签 | 物理清除 | 全兼容 | 高 | | inline-block | 改变显示模式 | IE8+ | 中 | --- ### 选择建议 1. **现代项目**:优先使用clearfix双伪元素方案[^3] 2. **简单布局**:可考虑`overflow:hidden`快速实现[^2] 3. **传统系统**:配合`zoom:1`保证IE兼容性[^1] 4. **框架开发**:参考Bootstrap的标准化实现[^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值