企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
BFC (Block formatting context) 就是块级格式上下文,是页面盒模型布局中的一种 CSS 渲染模式,相当于一个独立的容器,里面的元素和外部的元素相互不影响。创建 BFC 的方式有: * 根元素(`<html>`) * 浮动元素(元素的[`float`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/float "此页面仍未被本地化, 期待您的翻译!")不是 `none`) * 绝对定位元素(元素的 [`position`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/position "CSS position属性用于指定一个元素在文档中的定位方式。top,right,bottom 和 left 属性则决定了该元素的最终位置。")为 `absolute` 或 `fixed`) * 行内块元素(元素的 [`display`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display "display CSS 属性指定了元素的显示类型,它包含两类基础特征,用于指定元素怎样生成盒模型——外部显示类型定义了元素怎样参与流式布局的处理,内部显示类型定义了元素内子元素的布局方式。") 为 `inline-block`) * 表格单元格(元素的 [`display`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display "display CSS 属性指定了元素的显示类型,它包含两类基础特征,用于指定元素怎样生成盒模型——外部显示类型定义了元素怎样参与流式布局的处理,内部显示类型定义了元素内子元素的布局方式。")为 `table-cell`,HTML表格单元格默认为该值) * 表格标题(元素的 [`display`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display "display CSS 属性指定了元素的显示类型,它包含两类基础特征,用于指定元素怎样生成盒模型——外部显示类型定义了元素怎样参与流式布局的处理,内部显示类型定义了元素内子元素的布局方式。") 为 `table-caption`,HTML表格标题默认为该值) * 匿名表格单元格元素(元素的 [`display`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display "display CSS 属性指定了元素的显示类型,它包含两类基础特征,用于指定元素怎样生成盒模型——外部显示类型定义了元素怎样参与流式布局的处理,内部显示类型定义了元素内子元素的布局方式。")为 `table、``table-row`、 `table-row-group、``table-header-group、``table-footer-group`(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 `inline-table`) * [`overflow`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/overflow "CSS属性 overflow 定义当一个元素的内容太大而无法适应 块级格式化上下文 时候该做什么。它是 overflow-x 和overflow-y的 简写属性 ")值不为 `visible`的块元素 * [`display`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display "display CSS 属性指定了元素的显示类型,它包含两类基础特征,用于指定元素怎样生成盒模型——外部显示类型定义了元素怎样参与流式布局的处理,内部显示类型定义了元素内子元素的布局方式。")值为`[flow-root](https://drafts.csswg.org/css-display/#valdef-display-flow-root)` 的元素 * [`contain`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/contain "contain 属性允许开发者声明当前元素和它的内容尽可能的独立于 DOM 树的其他部分。这使得浏览器在重新计算布局、样式、绘图或它们的组合的时候,只会影响到有限的 DOM 区域,而不是整个页面。")值为 `layout`、`content`或paint 的元素 * 弹性元素([`display`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display "display CSS 属性指定了元素的显示类型,它包含两类基础特征,用于指定元素怎样生成盒模型——外部显示类型定义了元素怎样参与流式布局的处理,内部显示类型定义了元素内子元素的布局方式。")为 `flex` 或 `inline-flex`元素的直接子元素) * 网格元素([`display`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display "display CSS 属性指定了元素的显示类型,它包含两类基础特征,用于指定元素怎样生成盒模型——外部显示类型定义了元素怎样参与流式布局的处理,内部显示类型定义了元素内子元素的布局方式。")为 `grid` 或 `inline-grid` 元素的直接子元素) * 多列容器(元素的 [`column-count`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/column-count "column-count CSS属性,描述元素的列数。")或 [`column-width`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/column-width "column-width CSS属性建议一个最佳列宽。 列宽是在添加另一列之前列将成为最大宽度。")不为 `auto,包括 ``column-count` 为 `1`) * `column-span` 为 `all` 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中([标准变更](https://github.com/w3c/csswg-drafts/commit/a8634b96900279916bd6c505fda88dda71d8ec51),[Chrome bug](https://bugs.chromium.org/p/chromium/issues/detail?id=709362))。 [传送门](https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context) BFC 主要的作用是: 1. 清除浮动 2. 防止同一 BFC 容器中的相邻元素间的外边距重叠问题 1. 内部box会在垂直方向,一个接一个地放置。 2. Box垂直方向的距离由margin决定,在一个BFC中,两个相邻的块级盒子的垂直外边距会产生折叠。 3. 在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘) 4. 形成了BFC的区域不会与float box重叠 5. 计算BFC高度时,浮动元素也参与计算 BFC作用: 1. 可实现左图右文之类的效果: ~~~html <img src='image.png'> <p>我是超长的文字<p> ~~~ ~~~css img { float:left } p { overflow:hidden } ~~~ 2. 可以解决浮动元素造成的父元素高度塌陷问题: ~~~html <div class='parent'> <div class='float'>浮动元素</div> </div> ~~~ ~~~css .parent { overflow:hidden; } .float { float:left; } ~~~ ## 摘自 [ 第 39 题:介绍下 BFC 及其应用](https://muyiy.cn/question/css/39.html) [块状格式化上下文BFC](https://github.com/alianggu/blog/issues/6)