BFC 全称是 Block Formatting Context,即块格式化上下文。css
除了 BFC,还有:html
display: grid
display: flex
或display: inline-flex
注意:同一个元素不能同时存在于两个 BFC 中
它是 Web 页面的可视 CSS 渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其余元素交互的区域。怎么理解呢?实际就是说 BFC 是一个渲染区域,而且有本身的一套渲染规则,使其内部布局的元素具备一些特性。git
BFC 提供一个独立的布局环境,BFC 内部的元素布局与外部互不影响。github
CSS 属性值 display 为 block,list-item,table 的元素。布局
块级盒具备如下特性:flex
<li>
,用来存放项目符号如下元素会建立 BFCspa
<html>
)float
不为none
)position
为absolute
或fixed
)display
为 table-caption
,table-cell
)display
为 table
或 inline-table
)display
为 inline-block
)overflow
的值不为 visible
的元素display
为 flex
或 inline-flex
的元素的直接子元素)display
为 grid
或 inline-grid
的元素的直接子元素)以上是 CSS2.1 规范定义的 BFC 触发方式,在最新的 CSS3 规范中,弹性元素和网格元素会建立 F(Flex)FC 和 G(Grid)FC。3d
若是不太理解的,在下面 BFC 的应用我会说起。code
左列浮动(定宽或不定宽均可以),给右列开启 BFC。orm
/* html 代码 */ <div> <div class="left">浮动元素,无固定宽度</div> <div class="right">自适应</div> </div> /* css 代码 */ * { margin: 0; padding: 0; } .left { float: left; height: 200px; margin-right: 10px; background-color: red; } .right { overflow: hidden; height: 200px; background-color: yellow; }
overflow: hidden
,触发 BFC 特性,使其自身与左列的浮动元素隔离开,不占满整行。这便是上面说的 BFC 的特性之一:浮动盒的区域不会和 BFC 重叠
/* html 代码 */ <div> <div class="child1"></div> <div class="child2"></div> </div> /* css 代码 */ * { margin: 0; padding: 0; } .child1 { width: 100px; height: 100px; margin-bottom: 10px; background-color: red; } .child2 { width: 100px; height: 100px; margin-top: 20px; background-color: green; }
两个块级元素,红色 div 距离底部 10px,绿色 div 距离顶部 20px,按道理应该两个块级元素相距 30px 才对,但实际倒是取距离较大的一个,即 20px。
块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的较大者,这种行为称为外边距折叠(重叠),注意这个是发生在属于同一 BFC 下的块级元素之间
根据 BFC 特性,建立一个新的 BFC 就不会发生 margin 折叠了。好比咱们在他们两个 div 外层再包裹一层容器,加属性overflow: hidden
,触发 BFC,那么两个 div 就不属于同个 BFC 了。
/* html 代码 */ <div> <div class="parent"> <div class="child1"></div> </div> <div class="parent"> <div class="child2"></div> </div> </div> /* css 代码 */ .parent { overflow: hidden; } /* ... */
这个关于兄弟元素外边距叠加的问题,除了触发 BFC 也有其余方案,好比你统一只用上边距或下边距,就不会有上面的问题。
这种状况存在父元素与其第一个或最后一个子元素之间(嵌套元素)。
若是在父元素与其第一个/最后一个子元素之间不存在边框、内边距、行内内容,也没有建立块格式化上下文、或者清除浮动将二者的外边距 分开,此时子元素的外边距会“溢出”到父元素的外面。
以下代码:
/* HTML 代码 */ <div id="parent"> <div id="child"></div> </div> /* CSS 代码 */ * { margin: 0; padding: 0; } #parent { width: 200px; height: 200px; background-color: green; margin-top: 20px; } #child { width: 100px; height: 100px; background-color: red; margin-top: 30px; }
如上图,红色的 div 在绿色的 div 内部,且设置了margin-top
为 30px,但咱们发现红色 div 的顶部与绿色 div 顶部重合,并无距离顶部 30px,而是溢出到父元素的外面计算。即原本父元素距离顶部只有 20px,被子元素溢出影响,外边距重叠,取较大的值,则距离顶部 30px。
解决办法:
overflow: hidden
)这样就能实现咱们指望的效果了:
当容器内子元素设置浮动时,脱离了文档流,容器中总父元素高度只有边框部分高度
/* html 代码 */ <div class="parent"> <div class="child"></div> </div> /* css 代码 */ * { margin: 0; padding: 0; } .parent { border: 4px solid red; } .child { float: left; width: 200px; height: 200px; background-color: blue; }
解决办法:给父元素触发 BFC,使其有 BFC 特性:计算 BFC 的高度时,浮动元素也会参与计算
.parent { overflow: hidden; border: 4px solid red; }
上面咱们都是用的overflow: hidden
触发 BFC,由于确实经常使用嘛,可是触发 BFC 也不止是只有这一种方法,如上面写的所示。
好比能够设置float: left
; float: right
; display: inline-block
; overflow: auto
; display: flex
; display:" table
; position
为absolute
或fixed
等等,这些均可以触发,不过父元素宽度表现不必定相同,但父元素高度都被撑出来了。固然实际运用可不是随便挑一个走,仍是根据场景选择。