BFC介绍和应用

359 阅读2分钟

BFC介绍和应用

BFC介绍

  • BFC(块格式化上下文)是一个单独的容器,类似黑盒子,黑盒子里面的元素和外面的元素互不干扰

什么方式会创建BFC

  • 根元素(html)
  • 浮动元素(元素的 float 不是 none)
  • 绝对定位元素(元素的 position 为 absolute 或 fixed)
  • 行内块元素(元素的 display 为 inline-block)
  • 表格单元格(元素的 display为 table-cell,HTML表格单元格默认为该值)
  • 表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)
  • overflow 值不为 visible 的块元素
  • display 值为 flow-root 的元素
  • contain 值为 layout、content或 paint 的元素
  • 弹性元素(display为 flex 或 inline-flex元素的直接子元素)
  • 网格元素(display为 grid 或 inline-grid 元素的直接子元素)

BFC的应用

解决元素上下间边距重叠问题

  • 把div设置margin各20px,本以为两个div之间是40px,然后是20px,上下边距重叠了
    <style>
        div{
            width: 100px;
            height: 100px;
            background: red;
            margin: 20px;
        }
    </style>

    <div></div>
    <div></div>

  • 通过BFC解决重叠问题,在每个div元素加个父元素,并给父元素设置overflow:hidden。这样两个div间距就是40px了。
    <style>
        .text{
            overflow:hidden;
        }
        p{
            width:100px;
            height:100px;
            margin:20px;
            background:red;
        }
    </style>
    <div class="text">
        <p></p>
    </div>
    <div class="text">
        <p></p>
    </div>

解决浮动

  • 给子元素div设置浮动,就会导致父元素div的高度塌陷。看下代码和效果:
    <div style="border: 1px solid #000;">
        <div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
    </div>

  • 使用BFC解决父元素高度塌陷问题,给父元素div设置overflow:hidden。这样父元素就不塌陷了。
    <div style="border: 1px solid #000;overflow:hidden;">
        <div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
    </div>

两列布局,左列固定,右边自适应

  • 两个div,第一个div左浮动,第二个div没浮动,会导致第一个div脱离文档流,放在第2个div上面。
    <div style="height: 100px;width: 100px;float: left;background: lightblue">
     我是一个左浮动的元素
    </div>
    <div style=" height: 200px;background: #eee;">
    我是一个没有设置浮动, 也没有触发 BFC 元素, width: 200px; height:200px; background: #eee;
    </div>

  • 使用BFC解决,给第二个div设置overflow:hidden;这样两个div就分开了,也实现了两列布局。