CSS BFC原理及其应用
BFC – Block Formatting Context 直译是–块级格式化上下文 它是一个独立渲染区域 只有Block-level box参与 它规定了内部如何布局 并且与这个区域外部毫不相干
解释 BFC 之前 先理解 Box Formatting Context的概念
Box–css布局的基本单位
直观来说 就是一个页面由很多个box组成的 元素的类型和display属性 决定了这个box的类型 不同类型的box 会参与不同的formatting context(一个决定如何渲染文档的容器) 因此box内的元素会以不同的方式渲染 让我们看看有哪些盒子:
– block-level box:display属性为block list-item table的元素 会生成block-level box 并参与block formatting conext
– inline-level box:display属性为inline inline-block inline-table的元素 会生成inline-level box 并参与 inline formatting context
– run-in box 是一个块/行内元素混合 可以使某些块级元素成为下一个元素的行内部分
Formatting Context
是W3C css2 规范中的一个概念 它是页面中的一块渲染区域 并且有一套渲染规则 它决定了其子元素将如何定位 以及和其他元素的关系和相互作用 最常见formatting context有block formatting context(简称BFC)和inline formatting context(简称IFC)
BFC是一个独立的布局环境 其中的元素布局是不受外界的影响 并且在一个BFC中 块盒与行盒都会垂直的沿着其父元素的边框排列
BFC的布局规则
–内部的box会在垂直方向 一个接一个地放置
–box垂直方向的距离由margin决定 属于同一个BFC的两个相邻box的margin会发生重叠
–每个盒子的margin box的左边 与包含border box的左边相接触(对于从左往右的格式化 否则相反) 即使存在浮动也是如此
–BFC的区域不会与float box重叠
–BFC就是页面上的一个隔离的独立容器 容器里面的子元素不会影响到外面的元素 反之也是如此
–计算BFC的高度时 浮动元素也参与计算
如何创建BFC
–float的值不是none
–position的值不是static或者relative
–display的值是inline-block table-cell flex table-caption或者inline-flex
–overflow的值不是visible
BFC的作用
- 利用bfc避免margin重叠
例子
页面的生成效果如下
根据第二条 属于同一个bfc的两个相邻的box会发生margin重叠 所以可以设置 两个不同的bfc 也就是把第二个p用div包起来 然后**它使其成为一个bfc
页面生成效果如下 很明显距离明显拉开了
2. 自适应两栏布局
根据bfc的第三个规则:每个盒子的margin box的左边 也包含快border box的左边相接触 即使存在浮动也是如此
页面效果如下
又因为 bfc的区域不会与float box重叠
让right单独成为一个bfc 只需在 right的样式下加 overflow:hidden
页面效果就如下
right会自动的适应宽度 这时候就形成了一个两栏自适应的布局
3. 清除浮动
当不给父节点设置高度 子节点设置浮动的时候 会发生高度塌陷 这时候就需要清除浮动
例如
页面效果如下
这时候根据最后一条:计算bfc的高度时 浮动元素也参与计算
给父节点**bfc 加入 .par{overflow:hidden} 即可
加入后的页面效果如下
总结:
BFC就是页面上的一个隔离的独立容器 容器里面的子元素不会影响到外面的元素 反之也是如此
因为BFC的内部元素和外部的元素绝对不会互相影响 因此 当BFC外部存在浮动时 它不应该影响BFC内部box的布局 BFC会通过变窄 而不与浮动有重叠
同样的当BFC内部有浮动时 为了不影响外部元素的布局 BFC计算高度时会包括浮动的高度 避免margin重叠也是这样的一个道理