bfc全称是块级格式化上下文(block formating context),是web可视化css渲染的一部分,它是块级盒子的布局发生,浮动互相交互的部分。css
我所理解的bfc本质上是一个透明的箱子,咱们彻底看不到这个箱子,可是这个箱子是独立于外部其余容器而存在的,在这个箱子内部有bfc内部本身的渲染逻辑。html
bfc内的元素一次从上往下排列。web
bfc垂直方向的距离有margin决定,且相邻两个元素宽度会发生折叠布局
bfc内部的元素的左边框老是与容器的左边框重合,浮动也不例外spa
bfc不会与float box重叠code
计算bfc的高度,浮动也会计算在内orm
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。htm
根元素或者包含根源的元素rem
float不为none文档
dispaly为absolute或者fixed
overflow不为visiable
dispaly为inline-block或者table-cell或者table-caption
若是不建立bfc。浮动元素的父元素的高度会是0,给父元素加一个overflow:hidden。能够把父元素设置成bfc,这样能够使这个元素包含其浮动子元素。
//html <div class="floatdiv1"> <p>p1</p> <p>p2</p> </div> <div class="floatdiv2"> <p>p3</p> <p>p4</p> </div> //css .floatdiv1{ width: 200px; overflow: hidden; background-color: green; border: 1px solid red; margin-bottom: 40px; } .floatdiv2{ width: 200px; background-color: yellow; border: 1px solid blue; margin-bottom: 40px; } .floatdiv1 p , .floatdiv2 p{ float: left; width: 50px; background-color: pink; height: 50px; margin: 10px; }
计算bfc的高度的时候,浮动元素也会参与计算。而浮动元素自己是脱离文档流的,非bfc元素的高度计算是不会把浮动元素计算在内。
正常状况下,若是一个块级元素设置成了float,那么他的兄弟元素会环绕其布局。
//html <div class="outer"> <div class="inner1"></div> <div class="inner2"></div> </div> //css .outer{ width: 200px; } .inner1{ float: left; height: 50px; width: 50px; background-color: orange; } .inner2{ background-color: cadetblue; height: 200px; //overflow: hidden; 这里设置overflow的话就会让inner成为一个bfc }
若是inner2设置了overflow属性,看到效果是下面的图
inner会环绕在浮动元素div周围,由于同一个bfc中,元素左边老是触碰到容器的左边,即便存在浮动也是如此。若是不想这样,能够给文字一个overflow:hidden。这样文字所在的区域就成了一个bfc,bfc是不会和float元素重叠的。
外边距折叠的状况:
防止外边距折叠的问题的方法是给bfc内部再写一个bfc。
//外边距折叠的状况 //html <div class="div1"> <p></p> <p></p> <p></p> </div> //css .div1{ width: 200px; background-color: blue; } .div1 p{ height: 50px; margin: 10px 0; background-color: orange; }
解决方案是,把p标签单独写进一个个的bfc里面,好比在p外边包一层overflow是hidden的div。这样的话,两个p标签不属于一个bfc,就不会发生margin折叠的状况。
//html <div class="div1"> <p></p> <p></p> <div class="div2"> <p></p> </div> </div> //css .div1{ width: 200px; background-color: blue; } p{ height: 50px; margin: 10px 0; background-color: orange; overflow: hidden; } .div2{ overflow: hidden; }
//把第三个p标签写进一个bfc中,这样的话,第二个p和第三个p就不会发生折叠,行距是双倍的行距而不是单倍的。
若是上下的外边距都是正的,间隔距离取外边距的最大值
若是上下的外边距都是负的,间隔距离取外边距绝对值大的
若是上下的外边距一正一副,间隔距离是相加的和
元素必须是块级盒子,block,list-item table
元素必须是常规文档流,且处在同一个bfc中
必须是垂直方向上相邻的元素,这两个是触发折叠的必要条件
不处在一个bfc中不会触发bfc
另外,浮动元素,position是absolute或者fixed的元素不会出现这种状况,由于不是常规文档流
若是一个父元素含有padding或border,那么他与其第一个子元素不会发生折叠