CSS清除浮动原理(涉及BFC)和方法

为什么要清除浮动??

首先理解浮动框

浮动的框可以左右移动,直至它的外边缘遇到包含框或者另一个浮动框的边缘。
浮动框不属于文档中的普通流,当一个元素浮动之后,不会影响到块级框的布局而只会影响内联框(通常是文本)的排列
文档中的普通流就会表现得和浮动框不存在一样,当浮动框高度超出包含框的时候,也就会出现包含框不会自动伸高来闭合浮动元素(“高度塌陷”现象)。
顾名思义,就是漂浮于普通流之上,像浮云一样,但是只能左右浮动。

导致了高度塌陷

为浮动的这种特性,导致本属于普通流中的元素浮动之后,包含框内部由于不存在其他普通流元素了,也就表现出高度为0(高度塌陷)。在实际布局中,往往这并不是我们所希望的,所以需要闭合浮动元素,使其包含框表现出正常的高度。

解决方法

1)添加额外标签

<div class="wrap" id="float1">
    <h2>1)添加额外标签</h2>
    <div class="main left">.main{float:left;}</div>
    <div class="side left">.side{float:right;}</div>
    <div style="clear:both;"></div>
    </div>
<div class="footer">.footer</div>

优点:通俗易懂,容易掌握
缺点:可以想象通过此方法,会添加多少无意义的空标签,有违结构与表现的分离,在后期维护中将是噩梦,这是坚决不能忍受的

2)父元素设置 overflow:hidden

通过设置父元素overflow值设置为hidden;在IE6中还需要触发 hasLayout ,例如 zoom:1;

<div class="wrap" id="float3" style="overflow:hidden; *zoom:1;">
    <h2>3)父元素设置 overflow </h2>
    <div class="main left">.main{float:left;}</div>
    <div class="side left">.side{float:right;}</div>
    </div>
<div class="footer">.footer</div>

实质是触发BFC
优点:不存在结构和语义化问题,代码量极少
缺点内容增多时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素;

3) 父元素设置浮动

优点:不存在结构和语义化的问题,代码量少
缺点: 使得与父元素相邻的元素的布局会受到影响,不可能一直浮动到body,不推荐。。

4) 父元素设置 display:table

也是触发了BFC
优点:结构语义化正确,代码少
缺点:盒模型属性已经改变。

5)使用:after伪元素

需要注意的是 :after是伪元素(Pseudo-Element),
不是伪类
不过csser要严谨一点,这是一种态度。

 .clearfix:after {
     content:"."; 
     display:block; height:0; visibility:hidden; clear:both; 
     }
.clearfix { *zoom:1; }

优点:结构和语义完全正确,代码量居中
缺点:复用方式不当会造成代码量增加

实际原理(后面解释BFC)

1) display:block 使生成的元素以块级元素显示,占满剩余空间;
2) height:0 避免生成内容破坏原有布局的高度。
3) visibility:hidden 使生成的内容不可见,并允许可能被生成内容盖住的内容可以进行点击和交互;
4)通过 content:”.”生成内容作为最后一个元素,至于content里面是点还是其他都是可以的,有些版本可能content 里面内容为空,不推荐这样做的,firefox直到7.0 content:”” 仍然会产生额外的空隙;(bug!!)
5)zoom:1 触发IE hasLayout。

总结原理

原理其一,通过在浮动元素的末尾添加一个空元素,
设置clear:both,after伪元素也是通过content**在元素后面生成了内容为一个点(或” “)的块级元素**;
块级元素自然就能让行内元素下沉了,因为
一般受影响的是行内元素~或者父元素高度塌陷

其二,通过设置父元素overflow或display:table
原理就是触发BFC(Block formatting contexts)
块级格式化上下文!!!!

BFC

BFC的特性

  1. BFC会阻止外边距叠加
    一般情况,两个相邻的块级框,它们之间的垂直方向的外边距会发生叠加。 如果这两个相邻的块框不属于同一个BFC就不会叠加!
    2.BFC不会重叠浮动元素
    一个BFC的边框不能和它里面的元素的margin重叠。
    这意味着浏览器将会给BFC创建隐式的外边距来阻止它和浮动元素的外边距的叠加
    当给一个挨着浮动的BFC添加负得外边距不会起作用!
    1. BFC通常可以包含浮动

触发BFC的条件

  • float除了none以外的值
  • overflow除了visible之外的值
  • display(table-cell table-caption,inline-block)
  • position(absolute,fixed)

display:table 本身并不会创建BFC,但是它会产生匿名框(anonymous boxes),而匿名框中的display:table-cell可以创建新的BFC,换句话说,触发块级格式化上下文的是匿名框,而不是display:table。所以通过display:table和display:table-cell创建的BFC效果是不一样的。

解释

通俗地来说:创建了 BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然,同时BFC依然属于文档中的普通流。
设置了overflow:hidden可以清除浮动就是
因为父元素创建了新的BFC!
所以父元素和子元素是两个BFC,因为设置了float也是一个BFC

综上所述:

在支持BFC的浏览器(IE8+,firefox,chrome,safari)通过创建新的BFC闭合浮动;

在不支持 BFC的浏览器 (IE6-7),通过触发 hasLayout 闭合浮动。(不是很了解了)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值