BFC

88 阅读2分钟

BFC

触发BFC规范的元素,可以形成一个独立的容器,不受到外界的影响,从而解决一些布局的问题

触发样式的条件(满足之一即可)

  • 浮动元素:float:除none以为的值
  • display :inline-block/table-cells/flex/flow-root(css3触发BFC专用,无副作用)
  • 绝对定位元素:position :absolute/fixed
  • overflow:除了visible以外的值(hidden/auto/scroll)

适用场景

外边距合并

当盒子出现嵌套时,子级盒子添加 TOP外边距 会带动父级盒子移动相应位置距离。

<title>解决margin传递的问题</title>
        <style type="text/css">
            .div1{width: 200px; height: 200px; background-color: #0000FF;}
            .div2{width: 100px; height: 100px; background-color: #8A2BE2; margin-top: 50px;}
            
            .div3{width: 200px; height: 200px; background-color: #0099FF; overflow: auto;}
            .div4{width: 100px; height: 100px; background-color: #AFEEEE; margin-top: 50px;}
        </style>
    </head>
    <body>
        <h5>当盒子出现嵌套时,子级盒子添加 TOP外边距 会带动父级盒子移动相应位置距离</h5>
        <div class="div1">
            <div class="div2">2</div>
        </div>
        <p>此时2盒子并没有向下移动,而是1,2盒子一下向下移动了 出现了margin传递的问题</p>
        
        <div class="div3">
            <div class="div4">4</div>
        </div>
    </body>
解决外边距叠加的问题

当两个有外边距的元素,它们的外边距恰好面对面相遇,就会出现只边距叠加的问题

<title>解决margin叠加的问题</title>
        <style>
            .div1 {
                width: 50px;
                height: 50px;
                background-color: #98FB98;
                margin-bottom: 30px;
            }
            .div2 {
                width: 50px;
                height: 50px;
                background-color: #0000FF;
                margin-top: 30px;
            }
            .div3 {
                width: 50px;
                height: 50px;
                background-color: #0099FF;
                margin-bottom: 30px;
            }
            .div4 {
                width: 50px;
                height: 50px;
                background-color: #666666;
                margin-top: 30px;
            }
            .bfc{overflow: hidden;}
        </style>
    </head>
    <body>
        <h5>当两个有外边距的元素,它们的外边距恰好面对面相遇,就会出现只边距叠加的问题</h5>
        <p>
            <div class="div1">1</div>
            <div class="div2">2</div>
            <p>1,2盒子相距30px 外边距出现了重叠</p>
            
        <h5>给3,4分别添加一个父盒子,并且给他们触发BFC的样式,</h5>
        <div class="bfc">
            <div class="div3">3</div>
        </div>
        <div class="bfc">
            <div class="div4">4</div>
        </div>
        </p>
        
        
    </body>
解决浮动的问题
<title>解决浮动的问题</title>
        <style type="text/css">
            .div1{width: 200px; border:2px solid; }
            .div2{width: 100px; height: 100px; background-color: #8A2BE2; float:left;}
            
            .div3{width: 200px; border:2px solid;overflow: auto;}
            .div4{width: 100px; height: 100px; background-color: #AFEEEE; float:left;}
        </style>
    </head>
    <body>
        <h5>当盒子出现嵌套,子级盒子带有浮动 父级盒子是标准流 这是会出现脱标的情况 从页面上看来就是父级盒子瘪了</h5>
        
        <div class="div1">
            <div class="div2">2</div>
        </div>
        解决浮动的办法  1.给父级加上BFC触发
                       2.清除浮动(:after :befor )
        
        
        <div class="div3" style="margin-top: 400px;">
            <div class="div4">4</div>
        </div>
    </body>
解决覆盖的问题

同级盒子,前面的盒子有浮动,后面的盒子是标准流 由于脱标 会出现前面盒子覆盖后面盒子的情况

<title>解决覆盖的问题</title>
        <style type="text/css">
            .div1{width: 100px; height: 100px; background-color: #0000FF; float:left;}
            .div2{width: 400px; height: 400px; background-color: #8A2BE2;}
            
            .div3{width: 100px; height: 100px; background-color: #C81623; float:left;}
            .div4{width: 400px; height: 400px; background-color: #AFEEEE; overflow: auto;}
        </style>
    </head>
    <body>
        <h5>同级盒子,前面的盒子有浮动,后面的盒子是标准流 由于脱标  会出现前面盒子覆盖后面盒子的情况</h5>
        <div class="div1">1</div>
        <div class="div2">2</div>
        <p>
            1出现了覆盖2的情况,给4加上BFC触发后
        </p>
        
        <div class="div3">3</div>
        <div class="div4">4</div>
    </body>


最后一句

学习心得!若有不正,还望斧正。希望掘友们不要吝啬对我的建议。