清除浮动的方法及原理

一、为什么要清除浮动?

用下面代码来体会

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .topDiv {
      width: 500px;
      border: 2px solid black;
    }

    .floatDiv {
      float: left;
      width: 100px;
      height: 100px;
      border: 2px dotted red;
      color: red;
      margin: 4px;
    }

    .textDiv {
      color: blue;
      border: 2px solid blue;
    }

    .bottomDiv {
      width: 500px;
      height: 100px;
      margin: 5px 0;
      border: 2px solid green;
    }
  </style>
</head>

<body>
  <div class="topDiv">
    <div class="floatDiv">我是一个即将要左浮动的盒子</div>
    <div class="textDiv">我是一个文本盒子</div>
  </div>
  <div class="bottomDiv">我是一个底部盒子</div>
</body>

</html>

效果图是:

floatDiv 盒子加上浮动后:

很明显浮动主要带来了两方面的影响:

一、对父盒子 topDiv 高度影响:子盒子浮动,会让父盒子的高度塌陷,如果父盒子没有内容,高度会变成0,所以叔父盒子 bottomDiv 因为浮动的影响位置改变
二、对兄弟盒子 textDiv 的影响:浮动会影响它下面的盒子,浮动盒子的兄弟盒子中是文字,因为浮动产生了文字环绕的效果,这可能是我们不希望出现的。
所以我们不是清除浮动,而是清除浮动带来的各种影响。要想清除影响一,就需要将父盒子的高度撑起来,这样就不会影响到父盒子下面的内容;要想清除影响二,需要清除兄弟盒子周围的浮动。

下面介绍清除浮动影响的方法。

二、清除浮动的方法

1、利用clear样式

用法:浮动盒子的兄弟盒子中的样式加上 clear: both;

优点:代码简洁,使用简单。可以同时清除对兄弟盒子和叔父盒子的影响。

缺点:只对浮动后面的兄弟盒子有效果

    .textDiv {
      color: blue;
      border: 2px solid blue;
      clear: both;
    }

结果:

解释:

因为浮动对兄弟盒子 textDiv 造成了影响,所以通过clear: both就可以清除盒子 textDiv 两边的浮动。也因为清除了盒子 textDiv 两边的浮动,所以盒子 textDiv 还是在原来的位置,父盒子的高度也不会发生塌陷,也因此清除了对叔父盒子 bottomDiv 的影响。

变型

  <div class="topDiv">
    <div class="textDiv">我是一个文本盒子</div>
    <div class="floatDiv">我是一个即将要左浮动的盒子</div>  
  </div>
  <div class="bottomDiv">我是一个底部盒子</div>
    .textDiv {
      color: blue;
      border: 2px solid blue;
      clear: both;
    }

这样是不起效果的,因为盒子 textDiv 的位置先确定了,于是浮动盒子 floatDiv 就紧接着盒子 textDiv 下方渲染在父元素的左侧,还是上面提到的影响二,浮动只会影响它下面的盒子;但是因为 floatDiv 浮动,所以父盒子高度塌陷,影响了叔父盒子的位置。

2、额外标签法

用法:浮动造成了几个影响就加上几个清除浮动的 块级元素 可以同时解决影响一和二

优点:使用简单

缺点:增加了无用标签,结构混乱

  <div class="topDiv">
    <!-- 交换位置后 -->
    <div class="textDiv">我是一个文本盒子</div>
    <div class="floatDiv">我是一个即将要左浮动的盒子</div>
    <div class="clear"></div>
  </div>
  <div class="bottomDiv">我是一个底部盒子</div>

    .clear {
      clear: both;
    }
  <div class="topDiv">
    <div class="floatDiv">我是一个即将要左浮动的盒子</div>
    <div class="clear"></div>
    <div class="textDiv">我是一个文本盒子</div>
    <div class="clear"></div>
  </div>
  <div class="bottomDiv">我是一个底部盒子</div>

    .clear {
      clear: both;
    }

解释:

和第一个例子里.textDiv应用clear清除浮动,撑起父级元素高度的原理完全一样。

3、利用伪元素

用法:是额外标签法的升级版,是给浮动的父盒子添加的

优点:没有增加标签,结构更简单

缺点:需要照顾低版本浏览器

这种方法就可以将浮动的影响制止住,主要是解决上面提到的影响一。

  <div class="topDiv clearfix">
    <div class="floatDiv">我是一个即将要左浮动的盒子</div>
    <div class="textDiv">我是一个文本盒子</div>
  </div>
  <div class="bottomDiv">我是一个底部盒子</div>
    .clearfix::after {
      content: "";
      display: block;
      height: 0;
      clear: both;
    }

结果:

可以看到解决了影响一,但是影响二并没有解决

4、触发BFC清除浮动

用法:给浮动的父元素添加overflow属性,触发BFC达到清除浮动的影响

优点:代码简洁,使用简单

缺点:只能清除对叔父盒子的影响,不能清除对兄弟盒子的影响

  <div class="topDiv ">
    <div class="floatDiv">我是一个即将要左浮动的盒子</div>
    <div class="textDiv ">我是一个文本盒子</div>
  </div>
  <div class=" bottomDiv">我是一个底部盒子</div>
    .topDiv {
      width: 500px;
      border: 2px solid black;
      overflow: auto;
    }

结果:

posted @ 2020-09-08 14:36  享码yy  阅读(454)  评论(0编辑  收藏  举报