CSS 盒模型模块 第 3 级

W3C 推荐标准,

更多关于此文档的详情
此版本:
https://www.w3.org/TR/2024/REC-css-box-3-20240411/
最新发布版本:
https://www.w3.org/TR/css-box-3/
编辑草案:
https://drafts.csswg.org/css-box-3/
以前的版本:
历史记录:
https://www.w3.org/standards/history/css-box-3/
实现报告:
https://wpt.fyi/results/css/css-box
反馈:
CSSWG 问题库
CSSWG GitHub
编辑:
Elika J. Etemad / fantasai (Apple)
建议编辑此规范:
GitHub 编辑
勘误:
https://www.w3.org/Style/2024/REC-css-box-3-20240411-errata.html

摘要

本规范描述了边距和内边距属性,这些属性在CSS盒子内外创建间距。

CSS是一种用于描述结构化文档(例如HTML和XML)在屏幕、纸张等上的呈现的语言。

本文档的状态

本节描述了本文档在发布时的状态。 当前W3C出版物列表和此技术报告的最新修订版 可以在 W3C技术报告索引 https://www.w3.org/TR/. 中找到。

本文档由 CSS工作组 作为推荐标准使用 推荐轨道 发布。

W3C推荐规范是经过广泛共识构建后,由 W3C 及其成员认可的规范, 并且工作组成员承诺为实现 免版税许可。

W3C建议广泛部署此规范作为Web的标准。

请通过 在GitHub中提交问题(优选)来反馈意见, 在标题中包括规范代码“css-box”,如:“[css-box] …评论摘要…”。 所有问题和评论都在 存档。 或者,可以将反馈发送到公共邮件列表(存档) www-style@w3.org 。

本文档受 2023年11月03日 W3C流程文档 管辖。

本文档由在 W3C专利政策 下运作的团体制作。 W3C维护了与该团体的交付物相关的任何专利披露的 公共列表; 该页面还包括披露专利的说明。 知道包含 必要声明 专利的个人必须按照 W3C专利政策第6节 披露信息。

1. 介绍

本小节非规范性。

CSS 描述了如何通过将元素树 转换为一组盒子来布局源文档中的每个元素和每个文本字符串,这些盒子的大小、位置和在画布上的堆叠层级取决于它们的 CSS 属性值。

注意: CSS 级联和继承描述了属性如何分配给盒子树中的元素, 而CSS Display 3 § 1 介绍描述了元素树如何转换为盒子树。

每个 CSS 盒子 都有一个矩形的内容区域, 其内容周围有一条填充带, 填充带周围有一个边框, 边框外有一个边距。 尺寸属性 [css-sizing-3], 以及控制布局的各种其他属性, 定义了内容区域的大小。 盒子样式属性—​填充及其长格式属性,边框及其长格式属性, 以及边距及其长格式属性—​定义了这些其他区域的大小。

边距和填充在本模块中定义。边框同样在[css-backgrounds-3]中定义。

注意:本模块仅定义了物理每侧的长格式属性。 另外,流相关 长格式属性在[css-logical-1]中定义。 请注意,这两组长格式属性控制相同的边距/填充: 它们只是不同的侧面索引方式。

CSS 盒子模块的历史和块布局的定义

该模块最初包含与盒子生成(现定义在[css-display-3]), 盒模型(此处定义), 以及块布局(现在仅定义在[CSS2]第9章和第10章)有关的CSS第3级规范文本。 由于在开发CSS2.1期间其维护工作被搁置, 到CSS2修订版1最终完成时,其文本已经严重过时。 因此,块布局部分的文本已被淘汰, 以便重新同步到CSS2并更新, 以便在未来某个时间点作为新块布局模块的输入。 它被拆分出来 以及CSS Display模块, 一方面是出于实际考虑,即工作量将非常巨大, 另一方面是考虑到CSS现在有多个布局模型 (弹性布局,网格布局,定位布局, 以及表格布局, 除了块布局外) 这些都值得拥有自己独立的模块。

1.1. 值定义

本规范遵循CSS 属性定义惯例,使用来自[CSS2]的值定义语法。 本规范未定义的值类型在CSS值与单位[CSS-VALUES-3]中定义。 与其他CSS模块的组合可能会扩展这些值类型的定义。

