CSS浮动与浮动清除(BFC)

浮动

1. 什么是浮动

当元素的 float 属性不为 none 时就产生了浮动。

<div class="float">float</div>
.float {
  float: left;
  width: 100px;
  height: 100px;
  background-color: #ddd;
}

2. 浮动的影响

  1. 浮动会使元素脱离文档流,具体表现为:

    • 父元素高度塌陷,即不会包含浮动元素。

      比如上面的代码就会表现为
      父元素高度塌陷
    • 文本环绕。

      文本环绕效果

      可以注意到这里.normal元素的宽度覆盖了.float元素,但是.float元素下是没有文本的,也就是说文本被“挤”出来了,这是因为它虽然会脱离文档流,但是不会脱离文本流。这个效果也是float属性的本意。其代码如下:

      <body>
        <div class="float">float</div>
        <div class="normal">正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素</div>
      </body>
      
      body {
        background-color: #ccc;
      }
      .float {
        float: left;
        width: 100px;
        height: 100px;
        background-color: #ddd;
      }
      .normal {
        background-color: #fff;
      }
      
  2. 浮动元素的外边距不会合并。
    关于外边距合并的相关内容可以戳这里

  3. 元素一旦浮动便会变成行内块元素,即 display: inline-block

3. 浮动的应用

  • 上面提到的文本环绕。

  • 写一个三列布局,左右固定宽度,中间自适应。

    <body>
      <div class="left float">left</div>
      <div class="right float">right</div>
      <div class="mid">自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素</div>
    </body>
    
    body {
      background-color: #ccc;
    }
    .float {
      float: left;
      width: 100px;
      height: 100px;
      background-color: #ddd;
    }
    .left {
      float: left;
    }
    .right {
      float: right;
    }
    .mid {
      height: 100px;
      background-color: #fff;
      margin: 200px; /*故意加上了上下 margin 值*/
    }
    

    这里我故意加上了上了 margin 值,可以看到效果:

    三列布局

    body 也随 .midmargin 往下掉了,这点可以用前面介绍的外边距合并来解释。

    ps:我第一次自己写这个三列布局的时候,html 是这样写的

    <body>
      <div class="left float">left</div>
      <div class="mid">自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素</div>
      <div class="right float">right</div>
    </body>
    

    如上把中间自适应的元素写在中间,其实这样比较符合逻辑,但是如果这样写是行不通的,右边的元素会掉下来,因为 .mid 元素是块级元素,会占满整行,.left 不会掉下来是因为它本来就是脱离文文档流的浮动元素。

清除浮动

在子元素上清除

这里我只写不会产生无意义标签的方法。

  • 浮动元素后面若有兄弟元素,则可以在给它的兄弟元素加上clear属性。
    如文本环绕那一部分代码,给 .normal 加上 clear:left 或者 clear:bothclear 的具体用法这里不做过多赘述。

  • 给要清除浮动的元素加上伪类或者伪元素。

    .float::after {
      content: '';
      display: block;
      visiability: hidden;
      height: 0;
      clear: both;
    }
    

    关于 ::after 的使用可以看 MDN 的文档

在父元素上清除,即BFC

BFC(Block Formatting Context),即块级格式上下文,它的官方解释是:

浮动、绝对定位元素(positionabsolutefixed)、行内块元素 display:inline-block、表格单元格 display:table-cell、表格标题 display:table-caption 以及 overflow 属性值不为 visible 的元素(除了该值被传播到视点 viewport 的情况)将创建一个新的块级格式化上下文。

总结来说它要满足下列条件之一:

  1. float 不为 none
  2. position 不为 staticrelative
  3. displaytable-celltable-captioninline-blockflexinline-flex
  4. overflow 不为 visible

只要给父元素加上以上任意一个属性满足条件,也就是给父元素加上 BFC 就能清除子元素的浮动。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,861评论 1 92
  • 各种纯css图标 CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出。直接用CSS3画出这些图形,要比...
    剑残阅读 9,746评论 0 8
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,352评论 0 11
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,828评论 0 2
  • 一 外部式css样式 (也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css...
    KunMitnic阅读 999评论 0 1