# 浅谈BFC
为什么会有BFC
?BFC
是什么?如何触发BFC
?BFC
可以解决什么问题?这些问题还有其他解决方案吗?
我们在页面布局时,经常会遇到各种烦人的问题,比如:明明说好了每个元素都是一个打包盒,那么打包盒外的元素应该不会受到打包盒内的元素的影响。可是事实上是这样的吗?
上面这一块高度出问题了。
上面这个两栏布局没有自适应。
上面这个垂直方向的距离好像不太对。
从理论上来讲,被包含在父元素里的元素是不会影响到父元素旁边的元素,但实际上并不总是如此。那有没有什么办法能让里面的元素和外部真正隔离开来呢?也许BFC
可以实现。
# 我们需要明白其概念:
BFC
:Block Formatting Context
(块级格式化上下文)
W3C
对BFC
的解释:它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。当涉及到可视化布局的时候,Block Formatting Context
提供了一个环境,HTML元素在这个环境中按照一定规则进行布局。
但其实我们只需要记住,BFC
的目的就是:形成一个完全独立的空间,让空间中的子元素不会影响到外面的布局。
我们通过为元素设置一些CSS
属性,就能触发这一空间。以下是四种最为常见的触发规则:
float
不为none
position
不为relative
和static
overflow
为auto
、scroll
和hidden
display
的值为table-cell
或inline-block
# 通过BFC
来解决一些常见的问题:
# 第一种问题:解决浮动元素令父元素高度坍塌的问题。
假设页面中有一个父元素含有几个子元素:
当这几个子元素全部设为浮动时:float:left
,会发生父元素高度坍塌
这是因为浮动的这些子元素脱离了文档流,被提起来形成新的VIP队列。而且在这个VIP队列下方的普通队列元素无法触及它,父元素容器也检测不倒它的存在无法被它撑开。
这时候就需要使用上面说到的这些属性来触发BFC
。触发了BFC
的容器就是页面上的一个完全隔离开的容器,容器中的子元素绝对不会影响到外面的元素,触发了BFC
的父元素在计算高度时,不得不让浮动的子元素也参与进来(变向的实现了清除内部浮动的目的)。
# 第二种问题:解决自适应布局的问题
下面这图显示的布局在PC端网页中非常常见。(一般左侧蓝色框定宽,右侧土色框不定宽自适应宽度)
首先我们可以对左边蓝色框设置浮动float:left
,让它脱离文档流,使得同他是兄弟的右边黄色框宽度设为100%
。形成下面这样的布局。
然后我们对黄色框触发BFC
使得里面的元素不受到外界影响。
# 其实还有很多中方法解决这个两列自适应问题
①
②
③
# 第三种问题:解决外边距垂直方向重合问题(外边距坍塌)
我之前在外边距坍塌的文章里面提到过,这里就不多讲了 。