BFC它是一个独立的渲染区域,它规定了内部的Block-level Box如何布局,而且与这个区域外部绝不相干。html
1、BFC布局规则:ide
一、内部的Box会在垂直方向排列。
二、Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
三、每一个元素的margin box的左边, 与包含块border box的左边相接触。
四、BFC的区域不会与float box重叠。
五、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
六、计算BFC的高度时,浮动元素也参与计算。布局
2、哪些元素会生成BFC?flex
一、根元素
二、float属性不为none
三、position为absolute或fixed
四、display为inline-block, table-cell, table-caption, flex, inline-flex
五、overflow不为visiblespa
3、BFC的做用及原理code
自适应两栏布局htm
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BFC</title> <style> body { width: 300px; position: relative; } .aside { width: 100px; height: 150px; float: left; background: #f66; } .main { height: 200px; background: #fcc; /*overflow: hidden;*/ } </style> </head> <body> <div class="aside"></div> <div class="main"></div> </body> </html>
当触发main生成BFC后( 去掉代码中注释便可),这个新的BFC不会与浮动的aside重叠。所以会根据包含块的宽度,和aside的宽度,自动变窄。效果以下rem
清除内部浮动it
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BFC</title> <style> .par { border: 5px solid #fcc; width: 300px; /*overflow: hidden;*/ } .child { border: 5px solid #f66; width:100px; height: 100px; float: left; } </style> </head> <body> <div class="par"> <div class="child"></div> <div class="child"></div> </div> </body> </html>
为达到清除内部浮动,咱们能够触发par生成BFC( 去掉代码中注释便可),那么par在计算高度时,par内部的浮动元素child也会参与计算。效果以下io
防止垂直 margin 重叠
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BFC</title> <style> .wrap { /*overflow: hidden;*/ } p { color: #f55; background: #fcc; width: 200px; line-height: 100px; text-align: center; margin: 100px; } </style> </head> <body> <body> <p>Haha</p> <div class="wrap"> <p>Hehe</p> </div> </body> </body> </html>
咱们能够在p外面包裹一层容器,并触发该容器生成一个BFC( 去掉代码中注释便可)。那么两个P便不属于同一个BFC,就不会发生margin重叠了。效果以下