深入理解块级格式化上下文(BFC)

一、 什么是BFC

块级格式化上下文,Block Formatting Context,也就是常说的BFC,它是Web页面的可视化CSS渲染区域的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。
BFC的布局规则如下:

  1. 内部的盒子会在垂直方向,一个一个地放置
  2. BFC是页面上的一个隔离的独立容器
  3. 属于同一个BFC的两个相邻Box的上下margin会发生重叠
  4. 计算BFC的高度时,浮动元素也要参与计算
  5. 每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此
  6. BFC的区域不会与float重叠

创建了BFC的元素中的所有内容都会被包含在该BFC中。
BFC对浮动定位与清除浮动都很重要。浮动定位和清除浮动时只会应用同一个BFC内的元素。浮动不会影响其他BFC中元素的布局,而清除浮动只能清除同一BFC中在他前面的元素的浮动。外边距折叠也只会发生在属于同一BFC的块级元素之间。

下列方式会创建BFC:

  1. 根元素或包含根元素的元素,即body根元素
  2. 浮动元素,即float属性值不为none(元素的positionabsolutefixed
  3. 行内块元素(元素的displayinline-block
  4. 表格单元格(元素的displaytable-cell,HTML表格单元格默认为该值)
  5. 表格标题(元素的displaytable-caption,HTML表格标题默认为该值)
  6. 匿名表格单元格元素(或者元素的displaytabletable-rowtable-row-grouptable-header-grouptable-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或inline-table)
  7. overflow的值不为visible的元素
  8. display值为flow-root`的元素
  9. contain值为layoutcontentstrict`的元素
  10. 弹性元素(displayflexinline-flex元素的直接子元素)
  11. 网格元素(displaygridinline-grid元素的直接子元素)
  12. 多列容器(元素的colunm-countcolumn-width不为auto,包括column-count为1)
  13. column-spanall的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器当中

二、BFC的特性及应用

两个相邻的普通流中的块元素垂直方向的margin会发生折叠

  <style>
    .p{
      height: 50px;
      width: 200px;
      margin: 50px 0;
      background: tomato;
    }
  </style>
</head>

<body>
  <h1>1.两个相邻的普通流中的块元素垂直方向上的margin会折叠</h1>
  <div class="p"></div>
  <div class="p"></div>
</body>

上下margin折叠上下margin折叠

之所以会发生这样的情况是因为根据BFC布局规则中所述,位于同一个BFC中的相邻两个盒子之间的上下margin会发生折叠。
如果我们想阻止这种情况发生,很容易想到只要让两者位于不同的BFC当中就可以做到了,比如:

  <style>
    .p{
      height: 50px;
      width: 200px;
      margin: 50px 0;
      background: tomato;
    }
    .wrap{
      overflow: hidden;
    }
  </style>
</head>

<body>
  <div class="p"></div>
  <div class="wrap">
    <div class="p"></div>
  </div>
</body>

阻止margin折叠

BFC可以包含浮动的元素
我们都知道在正常的情况下,浮动元素会脱离普通文档流,所以会有下面的代码

<div style="border:1px solid #000000">
    <div style="width:100px;height:100px;background-color:gray;float: left;"></div>
  </div>

会导致父元素塌陷这样的效果:
浮动导致父元素塌陷

外面的div无法包含内部的div,但是如果我们触发外部容器的BFC,根据BFC布局规则,计算BFC高度时,浮动元素也要参与在内,那么外部容器将会包裹着浮动元素,通过这样的方式达到阻止父元素塌陷的效果。我们用最简单的触发BFC的方式,将容器元素的overflow属性值设为非visible

<div style="border:1px solid #000000;overflow:hidden;">
    <div style="width:100px;height:100px;background-color:gray;float: left;"></div>
  </div>

效果图如下:
通过BFC阻止因为浮动导致的父元素塌陷
BFC阻止元素被浮动元素覆盖
如果有这么一段代码:

 <div style="width:100px;height:100px;background:#000;float: left;"></div>
  <div style="width:400px;height:300px;background:sandybrown;"></div>

元素被浮动元素覆盖
之所以会这样是因为BFC布局规则规定,每个元素的左边与包含的盒子的左边相接处,即使存在浮动也是如此。为了防止这种情况发生,同样我们可以通过触发BFC来完成:

 <div style="width:100px;height:100px;background:#000;float: left;"></div>
  <div style="width:400px;height:300px;background:sandybrown;overflow:hidden;"></div>

阻止被浮动元素覆盖
当然别的触发BFC的方式也能达到同样的效果。

  • 16
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值