清除浮动

  1. 理解clear:left/right的含义
  2. 为什么要清除浮动
  3. 清除浮动的方法

1、理解clear:left/right的含义

 clear语法:

clear:none | left | right | both

取值:

none:默认值。允许两边都可以有浮动对象

left:不允许左边有浮动对象

right:不允许右边 有浮动对象

both:不允许有浮动对象。

w3.org官方的解释是:「元素盒子的边不能和前面的浮动元素相邻」。

务必记住这句话:“float是魔鬼,会影响其他相邻元素;但是clear是小白,其只会影响自身,不会对其他相邻元素造成影响!

<div class="fz">
   <div class="fix"> /*该fix可以不引用,因为img是左浮动,cll已经清除了左浮动。但如果img是右浮动,父div同样塌陷*/
       <img src="images/xxx.jpg" width="125" class="l pr10">
       <div class="cll">我不喜欢你,我不要和你在一起~</div>
   </div>
</div>

 

这样,解释了垂直环绕布局,第一个div左浮动,第二个div先左浮动,后清除左浮动,第三个div不浮动。

其中第二个div先左浮动对第三个div产生影响,再清除左浮动是自己左边抗浮动(即左边不能有浮动)

2、为什么要清除浮动?

a、防止父元素高度塌陷

当一个父元素的高度不写或者为auto的时候,里面含有浮动子元素,那么该父元素的高度将不会自动适应子元素的高度,当子元素全部为浮动元素则父元素的高度为0;当子元素有未浮动元素,则父元素的高度为该未浮动元素的高度。

b、塌陷影响其(父元素)相邻元素的布局

代码:

<div class="fz">
    <div style=" 300px; border: 3px solid #ff4136;">
        <div class="l" style=" 100px; height: 100px; border: 1px solid #ccc;">左浮动</div>
        <div class="r" style=" 100px; height: 100px; border: 1px solid #ccc;">右浮动</div>
    </div>
    <div>父元素相邻元素</div>
</div>

(父元素的高度为0,并使得父元素相邻元素跑上面去了。)

清除浮动后:

3、清除浮动的方法:

方法一:在浮动元素末尾添加一个空的标签

<div style="clear:both"></div>
<br clear="all" />

缺点:添加无意义的空标签,有违结构的表现和分离。不推荐使用

方法二:父元素添加"ovh"或者"ova"

.ovh { overflow: hidden; }
.ova { overflow: auto; }

在IE6/7中还需要触发hasLayout,例如*zoom:1 ? 不需要,因为overflow:hidden跟auto已经触发了ie6/7的haslayout,此外父元素设置了width宽度也已经触发了haslayout,详见 《BFC和haslyout(IE6-7)》

缺点:ovh内容增多时候容易造成不会自动换行导致内容被隐藏,无法显示需要溢出的元素;?很多js特效做不了,多出去部分被隐藏了?

ova子元素宽度改变时导致父元素出现滚动条。

方法三:父元素也设置浮动

缺点:使得父元素相邻的元素的布局会受到影响,不可能一直浮动到body,不推荐使用

方法四:父元素设置display:table

缺点:盒模型属性已经改变,由此造成的一系列问题,得不偿失,不推荐使用。

方法五:使用after伪元素,推荐使用

.fix { *zoom: 1; }    //由于IE6-7不支持:after使用*zoom:1触发haslayout
.fix:after { display: table; content: ''; clear: both; }

综上所述,清除浮动的两种思路大体是:

a、清除浮动:利用 clear 属性,包括在浮动元素末尾添加一个带有 clear: both 属性的空 div 来闭合元素,其实利用 :after 伪元素的方法也是在元素末尾添加一个内容为一个点并带有 clear: both 属性的元素实现的。

b、闭合浮动:触发浮动元素父元素的 BFC (Block Formatting Contexts, 块级格式化上下文),使到该父元素可以包含浮动元素。

推荐使用方法五,当确定不需考虑溢出问题的时候可以考虑父元素添加”ovh“,以及父元素使用"display: inline-block;"都是触发父容器形成BFC的原理。

原文地址:https://www.cnblogs.com/zhaojieln/p/4221504.html