除了在其定义中列出的特定于属性的值外, 本规范中定义的所有属性 也接受 CSS-wide关键字 作为其属性值。 为了可读性,它们没有被明确地重复列出。

1.2. 模块交互

本模块取代了在[CSS2]第8.1、8.2、 8.3(但不包括8.3.1)和8.4节中定义的边距和内边距属性的定义。

本模块中的所有属性适用于::first-line 和 ::first-letter伪元素。

2. CSS 盒模型

每个盒子都有一个内容区域 (其中包含其内容—文本、后代盒子、图像或其他替换元素内容等) 以及可选的周围填充区域、边框区域, 和边距区域; 每个区域的大小由相应的属性指定, 并且可以为零 (在边距的情况下,也可以为负)。 下图显示了这些区域之间的关系 以及用于指代盒子各个部分的术语:

一个典型盒子的图示,显示了内容、填充、边框和边距区域

典型盒子的各个区域和边缘。

盒子的内容、填充和边框区域的背景 由其背景属性指定。 边框区域还可以使用边框 属性进行边框样式的绘制。 边距总是透明的。 参见[css-backgrounds-3]。

边距、边框和填充可以分为 上、右、下和左部分, 每个部分可以由其对应的属性独立控制。

2.1. 盒子和边缘

每个区域的周边 (内容、填充、边框和边距) 被称为边缘, 每个边缘可以分为 上、右、下、左四个侧面。 因此,每个盒子 有四个边缘,每个边缘由四个侧面组成:

内容边缘 或 内边缘
内容边缘围绕着 由盒子的宽度和高度给出的矩形, 这通常取决于元素的内容 和/或其包含块的大小。 内容边缘的四个侧面共同 定义了盒子的内容盒。
填充边缘
填充边缘围绕着 盒子的填充部分。 如果填充在某一侧的宽度为零, 则该侧的填充边缘与内容边缘重合。 填充边缘的四个侧面共同 定义了盒子的填充盒, 它包含了内容和填充区域。
边框边缘
边框边缘围绕着盒子的边框。 如果边框在某一侧的宽度为零, 则该侧的边框边缘与填充边缘重合。 边框边缘的四个侧面共同 定义了盒子的边框盒, 它包含了盒子的内容、填充, 和边框区域。
边距边缘 或 外边缘
边距边缘围绕着盒子的边距。 如果边距在某一侧的宽度为零, 则该侧的边距边缘与边框边缘重合。 边距边缘的四个侧面共同 定义了盒子的边距盒, 它包含了盒子的所有内容、填充、边框, 和边距区域。

2.2. 碎片化

当一个盒子碎片化时——如跨行或跨页被分割为单独的盒子碎片——其所有的盒子 (内容盒、填充盒、边框盒、边距盒) 也会碎片化。 内容/填充/边框/边距区域如何应对碎片化 在[css-break-3]中指定,并由box-decoration-break属性控制。

2.3. 盒边缘关键字

以下<box> CSS 关键字被定义用于需要引用各种盒边缘的属性(例如transform-box 和 background-clip):

content-box
指的是内容盒或 内容边缘。 (在SVG上下文中,被视为fill-box。)
padding-box
指的是填充盒或 填充边缘。 (在SVG上下文中,被视为fill-box。)
border-box
指的是边框盒或 边框边缘。 (在SVG上下文中,被视为stroke-box。)
margin-box
指的是边距盒或 边距边缘。 (在SVG上下文中,被视为stroke-box。)
fill-box
指的是对象边界框或其边缘。 (在CSS盒上下文中,被视为content-box。)
stroke-box
指的是描边边界框或其边缘。 (在CSS盒上下文中,被视为border-box。)
view-box
指的是最近的SVG 视口元素的原点框, 这是一个具有初始SVG宽度和高度的矩形用户坐标系,由该元素的viewBox属性建立, 其左上角定位在坐标系原点。 (在CSS盒上下文中,被视为border-box。)

注意:当viewBox包含非零min-x或min-y偏移时, 该原点框实际上并不对应由 viewBox定义的可见区域矩形!

为了方便起见,定义了以下值类型 以表示常用的<box>的子集:

<visual-box> = content-box | padding-box | border-box
<layout-box> = <visual-box> | margin-box
<paint-box> = <visual-box> | fill-box | stroke-box
<coord-box> = <paint-box> | view-box

