为什么要清除浮动?

1、为什么要清除浮动

浮动本质是用来做一些文字混排效果的,但被我们拿来做布局用,则会有很多的问题出现。

由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排版产生影响,为了解决这些问题,此时就需要在该元素中清除浮动。

准确地说,并不是清除浮动,而是清除浮动后造成的影响。

2、清除浮动的本质

清除浮动的本质:主要为了解决父级元素因为子级浮动引起内部高度为 0 的问题。

再来解释下:在标准流下面,一个父 <p> 没有设置 height 属性,那么它的高度就会被子元素的高度撑开。但是如果这个父 <p> 中的子元素是浮动的话,如果父 <p> 下面再有一个兄弟 <p>,那么这个兄弟 <p> 就会遮挡这个父元素。这个现象也叫浮动溢出。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .father {
      height: 200px;
      border: 1px solid red;
      width: 300px;
      overflow: hidden;
    }
    .big {
      width: 100px;
      height: 100px;
      background-color: purple;
      float: left;
    }
    .small {
      width: 80px;
      height: 80px;
      background-color: blue;
      float: left;
    }
    .footer {
      width: 400px;
      height: 100px;
      background-color: pink;
    }
  </style>
</head>
<body>
  <div class="father">父 div
    <div class="big">子 div</div>
    <div class="small">子 div</div>
  </div>
  <div class="footer">兄弟 div</div>
</body>
</html>

补充:现代项目几乎不再需要"清除浮动",因为:

  • flex / grid 布局 已经取代 float 用来做主流布局;
  • 单纯需要"BFC 让父元素包含浮动子元素"时,可以直接给父元素 display: flow-root,更符合语义。
  • 牢记 "浮动是文字混排用的,不应该被当成布局工具",现代工程里只在兼容老 IE 或图标环绕等场景才使用。