dazhifu 2019-06-28
Block Formatting Contexts (BFC,块级格式化上下文)就是一个块级元素 的渲染显示规则 (可以把 BFC 理解为一个封闭的大箱子,,容器里面的子元素不会影响到外面的元素)
代码如下:
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>外边距折叠</title>
    <style>
        body{
            margin:0;
        }
        .box{
            width:500px;
            height:500px;
            margin:0 auto;
        }
        .btm1{
            width:100px;
            height:100px;
            background-color:orange;
            margin:100px;
        }
        .btm2{
            width:100px;
            height:100px;
            background-color:red;
            margin:100px ;
        }
    </style>
    
</head>
<body>
    <div class="box">
    
        <div class="btm1">上下100margin</div>
        
        <div class="btm2">上下100margin</div>
    
    </div>
</body>
</html>效果图:
第一个div的下边距和第二个div的上边距发声了重叠,所以两个盒子之间距离只有100px,而不是200px。
解决方法:
代码如下:
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>外边距折叠</title>
    <style>
        body{
            margin:0;
        }
        .box{
            width:500px;
            height:500px;
            margin:0 auto;
        }
        .btm1{
            width:100px;
            height:100px;
            background-color:orange;
            margin:100px;
        }
        .btm2{
            width:100px;
            height:100px;
            background-color:red;
            margin:100px ;
        }
        .container{
            overflow: hidden;
        }
    </style>
    
</head>
<body>
    <div class="box">
        <div class="container">
            <div class="btm1">上下100margin</div>
        <div>
        <div class="container">
            <div class="btm2">上下100margin</div>
        <div>
    </div>
</body>
</html>效果图:
这次我们可以清晰的看清两个中间是200px;并没用重叠。
代码如下:
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>高度塌陷</title>
    <style>
        body{
            margin:0;
        }
        .box{
            width:500px;
        
            margin:0 auto;
            border:1px solid green;
        }
        .btm1{
            width:100px;
            height:100px;
            background-color:orange;
            float:left;
        }
        .btm2{
            background-color:red;
        }
    
    </style>
    
</head>
<body>
    <div class="box">
            <div class="btm1">浮动</div>
        
            <div class="btm2"></div>
    
    </div>
</body>
</html>效果图:
由于容器内元素浮动,脱离了文档流,所以容器只剩下 2px 的边距高度。如果使触发容器的 BFC,那么容器将会包裹着浮动元素。
代码如下:
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>高度塌陷</title>
    <style>
        body{
            margin:0;
        }
        .box{
            width:500px;
            overflow:hidden;
            margin:0 auto;
            border:1px solid green;
        }
        .btm1{
            width:100px;
            height:100px;
            background-color:orange;
            float:left;
        }
        .btm2{
            background-color:red;
        }
    
    </style>
    
</head>
<body>
    <div class="box">
            <div class="btm1">浮动</div>
        
            <div class="btm2"></div>
    
    </div>
</body>
</html>代码如下:
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>高度塌陷</title>
    <style>
        body{
            margin:0;
        }
        .box{
            width:500px;
            overflow:hidden;
            margin:0 auto;
            border:1px solid green;
        }
        .btm1{
            width:100px;
            height:100px;
            background-color:orange;
            float:left;
        }
        .btm2{
            width:300px;
            height:300px;
            background-color:red;
            
        }
        
    </style>
    
</head>
<body>
    <div class="box">
            <div class="btm1">浮动</div>
    
            
        
            <div class="btm2">
            
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            </div>
    
    </div>
</body>
</html>效果图:
解决方法:
通过触发btm2的BFC解决
代码如下:
<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>高度塌陷</title>
    <style>
        body{
            margin:0;
        }
        .box{
            width:500px;
            overflow:hidden;
            margin:0 auto;
            border:1px solid green;
        }
        .btm1{
            width:100px;
            height:100px;
            background-color:orange;
            float:left;
        }
        .btm2{
            width:300px;
            height:300px;
            background-color:red;
            
        }
        .bb{
            overflow:hidden
        }
    </style>
    
</head>
<body>
    <div class="box">
            <div class="btm1">浮动</div>
    
    
        <div class="bb">
            
        
            <div class="btm2">
            
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            欢迎大家观看!
            </div>
        </div>
    
    </div>
</body>
</html>效果图: