BFC是什么

BFC  (Block Fomatting Context)

一、定义

块级格式化上下文。 block-level box(块级元素) + formatting context(一个决定如何渲染文档的容器) 。

它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

Box 定义:

css布局的对象和基本单位。不同类型box内的元素会以不同的方式渲染。

Box分类:

1、display属性为 block, list-item, table 的元素,会生成block-level box;并且参与 block fomatting context

2、display 属性为 inline, inline-block, inline-table 的元素,会生成inline-level box。并且参与 inline formatting context

Fomatting Context 

Formatting context是W3C CSS2.1规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系、相互作用。

最常见的 Formatting context 有 Block fomatting context (简称BFC)Inline formatting context(简称IFC)

二、BFC布局规则

1、内部的Box会在垂直方向上一个接一个的放置。

2、垂直方向上的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。

3、每个元素的左外边距与包含块(父元素)的左边界相接触(从左向右时),即使浮动元素也是如此。

4、BFC的区域不会与float的元素区域重叠

5、计算BFC的高度时,浮动子元素也参与计算

6、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然。

三、BFC的创建

1、float的值不是none。

2、position的值不是static或者relative。

3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex    注:display:table也认为可以生成BFC,主要原因在于table会默认生成一个匿名的table-cell,正是这个匿名的table-cell生成了BFC

4、overflow的值不是visible

5、根元素会自动创建BFC

语言描述:浮动元素和绝对定位元素,非块级盒子的块级容器,以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。

四、BFC的应用

1、利用BFC避免margin重叠

  场景:一个div内俩个p子元素设置了margin:10px,结果会显示俩个子元素垂直方向间距为10px,实际应为20px  注意:如果第一个p子元素margin:8px;那么子元素垂直方向间距为10px,以最大数值为准。      

  原因:属于同一个BFC的两个相邻的Box会发生margin重叠     

  解决:将第二个子元素放进新的div标签内,相当于激活第二个子元素在一个新的BFC内    或者  将2个子元素设置display:inline-block;此时每个子元素都生成一个BFC  

  解决原理:生成 BFC 的元素不会和在流中的子元素发生空白边折叠

2、自适应俩栏布局

  场景:一个div内有div.left和div.right,其中.left设置width,height,float:left; .right只设置高度,会出现div.left和div.right的左上角是重合的。

  原因:每个盒子的margin box的左边,与包含块(父块)border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此(尽管一个元素的内容区域会由于浮动而压缩–包裹性)。

  解决:.right添加overflow:hidden,使之单独成为一个BFC。 同时.right会自动的适应宽度,这时候就形成了一个两栏自适应的布局。

  解决原理:BFC的区域不会与float box重叠。

  多栏布局同理,可以.left{float:left;xxpx;} .right{float:right;xxpx;}  .center{overflow:hidden;height:yypx;}  会实现 左右两栏宽度固定,中间栏根据浏览器宽度自适应。

3、清除浮动

  场景:父元素div只设置width,俩个div子元素设置width,height,float:left; 会出现父元素高度未随子元素展开。

  原因:当不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷

  解决:清除浮动,给父元素设置overflow:hidden;

  解决原理:计算BFC的高度时,浮动子元素也参与计算。

总结:BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。

 

原文地址:https://www.cnblogs.com/redFeather/p/15109429.html