BFC——"块级格式化上下文"

1、BFC(Block formatting context)"块级格式化上下文"
它是一个独立的与外界隔离的渲染区域, 它规定了内部的盒子如何布局

2.并不是所有的元素模式都能产生BFC,w3c 规范,参考资料:
https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context

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

下列方式会创建块格式化上下文

  • 根元素或包含根元素的元素
  • 浮动元素(元素的 float 不是 none
  • 绝对定位元素(元素的 positionabsolutefixed
  • 行内块元素(元素的 displayinline-block
  • 表格单元格(元素的 displaytable-cell,HTML表格单元格默认为该值)
  • 表格标题(元素的 displaytable-caption,HTML表格标题默认为该值)
  • 匿名表格单元格元素(元素的 displaytable、``table-rowtable-row-group、``table-header-group、``table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table
  • overflow 值不为 visible 的块元素(重点
  • display 值为 [flow-root](https://drafts.csswg.org/css-display/#valdef-display-flow-root) 的元素
  • contain 值为 layoutcontentstrict 的元素
  • 弹性元素(displayflexinline-flex元素的直接子元素)
  • 网格元素(displaygridinline-grid 元素的直接子元素)
  • 多列容器(元素的 column-countcolumn-width 不为 auto,包括 ``column-count1
  • column-spanall 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中(标准变更Chrome bug)。

块格式化上下文包含创建它的元素内部的所有内容.

块格式化上下文对浮动定位(参见 float)与清除浮动(参见 clear)都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。

4、具备生产BFC元素的特点:
有宽度高度, 有外边距margin, 有内边距padding, 有边框border
5、4.BFC布局规则:
5.1.计算BFC的高度时,自然也会检测浮动或者定位的盒子高度。

5.2 内部盒子会在垂直方向, 一个接一个地排列.
5.3.盒子垂直方向的距离由margin决定。属于同一个BFC的两个相邻盒子的margin会发生重叠

5.4.BFC区域不会和float区域重叠

6、BFC应用场景

  • 应用一: 清除浮动
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .father1{
            border: 1px solid #000;
            overflow: hidden;
        }
        .son01{
            float: left;
            width: 200px;
            height: 200px;
            background: red;
        }
    </style>
</head>
<body>

<!--1.-->
<div class="father1">
    <div class="son01"></div>
</div>
</body>
</html>

注意:如果未清除浮动父盒子不会有高度

  • 应用二:清除margin层叠
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
      .father2{
            border: 1px solid #000;
        }
        .son1{
            width: 200px;
            height: 200px;
            background: red;
            margin-bottom: 50px;
        }
        .son2{
            margin-top: 150px;
            width: 200px;
            height: 200px;
            background: blue;
        }
        .test{
            overflow: hidden;
        }
    </style>
</head>
<body>
<div class="father2">
    <div class="test">
        <div class="son1"></div>
    </div>
    <div class="son2"></div>
</div>
</body>
</html>

注意:如果没有产生BFC,会有垂直方向外边距塌陷的现象,即margin层叠

  • 应用三:清除字围现象
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
       .father{
            width: 500px;
            height: 200px;
            border: 1px solid #000;
        }
        .father img{
            float: left;
        }
        .father div{
            /*display: inline-block;*/
            overflow: hidden;
        }
    </style>
</head>
<body>
<div class="father">
    <img src="images/dog.jpg" alt="">
    <div>我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字</div>
</div>
</body>
</html>

字围现象原图对比:


字围现象.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容