zoukankan      html  css  js  c++  java
  • 什么是BFC

    写CSS样式时,对一个元素设置css,我们首先要知道这个元素是块级元素还是行内元素,而BFC就是用来格式化块级盒子的。

    BFC定义:块级格式化上下文,它是指一个独立的块级渲染区域,只有Block-level Box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。

    满足下列CSS声明之一的元素便会生成BFC:

    1.根元素或其它包含它的元素

    2.float的值不为none;

    3.overflow的值不为visible;

    4.position的值不为static;

    5.display的值为inline-block、table-cell、table-caption;

    6.flex boxes (元素的display: flex或inline-flex)

    BFC的布局规则是什么样的呢?

    1、内部的元素会在垂直方向一个接一个地排列,可以理解为是BFC中的一个常规流

    2、元素垂直方向的距离由margin决定,即属于同一个BFC的两个相邻盒子的margin可能会发生重叠

    3、每个元素的左外边距与包含块的左边界相接触(从左往右,否则相反),即使存在浮动也是如此,这说明BFC中的子元素不会超出它的包含块

    4、BFC的区域不会与float元素区域重叠

    5、计算BFC的高度时,浮动子元素也参与计算

    6、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然

    BFC的应用

    1.解决margin重叠问题

    margin重叠现象:相邻的垂直元素同时设置了margin后,实际margin值会塌陷到其中较大的那个值。

    其根本原理就是它们处于同一个BFC,符合“属于同一个BFC的两个相邻元素的margin会发生重叠”的规则。

    <style>

           *{margin:0;padding:0;}

      .box p{margin:20px auto;background:pink;}

    </style>

    <div class="box">

     <p>Hello,world</p>

        <p>Hello,world</p>

        <p>Hello,world</p>

    </div>

    这时候就会发现上下margin重叠了。

    我们可以在其中一个元素外面包裹一层容器,并触发该容器生成一个BFC。那么两个元素便属于不同的BFC,就不会发生margin重叠了。

    <div class="box">

     <p>Hello,world</p> 

     <div style="overflow:hidden">

          <p>Hello,world</p>

      </div>

        <p>Hello,world</p>

    </div>

    我们使用overflow:hidden;生成了一个BFC,成功解决了margin重叠问题。

    2.解决浮动问题

    我们知道给父元素设置overflow:hidden可以清除子元素的浮动,但往往都不知道原理是什么。

    其实这就是应用了BFC的原理:当在父元素中设置overflow:hidden时就会触发BFC,所以他内部的元素就不会影响外面的布局,BFC就把浮动的子元素高度当做了自己内部的高度去处理溢出,所以外面看起来是清除了浮动。

    //文档流 从上至下,当遇到position float 的时候就改变了文档流

    <div class="one">//给父元素添加overflow:hidden,

      <div class="two">Hello World!</div>

    </div>

    你好世界!

    当我们一个元素设置成为BFC之后,计算BFC元素高度的时候,浮动元素也参与了计算。

    3.解决侵占浮动元素的问题

    当一个元素浮动,另一个元素不浮动时,浮动元素因为脱离文档流就会盖在不浮动的元素上。

    解决办法:我们给另一个元素也添加浮动,或者添加overflow:hidden

    我们为非浮动元素建立BFC环境,根据BFC的不与float box重叠的规则,解决了侵占元素问题。

    这是一篇博客文章,觉得说的特别好,就拿来总结下了,BFC的概念看似抽象,其实在我们开发中经常遇到,你也知道解决办法,这篇文章给了这么用的一个解释,继续学习中,欢迎指教~

  • 相关阅读:
    命令模式
    责任链模式
    代理模式
    享元模式
    195 Tenth Line
    test命令
    read命令
    echo命令
    java反射
    http状态码
  • 原文地址:https://www.cnblogs.com/xuniannian/p/8036095.html
Copyright © 2011-2022 走看看