W3C关于BFC的一个解释:css
看起来比较蛋疼是吧,另外一个通俗点的解释是:在普通流中的 Box(框) 属于一种 formatting context(格式化上下文) ,类型能够是 block ,或者是 inline ,但不能同时属于这二者。而且, Block boxes(块框) 在 block formatting context(块格式化上下文) 里格式化, Inline boxes(块内框) 则在 inline formatting context(行内格式化上下文) 里格式化。任何被渲染的元素都属于一个 box ,而且不是 block ,就是 inline 。即便是未被任何元素包裹的文本,根据不一样的状况,也会属于匿名的 block boxes 或者 inline boxes。因此上面的描述,便是把全部的元素划分到对应的 formatting context 里。浏览器
那BFC究竟是啥?就是一个做用范围。能够把它理解成是一个独立的容器,而且这个容器的里box的布局,与这个容器外的绝不相干。布局
简单地说:Block Formatting Context就是页面上的一个隔离的独立容器,容器里面的子元素不会在布局上影响到外面的元素,反之也是如此。orm
看看BFC的触发条件get
而BFC的特性是it
第一个margin不会叠加的特性,能够理解为两个处于普通流的盒子,会有margin叠加的问题,是由于他们属于相同的BFC,当他自身建立了一个新的BFC时,这个问题就不存在了io
第二个特性就特别有用了,由于元素触发了BFC的话,就不会被float元素覆盖,当子元素所有浮动的时候也可以正确地包含了table
可是在 IE6 IE7 IE8(Q) 中没有触发 hasLayout 并在其余浏览器中建立了 Block Formatting Context 的元素的表现会有差别。具体能够参考w3helpform
保险的解决方案就是既触发IE的hasLayout,又触发BFC,具体的css就是既overflow:hidden,又zoom:1(虽然zoom并不能经过校验),另外overflow还有一个问题就是会影响盒子的表现class
相对于常常要限宽,还有一大堆BUG的float来布局,用BFC来布局会至关方便