它是Block Formatting Context(块级格式化上下文)的简称。css
Formatting context是指页面中的一块渲染规则,它决定了其子元素将如何定位,以及和其余元素的关系和相互做用。
最多见的Formatting cocntext 有Block formatting context(简称BFC)和Inline formatting (简称IFC).浏览器
BFC是指一个独立的块级渲染区域,只有Block-level Box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。
BFC就是一种布局方式,能够理解为一个做用范围,即在一个BFC里的布局与其以外的布局不相关或者说不相互影响。ide
使用必定的CSS声明能够生成BFC,浏览器对生成的BFC有一系列的渲染规则,利用这些渲染规则咱们能够达到必定的布局效果,为了达到特定的布局效果咱们让元素生成BFC。布局
当一个HTML元素知足下面条件的任何一点,均可以生成Block formatting context.flex
overflow : scroll(可能会显示没必要要的滚动条)
overflow : hidden(将会剪掉溢出的元素,不须要给BFC元素设置宽度)
display : flex
float : left(将会把元素置于它的左边,其余元素环绕着它)
display : table-cell(必须给BFC元素设置无限大的宽度)3d
body{ width:300px; } .aside{ width:100px; height:150px; float:left; background:#f66; } .main{ height:200px; background:#ffc; overflow:hidden; }
<body> <div class="aside"></div> <div class="main"></div> </body>
效果以下:
code
在不加overflow:hidden;以前的效果:
orm
由于根据BFC布局规则第三条可知道:
每一个元素的margin box的左边,与包含块border box的左边相接处(对于从左到右的格式化,不然相反)。虽然存在浮动的元素aside,但main的左边依然会与包含块的左边相接处。blog
在加了overflow : hidden 以后aside就造成了一个BFC,这个新的BFC不会与浮动的aside重叠,main会根据包含块的宽度,和aside的宽度,自动边窄。it
.parent{ width:300px; border:5px solid #fcc; } .child{ width:100px; height:100px; border:5px solid #f66; float:left; }
<div class="parent"> <div class="child"></div> <div class="child"></div> </div>
结果:
缘由是:计算BFC的高度时,浮动元素也参与计算
改变的方法是:为达到清除内部浮动,咱们能够触发parent生成BFC,那么parent在计算高度时,parent内部的浮动元素child也会参与计算。
.parent{ width:300px; border:5px solid #fcc; overflow:hidden; }
结果是:
p{ color:#f55; background:#fcc; width:200px; line-height:100px; text-align:center; margin:100px; }
<p>Haha</p> <p>HeHe</p>
结果以下:
解决办法:
p{ color:#f55; background:#fcc; width:200px; line-height:100px; text-align:center; margin:100px; } .ddd{ overflow:hidden; }
<p>Haha</p> <div class="ddd"> <p>HeHe</p> </div>
结果:
缘由就是:BFC布局规则的第二条;
Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
现象:两个p之间的距离为100px,发送了margin重叠。
解决方案:咱们能够在p外面包裹一层容器,并触发该容器生成一个BFC,那么两个p便不属于同一个BFC,就不会发生margin重叠。
在这里总结了一下,就是,若是一旦造成BFC,那么这个BFC就是一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。