清除浮动

Posted: 10.15.2019

#CSS布局 #面试问题 - CSS

介绍

清除浮动是一种很常见的场景。

首先我们建一个 HTML 页面,这个时候先不加任何 float 看看。

<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
.box {
  width: 100px;
  height: 100px;
}

.box1 {
  background: pink;
}

.box2 {
  background: lightblue;
}

.box3 {
  background: yellow;
  opacity: 0.5;
}

效果:

然后我们给 box1 和 box2 加上 float 效果:

.box1 {
  float: left;
  background: pink;
}

.box2 {
  float: left;
  background: lightblue;
}

效果是这样的:

因为施加 float 后,box1 和 box2 脱离了文档流,因此 box3 补上了 box1 的位置。这俩重叠了。

而我们想要的效果,其实是 box1 与 box2 的 float 不会影响到 box3。

额外标签

这种方法需要添加额外的 HTML 标签,但是不需要设置 CSS(你设个类搞这玩意儿也行)。

可以说是最简单的方法,谁用谁知道。

<div class="f-box ff-box1"></div>
<div class="f-box ff-box2"></div>
<div style="clear: both"></div>
<div class="f-box ff-box3"></div>

实现的效果:

缺点

会添加一些无意义的空标签,在后期维护中将是噩梦。

但其实不是噩梦,因为你不会经常用到浮动,除非你真的需要。

一般情况下能用浮动实现的效果,不为什么不用弹性盒实现呢?兼容

利用 BFC

关于 BFC 是啥,可以参考我的这篇文章:BFC

简单来说,我们希望在 box1 和 box2 外面套一个 container,然后把那个 container 变成 BFC。

<div class="container">
  <div class="box box1"></div>
  <div class="box box2"></div>
</div>
<div class="box box3"></div>

但注意了,这里并不是所有触发 BFC 的效果都能生效!

所以我们主要还是看 overflow 和 display 这两种方法。

overflow

visible 以外(hidden、auto、scroll)的值都可以触发 BFC。

.container {
  overflow: auto;
}
.container {
  overflow: scroll;
}
.container {
  overflow: hidden;
}

以上三种设置都可以。最终实现的效果如下:

display

如下的情况可以触发 BFC:inline-block,inline-flex,flex,table-cell。

但是具体实现起来,俩 inline 的和俩不 inline 的,还是有差别的。

inline

.container {
  display: inline-block;
}
.container {
  display: inline-flex;
}

我们可以发现,在第一行和第二行之间,有一段很小的空白。

至于为什么会有这一段空白,可以参考我的这篇文章:标准文档流

而剩下两种方法则没有这样的问题。

.container {
  display: flex;
}
.container {
  display: table-cell;
}

:after 伪元素

目前业界一般都使用这种方法

这玩意儿本质上和额外标签是一样的。

就相当于是在 container 外添加了一层你根本看不见的标签,在那里清除浮动。

但是它不需要添加额外的标签,只需要在 CSS 层面做一些额外的工作。

.container:after {
  content: '';
  display: block;
  clear: both;
  visibility: hidden;
  height: 0;
}

/* 为了兼容IE */
.container {
  zoom: 1; 
}

最终实现的效果:

参考资料

彻底理解浮动float CSS浮动详解 清除浮动的方法