Timo

清除浮动的几种方式

很多时候,我们需要对一些元素进行并列显示。假设我们有以下代码:

<div class="container">
  <div class="item" id="id1"></div>
  <div class="item" id="id2"></div>
  <div class="item" id="id3"></div>
</div>

现在我们需要对三个item进行并排显示,我们可能会考虑使用float来完成。但是当我们完成以后,我们就会发现,container“包裹不住”这三个item,也就是我们所说的“高度塌陷”问题。

出现这种问题,是因为在通常情况下,父元素的高度可以包裹住子元素,但是如果子元素进行了浮动,那么父元素就不会计算浮动的元素的高度。所以当所有元素都进行浮动时,父元素就计算不到这三个item的高度,因此出现了“高度塌陷”,所以我们需要清除浮动。

方法1:在最后添加div元素

我们可以添加一个div元素在列表最后,并将该元素设为clear:both。此时dom结构如下:

<div class="container">
  <div class="item" id="id1"></div>
  <div class="item" id="id2"></div>
  <div class="item" id="id3"></div>
  <div style="clear:both"></div>
</div>
  • 优点:兼容性好
  • 缺点:增加了无意义的dom,不够优雅

方法2:使用:after伪元素

原理与第一种方法类似,不过这里我们不添加div元素,而是给container元素添加:after伪元素。

.container::after {
  content: ".";
  display: block;
  height: 0;
  clear: both;
}
  • 优点:解决得比较优雅
  • 缺点:如果浏览器不支持伪元素,则不能清除浮动

方法3:为容器添加overflow属性

如果我们给container添加overflow属性并赋予auto, hidden, scroll其中之一的值,那么也可以清除浮动。

一般我们不会将overflow设为scroll,因为这样会给容器添加滚动条。

  • 优点:操作简单,兼容性好
  • 缺点:清除浮动的方式不够直观,将来的浏览器可能不兼容

方法4:将容器进行浮动

如果我们为container也进行浮动,那么也可以清除浮动

  • 优点:操作简单,兼容性好
  • 缺点:增加了不必要的浮动,而且contaner后面的元素依旧要清除浮动

总结

这几种方式各有优缺点,所以在实践是要具体情况具体分析,选取最佳的清除浮动的方式。