杂谈:我对清浮动clear的理解
首先,我们写一个简单的网页,相关代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .box1, .box2{ width: 200px; height: 200px; float: left; } .box1{ background: yellow; } .box2{ background-color: blue; } .box3{ width: 300px; height: 300px; background-color: red; } </style> </head> <body> <div class="container"> <div class="box1"></div> <div class="box2"></div> </div> <div class="box3"></div> </body> </html>
显然,它的最终展示效果是这样的:

使用开发者工具,会发现container这个类的高度为0

这就可以解释为什么红色块会浮上去:此时,box1(黄色块)与box2(蓝色块)为同一水平,box3(红色块)与container为同一水平。而黄色块与蓝色块比红色块和container的水平更高(这里的高度是第三维的高度,可以理解为纸面上的黄色块与蓝色块被抬起来了),既然container的高度为0, 所以红色块就被他们两个挡住了。
现在的问题是,如何使得红色块不被遮住?kerwin老师提供了以下四种方法:
1. 将container的高度写为固定值,这样可以把红色块挤出被黄色和蓝色覆盖的位置。
缺点: 如果增加了子元素内容,需要更改固定值,比较麻烦。
2. 在box3中使用clear清除浮动。即在box3的样式里添加属性clear
.box3{ width: 300px; height: 300px; background-color: red; clear: both; }
缺点:增加了
3. 既然浮动导致的高度“坍塌”是由前面的元素引起的,就应该由前面的元素来解决这个问题。所以在container中另外添加一个不带宽和高的div块,在这个div块中添加样式:使用clear属性值清除浮动。即:
<div class="container"> <div class="box1"></div> <div class="box2"></div> <div style="clear: both;"></div> </div>
缺点:增加了空标签,影响代码可读性
4.在container这个母元素中添加样式 overflow:hidden;
.container{ /* height: 200px; */ overflow: hidden; /* bfs, 让浮动元素计算高度 */ }
第一种方法很好理解。可是clear是如何“清除浮动”的?在第三种方法中,为什么要在container中额外添加一个div块来清除浮动,不能直接在box2中使用clear属性吗?于是我尝试了这种方法,结果却是这样的:
<div class="container"> <div class="box1"></div> <div class="box2" style="clear: both;"></div> <!-- <div style="clear: both;"></div> --> </div>

思来想去,我认为有可能是这样的:
clear可以使前面水平高度在自己之上的元素降到自己的水平高度,以解决清除浮动的效果。例如方法二,在box3红色块中使用clear,那么它前面的元素box1黄色块和box2蓝色块水平高度都在它之上,就会被降至跟它同一水平。
而在方法三中,我们在container里面又加了一个div,这个div在box1黄色块和box2蓝色块后面,在这个div里面使用clear,也能使前面水平高度比它高的元素降至跟它同一水平。
而为什么我刚刚尝试的方法达不到想要的效果?我认为它的过程可能是这样的:
首先,黄色块向左浮起,蓝色块也浮起,并且蓝色块使用了clear,这说明蓝色块清除了前面黄色块的浮起(这个效果是,蓝色块不会浮动到黄色块的右边,而是从黄色块后另起一行,向左浮起),并且蓝色块让黄色块降至和自己同样的水平高度,注意,蓝色块此时本身就是和黄色块同一个水平高度,所以这里的降水平高度并没有起作用,黄色块和蓝色块依然比container和红色块更高。因此,由于container的高度为0,红色块就移上去被黄蓝挡住了。

浙公网安备 33010602011771号