BFC

相信有很多人都知道BFC和IFC,并且知道解决办法,但是可能还是讲不出来

BFC

Block Formatting Context,中文直译为块级格式上下文。BFC就是一种布局方式,在这种布局方式下,盒子们自所在的containing block顶部一个接一个垂直排列,水平方向上撑满整个宽度(除非内部盒子自己建立了新的BFC)。两个相邻的BFC之间的距离由margin决定。在同一个BFC内部,两个垂直方向相邻的块级元素的margin会发生“塌陷”。

作者:苏星河
链接:https://www.jianshu.com/p/acf76871d259
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

来看一下常见的定位方案

  • 普通流 (normal flow)

    在普通流中,元素按照其在 HTML 中的先后位置至上而下布局,在这个过程中,行内元素水平排列,直到当行被占满然后换行,块级元素则会被渲染为完整的一个新行,除非另外指定,否则所有元素默认都是普通流定位,也可以说,普通流中元素的位置由该元素在 HTML 文档中的位置决定。

  • 浮动

    在浮动布局中,元素首先按照普通流的位置出现,然后根据浮动的方向尽可能的向左边或右边偏移,其效果与印刷排版中的文本环绕相似。

  • 绝对定位

    在绝对定位布局中,元素会整体脱离普通流,因此绝对定位元素不会对其兄弟元素造成影响,而元素具体的位置由绝对定位的坐标决定。

BFC布局规则

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的上下margin会发生重叠
  • 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算BFC的高度时,浮动元素也参与计算
  • BFC的区域不会与float box重叠。

生成BFC

  • body根元素
  • 浮动元素: float 除 none以外的值
  • 绝对定位元素,position(absolute,fixed)
  • display为inline-block, table-cell, table-caption, flex, inline-flex
  • overflow 除了 visible 以外的值 (hidden、auto、scroll)

BFC作用

  • BFC 可以包含浮动的元素(清除浮动)
<div class="box1">
        <div class="box2">
        </div>
    </div>
.box1 {
    width: 400px;
    border: 1px solid red;
    background-color: red;
    overflow: hidden;
}
.box2 {
    width: 200px;
    height: 200px;
    background-color: blue;
    border: 1px solid green;
    float: left;
}

不设BFC
不设BFC

设置BFC(计算BFC的高度时,浮动元素也参与计算)
这里写图片描述

  • 垂直margin合并(同一个 BFC 下外边距会发生折叠)
    • 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。
    • 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。
    • 两个外边距一正一负时,折叠结果是两者的相加的和。
<div class="box1">
</div>  
<div class="box2">
</div>
div {
    width: 200px;
    height: 200px;
    background-color: red;
    margin: 100px;
}

因为两个 div 元素都处于同一个 BFC 容器下 (这里指 body 元素)
这里写图片描述

如果想要避免外边距的重叠,可以将其放在不同的 BFC 容器中。

.box1 {
    width: 400px;
    border: 1px solid red;
    background-color: red;
    overflow: hidden;
}
.box2 {
    width: 200px;
    height: 200px;
    background-color: blue;
    border: 1px solid green;
    float: left;
}
div {
    width: 200px;
    height: 200px;
    background-color: red;
    margin: 100px;
}

这里写图片描述

  • 自适应两栏布局(不被浮动元素覆盖)
<div class="box1">
    </div>
        <div class="box2">
        </div>
body {
    width: 500px;
}
.box1 {
    width: 200px;
    height: 200px;
    background-color: red;
    float: left;
}
.box2 {
    width: 300px;
    height: 200px;
    background-color: blue;
    // overflow: hidden;
}

每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
这里写图片描述

BFC的区域不会与float box重叠。

这里写图片描述

参考链接:http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值