BFC的理解以及解决的问题

BFC

  • Block Formatting Context 块级格式化上下文

  • Formatting Context 指的是页面中的一个渲染区域,并且拥有一套渲染规则,他决定子标签如何定位,以及与其他标签的相互关系和作用

  • BFC,块级格式化上下文,指的是页面中的一个渲染区域,只有Block-level Box(块级盒子)参与,该区域中拥有一套渲染规则来约束块级盒子的布局,且与外部无关

如何生成BFC?
  • 以下情况是目前能够生成BFC的情况:

根元素 html
float属性值不为none
overflow属性值不为visble
display属性值为inline-block
position属性值为absolute/fixed

BFC的特性/规则?
  • 1,内部的块标签会在垂直方向一个接一个的放置
  • *2,垂直方向的距离由margin决定, 属于同一个BFC的两个相邻的标签外边距会发生重叠
  • 3,每个标签的左外边距和包含块的左边界相接触,即使浮动标签也是如此
  • *4,BFC区域不会与float的标签区域发生重叠
  • *5,计算BFC的高度时,浮动子元素也会参与计算
  • *6,BFC就是页面中的一个隔离的独立容器,容器里的字标签不会影响到外部标签,反之,外部标签也不会影响BFC内部标签
BFC解决的问题?
  • 1,外边距折叠

根据特性第2条,属于BFC的两个相邻的标签外边距会发生重叠(父子外边距重叠、兄弟关系边距重叠)
解决:让标签处于不同的BFC区域中就不会重叠
1, 父子边距重叠:给父元素设置生成BFC的属性
2,兄弟边距重叠:给其中任意一个添加一层BFC父级

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .box1 {
            width: 200px;
            height: 200px;
            background-color: red;
            margin-bottom: 60px;
        }
        .box2 {
            width: 300px;
            height: 300px;
            background-color: green;
            margin-top: 60px;
        }
        .wrap {
            /*
             float: left;
            position: absolute; 
            这两种方法虽然可以解决,但会遮盖下面的内容。
            */
            /* display: inline-block;
            这种会有空白间隙
             */
            overflow: hidden; /* 目前这种解决方法比较合适 */
        }
    </style>
</head>

<body>
    <div class="box1"></div>
    <div class="wrap">
        <div class="box2"></div>
    </div>
</body>

这个小案例:给box1加父级盒,因为box1下面还有内容所以给父级wrap加上(脱离文档流的方式)会覆盖下面的内容。 所以给相邻的下面那个元素加父级。

  • 2,实现自适应的两栏或三栏布局(根据特性4)

两栏布局,左侧固定宽度,右侧栏自适应(浏览器的尺寸变化缩小放大)
三栏布局,左右两栏是固定宽度,中间栏是自适应
由于代码较多,就不演示了。

  • 3,防止文字环绕图片排列(根据特性4)

浮动的元素会覆盖不浮动的元素,文字会环绕图片排列,把文字所在的标签设置为BFC,可以避免文字环绕的效果

  • 4,清除浮动

根据第5条特性,所以通过bfc清除浮动,计算BFC的高度时,浮动子元素也会参与计算,例如给浮动元素父级添加overflow:hidden

    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .wrap{
            border: 1px solid #000;
         }
        .box{
            width: 300px;
            height: 300px;
            background-color: red;
            float: left;
        }
        .box1{
            width: 200px;
            height: 200px;
            background-color: blue;
            float: left;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="box"></div>
        <div class="box1"></div>
    </div>
</body>

在这里插入图片描述

给父级盒wrap添加(BFC生成的条件即可):
float: left;
overflow: hidden; 不为visible
display:inline-block
position:absolute/fixed
在这里插入图片描述

但是当中还是 overflow:hidden; 比较合适。

好了,今天就到这了。奥利给在这里插入代码片

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值