隐居以求其志,行义以达其道
BFC
BFC

BFC

BFC概念

BFC全称:Block Formatting Context, 块级格式化上下文

BFC形成一个完全独立的容器,容器里的元素不管如何布局都不会影响容器外部

如何触发BFC

  • 根元素(<html>
  • 浮动元素(float 值不为 none
  • 绝对定位元素(position 值为 absolute 或 fixed
  • 行内块元素(display 值为 inline-block
  • 表格单元格(display 值为 table-cell,HTML 表格单元格默认值)
  • 表格标题(display 值为 table-caption,HTML 表格标题默认值)
  • 匿名表格单元格元素(display 值为 tabletable-row、 table-row-grouptable-header-grouptable-footer-group(分别是 HTML table、tr、tbody、thead、tfoot 的默认值)或 inline-table
  • overflow 值不为 visibleclip 的块元素
  • display 值为 flow-root 的元素
  • contain 值为 layoutcontent 或 paint 的元素
  • 弹性元素(display 值为 flex 或 inline-flex 元素的直接子元素),如果它们本身既不是 flexgrid 也不是 table 容器
  • 网格元素(display 值为 grid 或 inline-grid 元素的直接子元素),如果它们本身既不是 flexgrid 也不是 table 容器
  • 多列容器(column-count 或 column-width (en-US) 值不为 auto,包括column-count 为 1
  • column-span 值为 all 的元素始终会创建一个新的 BFC,即使该元素没有包裹在一个多列容器中 (规范变更Chrome bug)

BFC规则

  • 包含内部浮动,浮动参与高度计算
  • 排除外部浮动
  • 阻止margin重叠

BFC应用

  • 防止浮动导致父元素高度塌陷(等同父元素添加clearfix伪元素)
  • 阻止margin重叠,阻止子元素margin-top,margin-bottom溢出(父元素有padding/border不会溢出)(clearfix无法阻止溢出),从而阻止了子元素和外部元素的margin重叠
  • 两栏布局-float元素会遮盖兄弟元素(其中的文本不会),兄弟元素创建一个BFC即可阻止遮盖,形成两栏布局