3. 边距

边距围绕着盒子的边框边缘, 在盒子之间提供间距。 边距属性指定了盒子的边距区域的厚度。 margin 简写属性设置所有四个边的边距, 而边距长格式属性只设置各自的边。 本节定义了物理边距长格式。 (附加的流相关边距长格式在[css-logical-1]中定义。)

注意: 块布局中的相邻边距可能会折叠。 详见CSS2§8.3.1 边距折叠。 此外,与碎片化断点相邻的边距有时会被截断。 详见CSS Fragmentation 3 § 5.2 断点处的相邻边距。

3.1. 页面相关(物理)边距属性:margin-top、 margin-right、margin-bottom 和 margin-left 属性

名称: margin-top、margin-right、margin-bottom、margin-left
值: <length-percentage> | auto
初始值: 0
适用于: 所有元素,内部表元素除外
是否继承: 否
百分比: 相对于包含块的逻辑宽度
计算值: 关键字auto或计算的<length-percentage>值
规范顺序: 按照语法
动画类型: 按计算值类型
逻辑属性组: margin

这些属性分别设置了边距的上、右、下、左侧的盒子。

边距属性允许使用负值, 但可能存在特定实现的限制。

注意: 本规范未定义对内部ruby盒子的应用,详见[CSS-RUBY-1]。

3.2. 边距简写:margin 属性

名称: margin
值: <'margin-top'>{1,4}
初始值: 0
适用于: 参见各个属性
是否继承: 否
百分比: 相对于包含块的逻辑宽度
计算值: 参见各个属性
规范顺序: 按照语法
动画类型: 按计算值类型

margin 属性是用于同时设置margin-top、margin-right、margin-bottom 和 margin-left 的简写属性。

如果只有一个组件值, 它适用于所有边。 如果有两个值, 第一个值应用于上下边距, 第二个值应用于左右边距。 如果有三个值, 第一个值应用于上边, 第二个值应用于左右边, 第三个值应用于下边。 如果有四个值, 它们分别适用于上、右、下、左四个边。

以下代码展示了一些可能的margin声明。
body { margin: 2em }         /* 所有边距均设置为2em */
body { margin: 1em 2em }     /* 上下=1em,左右=2em */
body { margin: 1em 2em 3em } /* 上=1em,右=2em,下=3em,左=2em */

上面例子的最后一条规则相当于下面的例子:

body {
margin-top: 1em;
margin-right: 2em;
margin-bottom: 3em;
margin-left: 2em; /* 从对面(右边)复制过来 */
}

4. 填充

填充被插入在盒子的内容边缘 和填充边缘之间, 在内容和边框之间提供间距。 填充属性指定了盒子的填充区域的厚度。 padding 简写属性设置所有四个边的填充, 而填充长格式属性只设置各自的边。 本节定义了物理填充长格式。 (附加的流相关填充长格式在[css-logical-1]中定义。)

注意: 盒子上指定的背景 默认情况下在填充边缘内布局并绘制。 (它们还会在边框下方绘制, 在边框区域中。) 此行为可以通过使用background-origin 和 background-clip 属性进行调整。

4.1. 页面相关(物理)填充属性:padding-top、padding-right、padding-bottom 和 padding-left 属性

名称: padding-top、padding-right、padding-bottom、padding-left
值: <length-percentage [0,∞]>
初始值: 0
适用于: 所有元素,内部表元素除外,表格单元格除外
是否继承: 否
百分比: 相对于包含块的逻辑宽度
计算值: 计算的<length-percentage>值
规范顺序: 按照语法
动画类型: 按计算值类型
逻辑属性组: padding

这些属性分别设置了填充的上、右、下、左侧的盒子。

填充属性的负值是无效的。

注意: 本规范未定义对内部ruby盒子的应用,详见[CSS-RUBY-1]。

4.2. 填充简写:padding 属性

名称: padding
值: <'padding-top'>{1,4}
初始值: 0
适用于: 参见各个属性
是否继承: 否
百分比: 相对于包含块的逻辑宽度
计算值: 参见各个属性
规范顺序: 按照语法
动画类型: 按计算值类型

padding 属性是用于同时设置padding-top、padding-right、padding-bottom 和 padding-left 的简写属性。

