格式化上下文简介
本文介绍了格式化上下文的概念,它有多种类型,包括块级格式化上下文、内联格式化上下文和弹性格式化上下文。还介绍了它们的基本行为以及如何利用这些行为。
页面上的所有内容都是 **格式化上下文** 的一部分,或者说是一个为以特定方式布局内容而定义的区域。**块级格式化上下文** (BFC) 会根据块级布局规则布局子元素,**弹性格式化上下文** 会将子元素布局为 弹性项目 等。每个格式化上下文都有关于该上下文中的布局行为的特定规则。
块级格式化上下文
使用块级布局规则的文档中最外层的元素建立第一个或 **初始块级格式化上下文**。这意味着 <html>
元素的块内每个元素都根据正常流进行布局,遵循块级和内联布局的规则。参与 BFC 的元素使用 CSS 盒子模型概述的规则,该模型定义了元素的边距、边框和填充如何与同一上下文中的其他块交互。
创建新的块级格式化上下文
<html>
元素不是唯一能够创建块级格式化上下文的元素。任何块级元素都可以通过应用某些 CSS 属性来创建 BFC。
在以下情况下会创建一个新的 BFC
- 使用
float
使元素浮动 - 绝对定位 的元素
- 具有
display: inline-block
的元素 - 表格单元格或具有
display: table-cell
的元素,包括使用display: table-*
属性创建的匿名表格单元格 - 表格标题或具有
display: table-caption
的元素 overflow
具有visible
以外的值的块级元素- 具有
display: flow-root
或display: flow-root list-item
的元素 - 具有
contain: layout
、content
或strict
的元素 - 弹性项目
- 网格项目
- 多列容器
- 具有设置为
all
的column-span
的元素
这很有用,因为新的 BFC 的行为就像最外层的文档一样,它成为主布局中的一个迷你布局。BFC 包含其中的所有内容,float
和 clear
只适用于同一格式化上下文中的项目,边距只会在同一格式化上下文中的元素之间折叠。
BFC 创建示例
让我们看一下其中几个,看看创建新 BFC 的效果。
在下面的示例中,我们有一个在带边框的 `<div>` 中的浮动元素。该 `<div>` 的内容与浮动元素并排浮动。由于浮动内容的高度比其旁边的内容高,因此 `<div>` 的边框现在穿过浮动元素。正如关于流内和流外元素的指南中所述,浮动元素已从流中移除,因此 `div` 的背景和边框仅包含内容,而不包含浮动元素。
创建新的 BFC 将包含浮动元素。过去常用的方法是设置 `overflow: auto` 或设置除 `overflow: visible` 的初始值以外的其他值。
设置 `overflow: auto` 创建了一个包含浮动元素的新 BFC。现在,我们的 `<div>` 成为布局内部的迷你布局。任何子元素都将包含在其中。
使用 `overflow` 创建新 BFC 的问题在于,`overflow` 属性用于告诉浏览器您希望如何处理溢出内容。在某些情况下,您会发现当纯粹使用此属性创建 BFC 时,会出现不需要的滚动条或裁剪的阴影。此外,它可能对未来的开发人员来说可读性不强,因为他们可能不清楚为什么您将 `overflow` 用于此目的。如果您这样做,最好对代码进行注释以说明原因。
使用 `display: flow-root` 明确创建 BFC
内联格式化上下文
其他格式化上下文
本指南涵盖流式布局,因此不涉及其他可能的格式化上下文。因此,了解创建任何类型的格式化上下文都会改变该格式化上下文内元素的行为非常有用。这种行为始终在规范中描述,并且也在这里在 MDN 上描述。
总结
在本指南中,我们更详细地介绍了块级和行内格式化上下文以及创建块级格式化上下文 (BFC) 的重要主题。在下一份指南中,我们将了解正常流如何与不同的书写模式交互。