BFC-前端日常总结

BFC-前端日常总结

一、 BFC的概念

    英文全名:Block Formatting Context 中文理解:块级格式化上下文

二、如何形成BFC?满足一下条件之一,形成BFC。

  • 浮动元素:float除了node以外的值。
  • 定位元素:position(absolute,fixed)
  • display:inline-block,table-cell,table-caption之一
  • overflow:为visible除外的值(hidden,scroll)

BFC渲染规则

  • 在BFC垂直方向的边距发生重叠
  • BFC的区域不会与浮动元素的box重叠
  • BFC在页面是一个独立的容器,外面的元素不会影响里面的 元素,里面的元素页不会影响外面的元素
  • 计算BFC高度的时候,浮动元素也会参与计算

使用形成BFC条件之一的overflow来解决下面场景的问题

代码如下,运行可以查看效果:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>BFC解决各种布局问题</title>
    <style>
      *{
          margin: 0;
          padding: 0;
      }
    </style>
</head>
<body>
    <h5> 场景一:在同一个BFC里面,兄弟子块元素会发生外边距重叠</h5>
    <style>
        h5{
            text-align: center;
            margin:50px 0 20px 0;
        }
        .layout{
            width: 100%;
            overflow: hidden;
            background-color: red;
        }
        .box{
            margin: 5px;
            height: 50px;
            background-color: palegreen;
        }
        .layout-help{
            background-color: green;
        }
        .box-help{
            overflow:hidden;
        }
    </style>
    <div class="layout">
        <!-- 每个box的margin都为5px,则正常我们想box之间距离10px,但是结果渲染到浏览器上确实5px; -->
        <p class="box"></p>
        <p class="box"></p>
        <p class="box"></p>
    </div>
    <h5>解决方案:给该子元素加个BFC父级元素</h5>
    <div class="layout-help">
        <p class="box"></p>
        <p class="box"></p>
        <div class="box-help">
            <p class="box"></p>
        </div>
    </div>


    <h5>场景二:父子元素之间发生外边距重叠</h5>
    <style>
       .layout2{
         background-color: rgb(17, 216, 150);
       }
       .box2{
           height: 50px;
           margin-top: 20px;
           background-color: brown;
       }
       .layout2-help{
        background-color: rgb(17, 216, 150);
        overflow: hidden;
       }
    </style>
    <div class="layout2">
        <!-- box2设置了 margin-top: 20px;想距离父级元素20px,但根据样式代码,在浏览器上渲染的结果是 box2顶部和父级元素没有距离。 -->
        <p class="box2"></p>
    </div>
    <h5>解决方案:把父级元素变成BFC</h5>
    <div class="layout2-help">
        <p class="box2"></p>
    </div>


    <h5>场景三:浮动元素与块级元素发生重叠</h5>
    <style>
        .layout3{
            width: 100%;
            background-color: tomato;
        }
        .float3{
            width: 100px;
            height: 50px;
            background-color: teal;
            float: left;
        }
        .box3{
            height: 200px;
            background-color: yellow;
        }
        .box3-help{
            height: 200px;
            background-color: yellow;
            overflow: hidden;
        }
    </style>
    <div class="layout3">
        <!-- float3元素向左浮动后,box3元素高度大于float3高时,box3可以跑到float3元素的下侧
             场景:如果我们不想让box3跑到float3下侧时,怎么处理呢?
        -->
        <div class="float3"></div>
        <div class="box3"></div>
    </div>
    <h5>解决方案:box3元素变成BFC</h5>
    <div class="layout3">
        <div class="float3"></div>
        <div class="box3-help"></div>
    </div>

    <h5>场景四:浮动元素会导致父级元素高度宽度撑不起</h5>
    <style>
        .layout4{
            background-color: tomato;
        }
        .float4{
            width: 100%;
            height: 100px;
            margin-top: 20px;
            background-color: yellowgreen;
            float: left;
        }
        .layout4-help{
            background-color: tomato;
            overflow: hidden;
        }
    </style>
    <div class="layout4">
        <!-- 等float4浮动起来的时候,layout4元素没有根据float4元素的大小撑开
        场景:laout4元素页跟着撑开怎么设置呢? -->
        <div class="float4"></div>
    </div>
    <h5>解决方案:父级元素变成BFC</h5>
    <div class="layout4-help">
        <div class="float4"></div>
    </div>
</body>
</html>
发布了11 篇原创文章 · 获赞 1 · 访问量 1159

猜你喜欢

转载自blog.csdn.net/u014403513/article/details/103612393
今日推荐