如果只有一个组件值, 它适用于所有边。 如果有两个值, 第一个值应用于上下填充, 第二个值应用于左右填充。 如果有三个值, 第一个值应用于上边, 第二个值应用于左右边, 第三个值应用于下边。

以下代码展示了一些可能的padding声明。
body { padding: 2em }         /* 所有填充均设置为2em */
body { padding: 1em 2em }     /* 上下=1em,左右=2em */
body { padding: 1em 2em 3em } /* 上=1em,右=2em,下=3em,左=2em */

上面例子的最后一条规则相当于下面的例子:

body {
padding-top: 1em;
padding-right: 2em;
padding-bottom: 3em;
padding-left: 2em; /* 从对面(右边)复制过来 */
}

5. 边框

边框填充了 边框区域, 以视觉上区分盒子的边缘。 边框属性 指定了盒子的边框区域的厚度, 以及它的绘制样式和颜色。 详见[css-backgrounds-3]中对这些属性的定义, 包括它们的物理长格式属性。 (附加的流相关边框长格式属性在[css-logical-1]中定义。)

6. 更改

6.1. 最近的更改

自2023年4月6日的推荐标准以来,仅进行了小幅编辑调整:

6.2. 自CSS Level 2以来的更改

自CSS Level 2以来,本模块进行了以下更改:

7. 隐私考虑

关于此模块没有报告任何隐私方面的考虑。

8. 安全考虑

关于此模块没有报告任何安全方面的考虑。

一致性

文档约定

一致性要求通过描述性断言和RFC 2119术语的组合来表达。关键字“MUST”(必须), “MUST NOT”(不可), “REQUIRED”(需要), “SHALL”(应当), “SHALL NOT”(不应当), “SHOULD”(应该), “SHOULD NOT”(不应该), “RECOMMENDED”(推荐), “MAY”(可以), 和 “OPTIONAL”(可选的)在本文档的规范部分中应按照RFC 2119中的描述进行解释。 但是,为了便于阅读,这些词在本规范中并未全部以大写字母出现。

本规范的所有文本都是规范性的,除非明确标记为非规范性的章节、示例和注释。[RFC2119]

本规范中的示例以“例如”开头,或通过class="example"与规范文本区分开,如下所示:

这是一个说明性示例。

信息性注释以“注意”一词开头,并通过class="note"与规范文本区分开,如下所示:

注意,这是一个说明性注释。

建议是规范性部分,旨在引起特别注意,并通过<strong class="advisement">与其他规范文本区分开,如下所示: 用户代理必须提供可访问的替代方案。

一致性类别

本规范的一致性 定义了三个一致性类别:

样式表
一个CSS样式表。
渲染器
一个用户代理,用于解释样式表的语义并渲染 使用它们的文档。
创作工具
一个用户代理,用于编写样式表。

如果样式表中使用的语法与本模块中定义的通用CSS语法和各个功能的语法一致, 则该样式表符合本规范的要求。

如果渲染器除了按照相关规范定义解释样式表外,还能通过正确解析并相应地渲染文档,从而支持本规范定义的所有功能, 则该渲染器符合本规范的要求。然而,由于设备限制导致用户代理无法正确渲染文档的情况,并不会使用户代理不符合规定。(例如,用户代理不 需要在单色显示器上渲染颜色。)

如果创作工具生成的样式表在语法上与通用CSS语法和本模块中各个功能的语法一致, 并且满足本模块中描述的样式表的所有其他一致性要求, 则该创作工具符合本规范的要求。

部分实现

为了使作者能够利用向前兼容的解析规则来指定回退值,CSS渲染器必须将其没有可用支持级别的所有at规则、属性、属性值、关键字和其他语法结构视为无效(并适当忽略)。特别是,用户代理不得在单个多值属性声明中有选择性地忽略不受支持的组件值并支持已受支持的值:如果任何值被认为无效 (因为不受支持的值必须如此),CSS要求整个声明被忽略。

不稳定和专有功能的实现

为了避免与未来的稳定CSS功能冲突,CSS工作组建议遵循最佳实践,以实现不稳定功能和专有扩展到CSS。

非实验性实现

一旦规范进入候选推荐阶段, 就可以进行非实验性实现,并且实现者应 发布未加前缀的任何CR级功能的实现,前提是他们 可以证明该功能已根据规范正确实现。

