BFC布局规则:
简单示例:1.自适应两栏布局代码如下:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>BFC</title><style>body{width:350px;position:relative;}div.sidebar{float:left;width:100px;height:200px;background-color:#9deaf1;}div.main{height:300px;background-color:#5dc2f6;}</style></head><body><div class="sidebar"></div><div class="main"></div></body></html>
页面效果图:
上述示例,正好反映了BFC布局规则:每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。所以,sidebar虽然存在浮动,但main的左边依然与包含块的左边相接触。
2.BFC的区域不会与float box重叠。示例如下:
代码:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>BFC</title><style>body{width:350px;position:relative;}div.sidebar{float:left;width:100px;height:200px;background-color:#9deaf1;}div.main{height:300px;background-color:#5dc2f6;overflow:hidden;}</style></head><body><div class="sidebar"></div><div class="main"></div></body></html>
页面效果图:通过overflow:hidden;触发main的BFC,main区域没有与float的sidebar重叠。说明了BFC的区域不会与float box重叠。
3.计算BFC的高度时,浮动元素也参与计算。
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>BFC</title><style>div.wrapper{width:300px;border:2px solid #5dc2f6;}div.box{width:100px;height:200px;background-color:#9deaf1;border:2px solid #5dc2f6;float:left;}</style></head><body><div class="wrapper"><div class="box"></div><div class="box"></div></div></body></html>
页面效果图:
我们通过
div.wrapper{width:300px;border:2px solid #5dc2f6;overflow:hidden;}
overflow:hidden; 触发wrapper的BFC,清除box的浮动带来的影响,得到的页面效果图如下:
因此说明:计算BFC的高度时,浮动元素也参与计算。
4.清除垂直边距重叠
代码:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>BFC</title><style>div.box{width:100px;height:100px;background-color:#9deaf1;border:2px solid #5dc2f6;}div.m50{margin-bottom:50px;}div.m100{margin-top:100px;}</style></head><body><div class="box m50"></div><div class="box m100"></div></body></html>
页面效果图如下:
如图所示,Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。所以,两个div的垂直距离变成了100px,而不是150px了。
如果我们给第二个div套上一层wrapper,并且触发外层的BFC,那么两个div就不是同一个BFC的两个相邻的Box了,而是变成两个独立的BFC。
代码:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>BFC</title><style>div.box{width:100px;height:100px;background-color:#9deaf1;border:2px solid #5dc2f6;}div.wrapper{overflow:hidden;}div.m50{margin-bottom:50px;}div.m100{margin-top:100px;}</style></head><body><div class="box m50"></div><div class="wrapper"><div class="box m100"></div></div></body></html>
页面效果图如下:
垂直边距不再重叠,不是100px,而是150px了。
总结
以上事例都证明了:BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,所以BFC通过改变自己的宽度,实现不与浮动box有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。
一. 在触发 hasLayout 的元素和创建了 Block Formatting Contexts 的元素中,浮动元素参与高度的计算
情况1:没有创建 Block formatting contexts 的块级非替换元素,触发了 IE 的 hasLayout。
分析以下代码:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>hasLayout 和 BFC</title><style>div.wrapper{width:300px;}div#container{background-color:#9deaf1;zoom:1;}span#span1{background-color:#5dc2f6;}div#div1{width:150px;height:50px;background-color:#0576b0;}div#div2{float:left;background-color:#4dd5b3;}</style></head><body><div class="wrapper"> <div id="container"> <span id="span1">simple text</span><div id="div1">in flow</div><div id="div2">float:left</div></div></div></body></html>
根据 CSS2.1 规范第 10.6.3部分的高度计算规则,在进行普通流中的块级非替换元素的高度计算时,浮动子元素不参与计算。
所以,在进行 container 高度计算时,只受 span1 和 div1的影响,应该是它们两个的高度之和,所以最终container 的高度不包括div2的高度。
页面效果图在各浏览器的效果如下:IE6 IE7:
IE8 Firefox Chrome Safari Opera:
当去掉container的zoom:1;各浏览器表现一致:
情况2:创建了 BFC的块级非替换元素,未触发 IE 的 hasLayout。
代码如下:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>hasLayout 和 BFC</title><style>div.wrapper{width:300px;}div#container{background-color:#9deaf1;overflow:hidden;}span#span1{background-color:#5dc2f6;}div#div1{width:150px;height:50px;background-color:#0576b0;}div#div2{float:left;background-color:#4dd5b3;}</style></head><body><div class="wrapper"> <div id="container"> <span id="span1">simple text</span><div id="div1">in flow</div><div id="div2">float:left</div></div></div></body></html>
页面效果图如下:
IE6:
IE7/IE8/Firefox/Chrome/Safari/Opera
可见,只要 container 创建了 BFC,其浮动子元素就会参与其高度计算(IE7是由于触发了hasLayout 导致与其它浏览器的效果相同)。
二.与浮动元素相邻的、触发了 hasLayout 的元素或创建了 BFC 的元素,都不能与浮动元素相互覆盖。
与浮动元素相邻的、触发了 hasLayout 的元素或创建了 Block formatting contexts的元素,都不能与浮动元素相互覆盖。如果浮动元素的两侧有足够的空间放置该元素,则元素会紧邻浮动元素放置,必要时,该元素的宽度将会被压缩。否则它们可能会定位到浮动元素的下方。
情况1:没有创建BFC的块级非替换元素,触发了 IE 的 hasLayout。
代码:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>hasLayout 和 BFC</title><style>div#container{border:2px solid #ddd;width:300px;height:150px;backgrou
新闻热点
疑难解答