BFC 的概念
bfc 被称作: 块状格式化上下文,通过创建 bfc 可以创建出一块独立的渲染区域,在这个区域内,bfc 仅仅对于blcok-level
块状水平的 box
起作用,bfc 上下文规定了内部的块状水平 box 如何起作用,并且创建了块状格式化上下文的容器,内部元素的布局方式不会影响到外部的区域,因此,我们可以使用 bfc 的概念实现对于浮动的清除。BFC 的创建
创建块状格式化上下文的方式有以下几种:float
的值不为none
position
的值不为static
或者relative
display
的值为table-cell
table-caption
inline-block
flex
inline-flex
中的其中一个overflow
的值不为visible
(通过设置overflow: hidden
)
BFC 的布局规则
In a block formatting context:在BFC 中:
- boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block boxes in a block formatting context collapse.
- each box's left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box's line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).
- 垂直方向上,内部的 box 元素从包含块的顶部开始一个接一个的布局,两个相邻块之间的垂直距离是有
margin
特性决定的,在相邻的块状元素的垂直margin
上会出现外边距折叠的问题 - 每一个块状元素的左边缘会紧紧跟在包含块的左边缘,甚至当有浮动元素存在的情况下也是一样的道理,除非这个块状元素创建了一个新的 BFC
BFC 的应用
1. 使用 BFC 用来解决外边距折叠问题
外边距折叠是特定的相邻的外边距会形成一个单独的外边距,
collpase margin
发生在下面的这些情况:- 元素为空元素
padding
或者border
为 0no clearance to seperate them
? 什么意思
M-N
原则: 如果两个元素的外边距是正值, 最后得到的坍塌之后的外边距是两个边距的最大值 M
如果两个元素的外边距是负值,最后得到的坍塌之后的外边距是两个边距中的最小值 N
如果外边距是 none
, 得到的坍塌之后的外边距是 0存在边距坍塌的几种情况- 相邻的块状元素之间出现外边距坍塌
- 父元素和内部的子元素出现的外边距坍塌
使用块状格式化上下文解决外边距层叠:css 代码如下 :
1 | <div class="container"> |
container
内部的子元素和父元素的边界坍塌,导致子元素与父元素的边界贴合,并且在子元素之间。两个 div
margin
都设为 10, 最后出现折叠之后的 margin
也变成了 10 ,出现了元素折叠的现象如何解决: 使用 overflow: hidden
创建 bfc当我们给父元素创建 bfc 之后, 1 | .container { |
1 | <div class="container"> |
b2
上创建了一个父元素,给这个父元素创建bfc 最终结果如下: 最终我们可以看到,因为对于 b3
创建了 bfc , 因此, 对于 bfc 内部的元素的布局是不会影响到外部的子元素的 2.使用 BFC 进行浮动的清除
使用 BFC 进行浮动清除的原理还是一样的,利用位于块状上下文中的元素是不会影响到外部元素的特性,防止子元素设置浮动之后,父元素高度为 0 的情况1 | <div class="container"> |
float:left
造成的浮动现象 浮动元素的父元素高度依然存在3. 使用 BFC 实现两栏自适应布局
在存在浮动的情况下,前面我们说过,包含块内部的子元素的左边缘会紧紧贴在其父元素的左边缘,即使存在浮动元素的情况下也是一样的,例如:1 | <body> |
aside
浮动,main
还是会贴在左边缘,如果我们想要实现两栏的自适应布局,如何实现?根据上面的布局规则, 我们可以给 main
创建一个块状格式化上下文,这样,main
的布局就不会受到 aside
元素的影响1 | .main { |