为了建立和维护CSS在不同实现之间的互操作性,CSS工作组要求非实验性 CSS渲染器在发布未加前缀的任何CSS功能实现之前,向W3C提交实现报告(以及必要时提交实现报告所用的测试用例)。 提交给W3C的测试用例需经过CSS工作组的审查和修正。

有关提交测试用例和实现报告的详细信息, 请访问CSS工作组的网站https://www.w3.org/Style/CSS/Test/。 任何问题应发送至public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

参考定义的术语

参考文献

规范性引用

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS 背景和边框模块 3 级. 2024 年 3 月 11 日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS 分片模块 4 级. 2018 年 12 月 18 日. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS 级联与继承 5 级. 2022 年 1 月 13 日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS 显示模块 3 级. 2023 年 3 月 30 日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS 伪元素模块 4 级. 2022 年 12 月 30 日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS 盒子大小模块 3 级. 2021 年 12 月 17 日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS 变换模块 1 级. 2019 年 2 月 14 日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块 3 级. 2024 年 3 月 22 日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块 4 级. 2024 年 3 月 12 日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS 书写模式 4 级. 2019 年 7 月 30 日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. 层叠样式表第 2 级修订 1(CSS 2.1)规范. 2011 年 6 月 7 日. REC. URL: https://www.w3.org/TR/CSS21/
[RFC2119]
S. Bradner. 在 RFC 中表示要求等级的关键词. 1997 年 3 月. 最佳现行做法. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SVG2]
Amelia Bellamy-Royds; et al. 可缩放矢量图形 (SVG) 2. 2018 年 10 月 4 日. CR. URL: https://www.w3.org/TR/SVG2/

参考性引用

[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS 分片模块 3 级. 2018 年 12 月 4 日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-LOGICAL-1]
Rossen Atanassov; Elika Etemad. CSS 逻辑属性与值 1 级. 2018 年 8 月 27 日. WD. URL: https://www.w3.org/TR/css-logical-1/
[CSS-RUBY-1]
Elika Etemad; et al. CSS Ruby 注释布局模块 1 级. 2022 年 12 月 31 日. WD. URL: https://www.w3.org/TR/css-ruby-1/

属性索引

名称 值 初始值 适用于 继承性 百分比 动画类型 规范顺序 计算值 逻辑属性组
margin <'margin-top'>{1,4} 0 参见各个属性 否 参照包含块的逻辑宽度 按计算值类型 按语法 参见各个属性
margin-bottom <length-percentage> | auto 0 除内部表格元素外的所有元素 否 参照包含块的逻辑宽度 按计算值类型 按语法 关键字 auto 或计算的 <length-percentage> 值 margin
margin-left <length-percentage> | auto 0 除内部表格元素外的所有元素 否 参照包含块的逻辑宽度 按计算值类型 按语法 关键字 auto 或计算的 <length-percentage> 值 margin
margin-right <length-percentage> | auto 0 除内部表格元素外的所有元素 否 参照包含块的逻辑宽度 按计算值类型 按语法 关键字 auto 或计算的 <length-percentage> 值 margin
margin-top <length-percentage> | auto 0 除内部表格元素外的所有元素 否 参照包含块的逻辑宽度 按计算值类型 按语法 关键字 auto 或计算的 <length-percentage> 值 margin
padding <'padding-top'>{1,4} 0 参见各个属性 否 参照包含块的逻辑宽度 按计算值类型 按语法 参见各个属性
padding-bottom <length-percentage [0,∞]> 0 除表格单元格以外的内部表格元素外的所有元素 否 参照包含块的逻辑宽度 按计算值类型 按语法 计算的 <length-percentage> 值 padding
padding-left <length-percentage [0,∞]> 0 除表格单元格以外的内部表格元素外的所有元素 否 参照包含块的逻辑宽度 按计算值类型 按语法 计算的 <length-percentage> 值 padding
padding-right <length-percentage [0,∞]> 0 除表格单元格以外的内部表格元素外的所有元素 否 参照包含块的逻辑宽度 按计算值类型 按语法 计算的 <length-percentage> 值 padding
padding-top <length-percentage [0,∞]> 0 除表格单元格以外的内部表格元素外的所有元素 否 参照包含块的逻辑宽度 按计算值类型 按语法 计算的 <length-percentage> 值 padding