css之BFC是什么

在讲BFC之前先来了解一下FC

FC-Formatting Context

FC全称Formatting Context(格式化上下文),元素在标准流里面都属于一个FC的

官网解释:

Boxes in the normal flow belong to a formatting context,which may be block or inline, but not both simultaneously Block-level boxes participate in a block formatting context(BFC).  Inline-level boxes participate in an inline formatting context(IFC)

大意就是:元素在标准流中属于一个FC,可能是block FC也可能是inline FC,但不可能是同时属于它俩,块级元素属于BFC 行内元素数据IFC

  • 块级元素的布局属于 Block Formatting Context (BFC)
  • 行内元素的布局属于Inline Formatting Context(IFC)

BFC-Block Formatting Context

块级元素所在的那个布局环境就是BFC

MDN上有整理哪些具体情况会创建BFC:以下只是一部分

  • 根元素<html>
  • 浮动元素(元素的float值不是none)
  • 绝对定位或fixed定位元素(元素的position为absolute或fixed)
  • 行内块元素(display:inline-block)
  • 表格单元格(元素的display:table-cell,HTML表格单元格默认为该值),表格标题(元素的display为table-caption,HTML表格标题默认为该值)
  • 匿名表格元素(元素的display为table table-row table-row-group table-header-group table-footer-group (分别是HTML table 、row、tbody、thead、tfoot的默认属性)或inline-table)
  • overflow计算值(Computed)不为visible的块级元素
  • 弹性元素(display为flex或inline-flex元素的直接子元素)
  • 网格元素(display为grid或inline-grid元素的直接子元素)
  • display为flow-root的元素

BFC有什么用?

在BFC中,

元素从顶部开始在垂直方向一个接着一个排列,

相邻的两个元素之间的距离由margin指定。

在同一个BFC中,相邻的两个元素,在垂直方向上的margin会合并折叠

每个元素的左边缘是紧挨着包含块的左边缘的

那么这个东西有什么用呢?

  • 解决margin的折叠问题
  • 解决浮动导致的高度塌陷问题

1如何解决margin折叠问题?产生一个新的BFC,就不会折叠了

<html> 
<head>
 <style>
    .class1 {
      height: 100px;
      width: 300px;
      background-color: orange;
      margin-bottom: 50px;
      overflow: auto;
    }
 
    .class2 {
      height: 100px;
      width: 200px;
      background-color: red;
      margin-top: 50px;
 
    }
  </style>
</head>
<body>
 
 <div class="class1">盒子1</div>
 <div class="class2">盒子2</div>
</body>
</html>

上面盒子1和盒子2同属于html这个BFC

盒子1高100px,         margin-bottom:50px

盒子2也是高100px,  margin-top:50px;

看图所示,两个盒子之间的间距只有50px,margin折叠了

要解决这个问题 就要让两个盒子不属于同一个BFC

给盒子1或者2加属性overflow:auto只是让盒子内部产生了新的BFC,并没有改变两个盒子同属于一个BFC的问题,所以这样改行不通

给盒子1包裹一层div 然后设置div的overflow:auto,这样盒子1属于外层div产生的BFC,而盒子2属于html的BFC,它们属于不同的BFC,就不会出现margin折叠的问题了

2 如何解决高度塌陷问题

<head>
 <style>
    .class2 {
      height: 100px;
      width: 100px;
      background-color: red;
    }
 
    .class3 {
      float: left;
      background-color: blueviolet;
      height: 300px
    }
 
    .container {
      background-color: aquamarine;
      /* overflow: auto; */
    }
  </style>
</head>
 
<body>
  <div class="container">
    <span>span1</span>
    <span>span2</span>
    <div class="class3">盒子3浮动元素</div>
  </div>
  <div class="class2">盒子2</div>
</body>

如图所示,container内有三个元素,两个span 一个div盒子3是浮动元素,由于container自身没有高度,盒子3浮动 导致container高度塌陷,

与container平级的盒子2也被覆盖,看不到

解决container高度塌陷,也会同时清浮动,一举两得

给container加overflow:auto

使container内部产生BFC,就会解决高度塌陷的问题,同时盒子2也会显现出来

注意:BFC只能解决浮动导致的塌陷问题,而绝对定位导致的塌陷是解决不了的

如果盒子3是绝对定位,那是无法解决conatiner高度塌陷的问题

BFC的高度在没设置或者auto的情况下 是如何计算高度的呢?

  • 如果只有行内元素,则行高的距离,行内元素的高度

  • 如果只有块级元素,则是块级元素的高度

  • 如果有绝对定位元素,将被忽略

  • 如果有浮动元素,那么会增加自身高度以包裹这些浮动元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值