使用 BFC 解决父元素高度塌陷问题
块级格式上下文( Block Formatting Context , BFC )为元素提供了一个独立的布局环境,环境中的内容不会影响到环境外的布局,环境外的布局也不会影响到环境中的内容。 BFC 就像是一个围城的围墙,使得围墙里的东西出不去,围墙外的东西也进不来。
BFC ( Block Formatting Context )即块格式化上下文,它既不是一个 CSS 属性,也不是一段代码,而是 CSS2.1 规范中的一个概念,决定元素的内容如何渲染以及与其它元素的关系和交互。可以将 BFC 想象成一个箱子, BFC 中的内容就相当于箱子中的物品,将物品摆放在箱子中,能避免与其它箱子中的物品混淆,还能保护它们不被破坏。接下来简单概括一下 BFC 的 5 条规则。
- BFC 有隔离作用,内部元素不会受外部元素的影响
- 一个元素只能存在于一个 BFC 中,如果能同时存在于两个 BFC 中,那么就违反了 BFC 的隔离规则
- BFC 内的元素按正常流排列,元素之间的间隙由元素的外边距( margin )控制
- BFC 中的内容不会与外面的浮动元素重叠
- 计算 BFC 的高度,需要包括 BFC 内的浮动子元素的高度
创建 BFC
如果要创建 BFC ,那么必须满足下列条件中的一个 :
- 根元素,也就是 html 元素
- float 属性不为 none 的浮动元素
- position 属性是 absolute 或 fixed 的定位元素
- display 属性为 inline-block 、 table-cell (相当于 td 或 th 元素)、 table-caption (相当于 caption 元素)或伸缩盒( flex 和 inline-flex )的元素
- overflow 属性不为 visible 的块级元素
BFC 的用途
清除浮动 解决外边距塌陷 宽度自适应的两栏布局 inline-block 触发 BFC
当将一个元素设置为行内块元素时会触发 BFC ,此时该元素内部发生的任何变化都只局限于元素内部。因为触发了 BFC ,所以每一个行内块元素都具有"包裹性",当其中存在浮动元素时,行内块元素的"包裹性"就能包住浮动元素,从而起到了清除浮动的作用。当元素不是行内块元素时,可以通过 display:inline-block 的样式代码使之转化为行内块元素,以此来触发元素的 BFC 。
给父元素设置浮动触发 BFC
如果浮动元素的父元素也有浮动属性,此时也能触发父元素的 BFC 机制,从而包含住浮动元素。
如果想让子级与父级的中心点重合,则需要子级的位置向上移动本身高度的一半,和向左移动本身宽度的一半。
- 根据父级进行绝对定位,如果在浏览器中水平垂直居中,那么父级就是 html 元素
- top 值和 left 值为父级的 50%
- inline-block 触发 BFC
hasLayout
hasLayout 是微软的一个私有概念,类似于 BFC ,能够运行在早期的 IE6 和 IE7 中,但在 IE8 及之后的版本中已经被抛弃。在早期的 IE 浏览器中,元素会被分为拥有布局( has layout )和没有布局,拥有布局的元素可以控制自己内容的尺寸和位置,而没有布局的元素需要由最近的拥有布局的祖先元素代劳。 IE6 中的很多 BUG 都是由于元素没有布局所引起的,例如浮动元素会引起双倍外边距(即 10px 的外边距会变成 20px )。可以通过定义特定的 CSS 属性来触发 hasLayout ,使得这个元素拥有布局。