美文网首页
对BFC的理解

对BFC的理解

作者: 隔壁老王z | 来源:发表于2020-08-05 16:34 被阅读0次

    一.什么是BFC?

    1、BFC全称Block Formatting Context ,中文直译为块级格式上下文。它是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。
    通俗的来说:BFC是一个独立的布局环境,我们可以理解为一个箱子(实际上是看不见摸不着的),箱子内部的元素不会影响到外部。即BFC中的元素的布局是不受外界的影响(我们往往利用这个特性来消除浮动元素对其非浮动的兄弟元素和其子元素带来的影响。)并且在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。
    2、BFC布局规则
    @1. 在BFC下,内部的Box会在垂直方向,一个接一个地放置。
    @2. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box 的margin会发生重叠
    @3. 在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘),即使存在浮动也是如此。
    @4. BFC的区域不会与float box重叠。
    @5. 计算BFC的高度时,浮动元素也参与计算

    二.触发BFC

    触发 BFC 的条件如下:
    浮动元素,float 除 none 以外的值
    绝对定位元素,position(absolute,fixed)
    display 为以下其中之一的值inline-block, table-cell, table-caption, flex,inline-flex
    overflow 除了 visible 以外的值(hidden,auto,scroll)

    三.BFC的应用
    1.解决浮动塌陷问题

    <style>
    .parent {
        border: 2px solid #428bca;
    }
    
    .child {
        width: 100px;
        height: 100px;
        float: left;
        background: #3BD49E;
    }
    </style>
    <div class="parent">
        <div class="child"></div>
    </div>
    
    高度塌陷.PNG

    效果如上图,可见如果父元素只包含浮动元素,且父元素未设置高度和宽度的时候,那么它的高度就会塌缩为零。解决这种问题,可以为其父元素创建 BFC。

    .parent {
        border: 2px solid #428bca;
        overflow: auto;
      }
    
    父元素创建BFC后

    2、自适应两栏布局
    我们还可以运用BFC可以阻止元素被浮动元素覆盖的特性来实现自适应两栏布局。

    <div class="aside"></div>  
    <div class="main"></div>  
    
    div {  
        width:300px;  
    }   
    .aside {  
          width: 100px;  
          height: 150px;  
          float: left;  
          background: black;  
    }  
    .main {  
         height:200px;  
         background-color:red;  
    }
    

    如果我们需要将黑色区域撑到红色的左边,就需要利用规范的第四条:
    BFC的区域不会与float重叠:

    .main {  
        overflow:hidden;  
        height:200px;  
        background-color:red;  
    }  
    

    这时候左栏宽度固定,右栏宽度会随着浏览器宽度的调整而调整,从而实现一个自适应两栏布局。


    相关文章

      网友评论

          本文标题:对BFC的理解

          本文链接:https://www.haomeiwen.com/subject/xlforktx.html