CSS 分页媒体模块第 3 级

W3C 工作草案

关于此文档的更多细节
此版本
https://w3org.cn/TR/2023/WD-css-page-3-20230914/
最新发布版本
https://w3org.cn/TR/css-page-3/
编辑草案
https://drafts.csswg.org/css-page-3/
历史
https://w3org.cn/standards/history/css-page-3/
反馈
CSS 工作组问题仓库
追踪器
文档内联
编辑
Elika J. Etemad / fantasai (Apple,曾任职于 Mozilla)
前任编辑
Simon Sapin (Mozilla,曾任职于 Kozea)
Melinda Grant (HP)
Håkon Wium Lie (Opera Software)
Jim Bigelow (Hewlett-Packard)
Jacob Refstrup (Hewlett-Packard)
Robert Stevahn (Hewlett-Packard)
建议编辑此规范
GitHub 编辑器

摘要

本 CSS 模块定义了如何在分页呈现中生成页面并布局以容纳碎片化内容。它增加了控制页面边距、页面尺寸和方向、页眉和页脚的功能,并扩展了生成内容以实现页码和页眉/页脚的自动运行。将流分页为这类生成页面的过程在 [CSS-BREAK-3] 中涵盖。

CSS 是一种用于描述结构化文档(如 HTML 和 XML)在屏幕、纸张等介质上渲染方式的语言。

关于本文档

本部分描述了本文档在发布时的状态。当前 W3C 出版物列表及本技术报告的最新版本可在 W3C 技术报告索引(https://w3org.cn/TR/)中找到。

本文档由 CSS 工作组工作草案形式根据 推荐标准轨道发布。作为工作草案发布并不意味着 W3C 及其成员的认可。

这是一份草案文档,可能会随时被其他文档更新、替换或废弃。将其作为非进行中工作引用是不恰当的。

请通过 在 GitHub 上提交 issue(推荐)发送反馈,标题中需包含规范代码“css-page”,例如:“[css-page] …评论摘要…”。所有问题和评论均已存档。或者,也可以将反馈发送至(已存档的)公共邮件列表 www-style@w3.org

本文档受 2023 年 6 月 12 日 W3C 流程文档管辖。

本文档由在 W3C 专利政策下运作的组织制作。W3C 维护一份与该组织交付成果相关的 公开专利披露列表;该页面还包含披露专利的说明。任何知悉其认为包含 必要权利要求 的专利的个人,必须按照 W3C 专利政策第 6 节披露该信息。

1. 简介

分页媒体(如纸张、投影胶片、相册页面、作为打印输出模拟显示在计算机屏幕上的页面)与 连续媒体 不同,其文档内容被拆分为一个或多个离散的静态显示表面。为了处理页面,CSS3 分页媒体描述了如何

本模块定义了一个页面模型,规定了文档如何在一个称为页面框的矩形区域内进行格式化,该区域具有有限的宽度和高度。

虽然 CSS3 没有指定用户代理如何将页面框转移到纸张上,但它确实包含了一些机制,用于告知用户代理预期的页面纸张尺寸和方向。在一般情况下,CSS3 假设一个页面框将被转移到一个类似尺寸的表面上。

注意:[CSS-BREAK-4] 规范解决了对碎片化(分页)的控制,例如 break-beforebreak-afterbreak-insidewidowsorphans 属性。

1.1. 值定义

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

除了定义中列出的属性特定值外,本规范中定义的所有属性也都接受 CSS 全局关键字 作为其属性值。为了可读性,未明确重复列出。

2. 页面术语

以下术语和相关图表有助于描述页面模型

页面纸张
页面纸张的一个角,边缘是非打印区域,内部是可打印区域 页面纸张是物理介质的一个表面。右侧的插图显示了页面纸张左上角的表示。
可打印和不可打印区域
不可打印区域是页面纸张上物理设备(如打印机)无法可靠标记的区域,通常是因为打印机的进纸机构所致。该值取决于打印机,通常是页面纸张每个边缘沿线的一个小区域。可打印区域是打印机能够可靠标记的页面纸张区域。可打印区域的大小是页面纸张的大小减去不可打印区域的大小。用户代理可能不知道特定打印设备的此区域尺寸;但当尺寸已知时,用户代理可能会调整文档的格式,使内容落在可打印区域内。这种调整的实现方式取决于设备,需遵循 § 7.4 渲染无法适配纸张的页面框§ 3.2 页面框之外的内容 部分中表达的约束。
页面方向
页面方向是通过比较页面框的边长来定义的。页面框是一个矩形,有两条垂直的边,分别称为长边和短边。长边的长度总是大于或等于短边的长度。当页面框为正方形时,两条边长度相同,其中任何一边都可以用作长边,另一边为短边。本规范定义了纵向 (portrait)横向 (landscape) 页面方向。
纵向 (Portrait)
纵向页面的高度大于或等于其宽度。水平元素平行于短边,垂直元素平行于长边。
横向 (Landscape)
横向页面的宽度大于或等于其高度。水平元素平行于长边,垂直元素平行于短边。

注意:请注意,CSS3 没有区分横向和反向横向。然而,未来的 CSS 版本可能会这样做。在选择横向和反向横向渲染时,用户代理在进行双面打印格式化时,应考虑装订边、页面流向和阅读舒适度。

双面打印
双面打印在页面纸张的每一面打印一个页面框,并使用纸张的两面。本模块没有提供指定文档是否进行双面打印的能力,但左页和右页的概念基于文档是双面打印的假设,无论实际是否如此。
装订边
装订边是页面框中朝向装订位置的一侧(如果材料已装订)。装订边通常比对面边缘有更大的边距,以提供装订所需的空间。装订边可以是四条边中的任意一条。然而,页面纸张通常被装订成使得纵向页面框的装订边是垂直的。本模块没有提供指定装订边的方法。在双面打印中,左页和右页的装订边位于页面框的相反两侧。
对页
对页是两个连续的页面,当文档进行双面打印时,它们位于不同的纸张上。通常,较早的页面是一张纸的背面,较后的页面是另一张纸的正面。它们通常布局成在页面以正常阅读方向放置时,对页的装订边是垂直且相邻的。
左页
如果页面是典型布局中对页的一部分,则位于左侧的页面。使用从左到右页面流向的文档的页面布局,将对页中较早的页面放在左侧。针对左页的规则可以使用 :left 页面选择器来指定。
右页
如果页面是典型布局中对页的一部分,则位于右侧的页面。使用从右到左页面流向的文档的页面布局,将对页中较早的页面放在右侧。针对右页的规则可以使用 :right 页面选择器来指定。

3. 页面模型

分页媒体格式化模型中,文档被转移到一个或多个页面框中。页面框 (page box) 是一个专门的 CSS 框,映射到矩形打印媒体表面,例如一张纸。它大致类似于视口

与其他 CSS 一样,页面框由边距、边框、内边距和内容区域组成。页面框的内容和边距区域具有特殊功能。

在 CSS 2.1 中,页面框和页面区域都是简单的矩形。它们都不是具有边距、边框和内边距的 CSS 框。这个 CSS 框应与页面框和页面区域区分开,后者将分别是其边距区域和内容区域。有命名建议吗?

页面框的属性由页面上下文中声明的属性确定,即 @page 规则的声明块。类似地,页面边距框的属性由其边距上下文中声明的属性确定。页面上下文中的声明可能会影响页面框和/或继承到页面边距框,但它们不会应用于或继承到文档的根元素或其他内容。

页面框的包含块使用页面上下文中的 size 属性指定。然后,页面框的宽度和水平边距的计算方式与正常流中的非替换块元素完全相同。[CSS2] 页面框的高度和垂直边距的计算方式类似(而不是使用块高度公式)。在这两种情况下,如果值过度约束,则不会忽略任何边距,而是调整包含块的大小以使其与页面框的边距边缘重合。

3.1. 页面背景与绘制顺序

在绘制页面内容时,页面层按以下绘制顺序进行绘制(最底层优先)

  1. 页面背景
  2. 文档画布
  3. 页面边框
  4. 文档内容
  5. 页面边距框

在页面模型中,页面背景的行为类似于根背景:其背景绘制区域出血区域,它覆盖整个页面框,包括其边距(无论 background-clip 如何设置)。页面背景默认锚定在页面框的内边距区域内(如果用户代理支持 [CSS-BACKGROUNDS-3],则遵循 background-origin)。但是,如果 background-attachmentfixed,则图像相对于页面框(包括其边距)进行定位(即背景定位区域是页面的边距框)。

文档画布背景绘制为页面框的背景:默认情况下,其背景绘制区域覆盖页面框的边框框;对于支持 [CSS-BACKGROUNDS-3] 的用户代理,它遵循根元素上指定的 background-clip 值。然而,它仍然像往常一样相对于根元素或页面区域进行定位。

关于页面边距框,文档画布、页面边框和所有文档内容被视为一个具有 0 z-index 值且建立堆叠上下文 [CSS2] 的单一元素:页面边距框永远不会与文档内容的一部分交错,也不会介于内容和画布之间。它们只能绘制在文档内容的前面或文档画布的后面。页面背景始终绘制在所有其他内容之下。

z-index 属性适用于页面边距框。由于 position 属性不适用于页面边距框,z-index 总是影响页面边距框,就像它们是定位元素一样,无论 position 属性的值如何。每个页面边距框始终建立一个堆叠上下文。

页面边距框相对于彼此的默认绘制顺序,或 CSS2.1 附录 E 中的“树顺序”,如下所示

  1. @top-left-corner
  2. @top-left
  3. @top-center
  4. @top-right
  5. @top-right-corner
  6. @right-top
  7. @right-middle
  8. @right-bottom
  9. @bottom-right-corner
  10. @bottom-right
  11. @bottom-center
  12. @bottom-left
  13. @bottom-left-corner
  14. @left-bottom
  15. @left-middle
  16. @left-top

@top-left-corner 开始,然后顺时针进行。此顺序是任意的,但可以用 z-index 覆盖。它仅在页面边距框重叠时产生可见效果,而在大多数情况下不应发生这种情况。

3.2. 页面框之外的内容

在页面模型中格式化内容时,某些内容可能会出现在页面框之外。例如,white-space 属性值为 pre 的元素可能会生成一个比页面框更宽的框。再举一个例子,当框被绝对定位或相对定位时,它们可能会出现在“不方便”的位置。例如,图像可能会被放置在页面框的边缘或页面框下方 100,000 米处。

此类元素的精确格式化规范超出了本文档的范围。但是,建议作者和用户代理遵守以下有关页面框之外内容的通用原则

3.3. 页面流向

CSS 对所有文档区分左页和右页,无论它们是否进行双面打印。每一左页之后紧跟一个右页,反之亦然。左页和右页可以使用 :left:right 伪类进行不同样式的设置。

文档的第一页是左页还是右页取决于文档的页面流向。页面流向 (page progression) 是文档打印页面在并排布局时序列化的方向。例如,英语和水平排版的日语通常从左向右流向,而阿拉伯语和垂直排版的日语页面通常从右向左流向。

页面流向确定如下

如果用户代理支持来自 CSS 3 书写模式模块 [CSS-WRITING-MODES-3]directionwriting-mode 属性,则必须确定页面流向是由主书写模式决定的。

在从左到右页面流向的文档中,文档的第一页是右页,反之亦然。为了显式强制文档从左页或右页开始打印,作者可以指定一个 break-before 值,该值会将分页符传播到根节点。[CSS-BREAK-3] 在这种情况下,用户代理必须抑制第一页(空白页)(且 :first 伪类匹配第一页打印的页面)。

html { break-before: always }

对于从左到右页面流向的 HTML 文档,上述样式规则将导致文档的第一页打印在 ':left' 页面上

html { break-before: left }

对于 HTML 文档,上述样式规则将导致文档的第一页打印在 ':left' 页面上,无论页面流向如何。

4. 页面选择器与页面上下文

4.1. @page 规则

作者可以在 @page 规则内指定页面框的各个方面,如尺寸、方向和边距。@page 规则在允许使用规则集的任何地方都是允许的。@page 规则由关键字 @page、一个可选的以逗号分隔的页面选择器列表以及一个声明块(称为页面上下文)组成。@page 规则还可以包含其他 @规则,交错在声明之间。本规范的当前级别仅允许在 @page 内使用边距 @规则

没有选择器列表的 @page 规则适用于每一页。其他 @page 规则适用于匹配其至少一个选择器的页面。在页面上下文中声明的属性应用于页面框。

如果在页面或边距上下文内的声明块处理过程中遇到错误,则适用处理解析错误的规则;也就是说,块内的有效声明将被应用。

4.2. 页面选择器

一个 页面选择器 由一个 页面类型选择器 或一个 页面伪类 组成,后跟零个或多个额外的 页面伪类。选择器的组件之间不允许有空白。<page-selector> 语法和示例可在下方找到。

一个 页面选择器 当且仅当其所有组件都匹配该页面时,才被称之为匹配给定的页面。

一个 页面类型选择器 是一个区分大小写的 CSS 标识符 [CSS2]。它匹配page 属性生成的命名页面类型的页面。 页面类型名称为 autoASCII 不区分大小写)不会使规则无效,但绝不能匹配。

一个 页面伪类ASCII 不区分大小写,并具有与常规选择器中的伪类相同的语法。[SELECT] 各种 页面伪类定义如下。

4.2.1. 对页伪类::left, :right

打印双面文档时,左页和右页的格式通常不同。这可以通过使用 :left:right 页面伪类来表示。

所有页面都由用户代理自动归类为左页或右页,具体取决于页面流向:left:right 伪类仅分别匹配左页右页

下面的示例使用这些伪类创建了左侧和右侧的装订边@page :left { margin-left: 3cm; margin-right: 4cm; } @page :right { margin-left: 4cm; margin-right: 3cm; }

如果为左页和右页提供了不同的声明,则用户代理必须遵守这些声明,即使它没有将页面框转移到左纸张和右纸张(例如,只在一面打印的打印机也必须产生格式正确的输出)。

注意。:left:right 伪类添加声明不一定会影响文档是双面还是单面打印(这超出了本规范的范围)。

4.2.2. 首页伪类::first

:first 伪类匹配文档的第一页打印页。

@page { margin: 2cm } /* All margins set to 2cm */

@page :first {
margin-top: 10cm /* Top margin on first page 10cm */
}

4.2.3. 空白页伪类::blank

:blank 伪类匹配强制分页而出现的内容为空的页面

只有 break-beforebreak-after 属性的 leftrightrectoverso 值才能生成与 :blank 匹配的页面。
在此示例中,强制分页可能发生在 h1 元素之前。h1 { break-before: left } @page :blank { @top-center { content: "This page is intentionally left blank" } }

:blank 匹配的页面也可以由其他页面伪类匹配。

如果在所有右页上都指定了页眉,则空白的右页将同时由 :blank:right 匹配。因此,除非希望在空白页上显示,否则必须移除在右页上设置的边距框。这是一个从空白页移除顶部居中页眉,同时保留页码的示例

h1 { break-before: left }

@page :blank {
  @top-center { content: none }
}

@page :right {
  @top-center { content: "Preliminary edition" }
  @bottom-center { content: counter(page) }
}

由于 :blank:right特异性更高,即使 content: none 出现在 content: "Preliminary edition" 之前,顶部居中页眉也会被移除。

注意。 未来版本的 CSS 可能包含其他页面伪类。

4.3. @page 规则语法

@page 规则根据以下语法进行解析,外加下方注明的附加规则

@page = @page <page-selector-list>? { <declaration-rule-list> }
<page-selector-list> = <page-selector>#
<page-selector> = [ <ident-token>? <pseudo-page>* ]!
<pseudo-page> = ':' [ left | right | first | blank ]

/* Margin rules */
@top-left-corner = @top-left-corner { <declaration-list> };
@top-left = @top-left { <declaration-list> };
@top-center = @top-center { <declaration-list> };
@top-right = @top-right { <declaration-list> };
@top-right-corner = @top-right-corner { <declaration-list> };
@bottom-left-corner = @bottom-left-corner { <declaration-list> };
@bottom-left = @bottom-left { <declaration-list> };
@bottom-center = @bottom-center { <declaration-list> };
@bottom-right = @bottom-right { <declaration-list> };
@bottom-right-corner = @bottom-right-corner { <declaration-list> };
@left-top = @left-top { <declaration-list> };
@left-middle = @left-middle { <declaration-list> };
@left-bottom = @left-bottom { <declaration-list> };
@right-top = @right-top { <declaration-list> };
@right-middle = @right-middle { <declaration-list> };
@right-bottom = @right-bottom { <declaration-list> };

此外,适用以下规则

以下是页面选择器的示例(声明块有意留空)@page { ... } @page :left { ... } @page :right { ... } @page LandscapeTable { ... } @page CompanyLetterHead:first { ... } /* identifier and pseudo page. */ @page:first { ... } @page toc, index { ... } @page :blank:first { ... }

以下是声明块有意留空的页面边距框示例。

@page {
 @top-left { ... /* document name */ }
 @bottom-center { ... /* page number */}
}
@page :left { @left-middle { ... /* page number in left margin */ }}
@page :right{ @right-middle { ... /* page number in right margins of right pages */}}

@page :left { @bottom-left-corner { ... /* left page numbers */ }}
@page :right { @bottom-right-corner { ... /* right page numbers */ }}
@page :first { @bottom-left-corner { ... /* empty footer on 1st page */ }
@bottom-right-corner { ... /* empty footer */ } }

4.4. 页面上下文中的层叠

页面和边距上下文中的声明像元素的样式规则中的声明一样进行层叠

页面选择器的特异性的计算方式类似于选择器模块中定义的计算方式

  • 计算页面类型名称的数量 (= f)考虑到页面选择器的语法,f 只能为 0 或 1。
  • 计算 ':first' 或 ':blank' 伪类的数量 (= g)
  • 计算 ':left' 或 ':right' 伪类的数量 (= h)

注意:允许重复出现相同的伪类,并且会增加特异性。

由于存储限制,实现可能对 fgh 的大小有限制。如果是这样,高于限制的值必须截断为该限制,而不会溢出。

通过按顺序比较三个分量 (f, g, h) 来比较特异性:具有较大 f 值的特异性更具体;如果两个 f 值相等,则比较两个 g 值,依此类推。如果所有值都相等,则两个特异性相等。

以下是一些页面特异性计算示例

@page { } /* specificity = (0,0,0) */
@page :left { } /* specificity = (0,0,1) */
@page :first { } /* specificity = (0,1,0) */
@page :blank:left { } /* specificity = (0,1,1) */
@page artsy { } /* specificity = (1,0,0) */
@page artsy:left { } /* specificity = (1,0,1) */
@page artsy:first { } /* specificity = (1,1,0) */

考虑以下使用示例

@page :left {
  margin-left: 4cm;
}

@page {
  margin-left: 3cm;
}

由于伪类选择器的特异性更高,左页的左边距将为 4cm,所有其他页面(右侧页面)的左边距将为 3cm。

在此示例中,绿色规则的更高特异性胜过红色规则。因此,第一页在左上角页面边距框中将有蓝色文本,在右上角页面边距框中将有绿色文本,而后续页面在页面边距框中将有红色文本。@page :first { color: green; @top-left { content: "foo"; color: blue; } @top-right { content: "bar"; } } @page { color: red; @top-center { content: "Page " counter(page); } }

页面上下文会层叠,因此以下样式表将以 25 毫米的边距和 14 点的字体样式化页面边距框中的页面

@page { margin: 25mm;}
@page { font-size: 14pt;}

5. 页面边距框

页面边距框是页面边距内的框,像伪元素一样,可以包含生成的内容。

页面边距框可用于创建页面页眉和页脚,这些是页面中预留给页码或文档标题等补充信息的区域。

通常,页面页眉 (page header) 对于具有主要水平书写方向的文档位于页面顶部,对于具有主要垂直书写方向的文档位于与装订边相对的一侧。水平书写文档的一种可能的页眉设计使用 @top-left-corner@top-left@top-center@top-right@top-right-corner 页面边距框。另一种垂直书写文档的设计可以使用 @right-top@right-middle@right-bottom 页面边距框用于右对页,并使用 @left-top@left-middle@left-bottom 用于左对页页面页脚 (page footer) 通常位于与页眉相对的页面末端。例如,一个页面顶部有页眉的水平书写文档的设计,其页脚可以使用 @bottom-left-corner@bottom-left@bottom-center@bottom-right@bottom-right-corner 页面边距框。垂直书写文档的设计可以使用页面装订边的页面边距框作为页脚。

页面边距框相对于页面区域进行定位,并且与页面方向无关,例如在纵向和横向中,顶部页面边距框都在页面区域上方。各种页面边距框在下图中定义和说明

表 1 页面边距框定义
盒 (Box)描述位置
top-left-corner由页面框的顶部和左侧边距的交集定义的固定尺寸框the top left corner box with margin, border, and padding, nested within intersection of the page’s top and left margins
top-left填充顶部页面边距,位于 top-left-corner 和 top-center 页面边距框之间的可变宽度框the top left box with margin, border, and padding, nested in the page’s top margin next to the top left corner box
top-center水平居中于页面左右边框边缘之间,并填充顶部页面边距,位于 top-left 和 top-right 页面边距框之间的可变宽度框the top center box with margin, border, and padding, centered within the page’s top margin
top-right填充顶部页面边距,位于 top-center 和 top-right-corner 页面边距框之间的可变宽度框the top right box with margin, border, and padding, nested within the page’s top margin
top-right-corner由页面框的顶部和右侧边距的交集定义的固定尺寸框the top right corner box with margin, border, and padding, nested within the intersection of the page’s top and right margin
left-top填充左侧页面边距,位于 top-left-corner 和 left-middle 页面边距框之间的可变高度框left-top, left-middle, and left-bottom page-margin boxes in the page box’s left margin
left-middle垂直居中于页面顶部和底部边框边缘之间,并填充左侧页面边距,位于 left-top 和 left-bottom 页面边距框之间的可变高度框
left-bottom填充左侧页面边距,位于 left-middle 和 bottom-left-corner 页面边距框之间的可变高度框
right-top填充右侧页面边距,位于 top-right-corner 和 right-middle 页面边距框之间的可变高度框right-top, right-middle, and right-bottom page-margin boxes in the page box’s right margin
right-middle垂直居中于页面顶部和底部边框边缘之间,并填充右侧页面边距,位于 right-top 和 right-bottom 页面边距框之间的可变高度框
right-bottom填充右侧页面边距,位于 right-middle 和 bottom-right-corner 页面边距框之间的可变高度框
bottom-left-corner由页面框的底部和左侧边距的交集定义的固定尺寸框bottom left corner box with margin, border, and padding, nested within the page margin at the intersection of the left and bottom page margins
bottom-left填充底部页面边距,位于 bottom-left-corner 和 bottom-center 页面边距框之间的可变宽度框bottom left page-margin box with margin, border, and padding, nested within the page’s bottom margin next to the bottom-left-corner box
bottom-center水平居中于页面左右边框边缘之间,并填充底部页面边距,位于 bottom-left 和 bottom-right 页面边距框之间的可变宽度框bottom center box with margin, border, and padding, nested within the page’s bottom margin and centered on the page
bottom-right填充底部页面边距,位于 bottom-center 和 bottom-right-corner 页面边距框之间的可变宽度框bottom right page-margin box with margin, border, and padding, nested within the page’s bottom margin and next to the bottom-right-corner box
bottom-right-corner由页面框的底部和右侧边距的交集定义的固定尺寸框bottom right corner box with margin, border, and padding, nested within the page margin at the intersection of the right and bottom page margins

5.1. 页面边距框的 @规则

页面边距框由页面上下文内的边距 @规则创建。作者应将这些规则放在页面上下文中的任何声明之后,因为旧版客户端可能无法正确处理边距 @规则之后的声明。

一个边距 @规则是一个@规则,它标识了页面边距框(例如 @top-left)以及一个描述符块(称为边距上下文)。

以下样式表建立了一个页面页眉,左侧包含标题(“Hamlet”),右侧包含页码,前面带有“Page ”字样

@page {
  size: 8.5in 11in;
  margin: 10%;

  @top-left {
    content: "Hamlet";
  }
  @top-right {
    content: "Page " counter(page);
  }
}

5.2. 填充页面边距框

:before:after 伪元素一样,在页面边距框上指定的 content: normal 计算为 none。当且仅当其 content 属性的计算值不是 none 时,页面边距框才会被生成。否则,不会生成任何框,就像具有 display: none 的元素一样。

display 属性不适用于页面边距框。

以下样式表在页面的每个角创建一个绿色框,左下角除外。@page { @top-left-corner { content: " "; border: solid green; } @top-right-corner { content: url(foo.png); border: solid green; } @bottom-right-corner { content: counter(page); border: solid green; } @bottom-left-corner { content: normal; border: solid green; } }

5.3. 计算页面边距框尺寸

每个页面边距框的宽度和高度由以下规则确定。这些规则定义了相当于 CSS2.1 第 10.3 和 10.6 节中针对页面边距框的内容。

应用 min-heightmax-heightmin-widthmax-width [CSS2] 的规则确实适用于页面边距框,如果指定的 widthheight 导致的尺寸违反其约束,则可能意味着需要重新计算宽度、高度和/或边距。如果用户代理不支持 min-heightmin-width 属性,则必须表现得好像 min-heightmin-width 始终为零。

5.3.1. 页面边距框布局术语

除了 CSS2.1 [CSS2] 中的框模型定义以及 CSS Sizing [CSS-SIZING-3] 中的尺寸术语外,还为后续页面边距框计算定义了以下术语

可用宽度
页面左边框宽度、左内边距、页面区域宽度、右内边距和右边框宽度之和。换句话说,它是页面框左右边框边缘之间的距离。该量用于计算顶部和底部页面边距框的尺寸。
可用高度
页面顶部边框宽度、顶部内边距、页面区域高度、底部内边距和底部边框宽度之和。换句话说,它是页面框上下边框边缘之间的距离。该量用于计算左侧和右侧页面边距框的尺寸。
外宽度
外边缘的宽度,如 [CSS-BOX-3] 中定义。
最小内容宽度
最小内容块大小最小内容行内大小中较小的一项为物理宽度。
最大内容宽度
最大内容块大小最大内容行内大小中较小的一项为物理宽度。
外最小宽度
外宽度类似,不同之处在于当计算出的 widthauto 时,使用最小内容宽度
外最大宽度
外宽度类似,不同之处在于当计算出的 widthauto 时,使用最大内容宽度

页面边距框的包含块取决于其位置

对于角落页面边距框,它是两个页面边距在该角落相交所定义的矩形。

对于所有其他页面边距框,包含块是由封装页面边距减去相邻角落页面边距框的包含块所形成的矩形。这意味着该包含块的尺寸在其中一个维度上由使用的页面边距给出,在另一个维度上由可用宽度(对于顶部和底部页面边距框)或可用高度(对于左侧和右侧页面边距框)给出。

5.3.2. 页面边距框可变尺寸计算规则

以下规则适用于 @top-left@top-center@top-right 页面边距框,在本节中分别称为 A、B 和 C。

5.3.2.1. 边距

如果这三个框中任何一个的 margin-leftmargin-right 属性计算为 auto,则使用值为零。

5.3.2.2. 解析 auto 宽度

以下算法确定每个框的使用宽度。为此,未生成的框假定 width外宽度 均为零。

注意:高层目标(按优先级顺序)是:如果中间框 (B) 被生成则使其居中;尽量减少溢出和重叠;并将空间按内容量比例分配。

如果中间框 (B) 未被生成,则按以下方式将可用宽度分配给 A 和 C

如果中间框 (B) 被生成,则按以下方式确定 A、B 和 C 的 auto 宽度

  1. 首先,解析中间框 (B) 的任何 auto 宽度:假设有两个框,B 和 AC,其中 AC 的每个维度都是 A 和 C 中最大值的两倍。(这保留了 B 的居中。)按上述针对 A 和 C 的描述,将空间分配给这两个框(B 和虚构的 AC)。
  2. 然后,通过将该框的外宽度设置为 (可用宽度 − B 的使用外宽度) ÷ 2,解析侧框 (A 和 C) 的任何 auto 宽度。
5.3.2.3. 处理 min-widthmax-width

min-widthmax-width 属性 [CSS2] 像在普通元素上一样应用于可变维度中的页面边距框,只是同一侧的三个框被视为一个整体。

更准确地说

  1. 计算初步的使用宽度(不带 min-widthmax-width),遵循 § 5.3.2.2 解析 auto 宽度 下的规则。
  2. 如果这三个框中任何一个的初步使用宽度大于 max-width,则再次应用上述规则,但这次使用 max-width 的计算值作为 width 的计算值。
  3. 如果这三个框中任何一个的结果宽度小于 min-width,则再次应用上述规则,但这次使用 min-width 的值作为 width 的计算值。
5.3.2.4. 定位

一旦确定了框的尺寸,它们的定位如下

  • A 的左外边缘与包含块的左边缘齐平
  • B 的外区域居中于包含块中。
  • C 的右外边缘与包含块的右边缘齐平。
5.3.2.5. 其他侧面的框

@bottom-left@bottom-center@bottom-right 页面边距框的使用值由与 @top-left@top-center@top-right 相同的规则建立。

@left-top@left-middle@left-bottom 框的使用值由相同的规则建立,只是将“宽度”替换为“高度”,“左”替换为“上”,“右”替换为“下”,“中心”替换为“中间”。

@right-top@right-middle@right-bottom 页面边距框的使用值由与 @left-top@left-middle@left-bottom 相同的规则建立。

5.3.3. 页面边距框固定尺寸计算规则

以下规则用于计算每个 @top-left-corner@top-left@top-center@top-right@top-right-corner 页面边距框的 heightmargin-topmargin-bottom 属性的使用值

  1. 在边距框属性的使用值之间必须满足以下约束margin-top + border-top-width + padding-top + height + padding-bottom + border-bottom-width + margin-bottom = 顶部页面边距
  2. 如果 border-top-width + padding-top + height(如果其值不为 auto)+ padding-bottom + border-bottom-width,再加上 margin-top 和/或 margin-bottom(如果不为 auto),其总和大于页面顶部页边距的高度,那么对于以下规则,任何 margin-topmargin-bottomauto 值均被视为零。
  3. 如果此时 heightmargin-topmargin-bottom 的计算值均不是 auto,则称这些值“过度约束”。在这种情况下,margin-top 的指定值将被视为 auto
  4. 如果现在恰好有一个值被指定为 auto,其使用值将根据等式得出。
  5. 如果 height 被设置为 auto,则所有其他 auto 值变为 0,且 height 的值将根据所得等式得出。
  6. 如果 margin-topmargin-bottom 均为 auto,则它们的使用值相等。这会将页面页边距框的内容在顶部页面页边距内垂直居中。

同样的规则适用于底部页面页边距框(左下角、底部左侧、底部中心、底部右侧和右下角),只是在过度约束的情况下,会忽略 margin-bottom 而非 margin-top

类似的规则也适用于左侧和右侧页面页边距框相对于 width 的属性(左上角、左侧顶部、左侧中间、左侧底部、左下角;右上角、右侧顶部、右侧中间、右侧底部、右下角),其中“顶部”替换为“左侧”,“底部”替换为“右侧”,“高度”替换为“宽度”。对于左侧(或右侧)页面页边距框的过度约束情况,margin-left(或 margin-right)的指定值将被忽略。

5.4. 页面页边距框示例

以下是页面页边距框用法的一些示例集合。

这是一个仅带有左上角页眉的页面示例
@page {
  @top-left { content: "Header in Left Cell (top-left)" }
}

由于没有为顶部中心或顶部右侧页面页边距框定义内容,因此允许左上角页面页边距框的范围跨越页面框的中心。

Header Example 1

这是一个带有居中页眉的页面示例
@page {
  @top-center { content: "Header in Center Cell (top-center)" }
}

Header Example 2

这是一个仅在顶部右侧页面页边距框中包含单个页眉的页面示例
@page {
  @top-right { content: "Header in Right Cell (top-right)" }
}

由于中心单元格的内容为空,因此允许顶部右侧页面页边距框的范围跨越页面框的中心。

Header Example 3

这是一个带有顶部中心和顶部左侧页眉的页面示例
@page {
  @top-left { content: "Left Cell (top-left)" }
  @top-center { content: "Header in Center Cell (top-center)" }
}

Header Example 4

这是一个带有顶部中心和顶部右侧页眉的页面示例
@page {
  @top-center { content: "Header in Center Cell (top-center)" }
  @top-right { content: "Right Cell (top-right)" }
}
margin: 10%;

Header Example 5

这是一个带有顶部左侧和顶部右侧页眉的页面示例
@page {
  @top-left { content: "Header in top-left with approx. twice as many words as right cell." }
  @top-right { content: "Right cell (top-right)" }
}

由于中心单元格没有内容,因此允许顶部左侧页面页边距框的范围跨越页面框的中心。

Header Example 6

6. 页面属性

附录 A 定义了 CSS 2.1 [CSS2]适用于页面框的属性的规范列表。如果符合规范的用户代理在块框上支持这些属性中的任何一个,则它也必须在页面上下文中支持该属性。本规范还定义了仅适用于页面上下文的 size 属性。

适用于页面页边距框的属性也可以在页面上下文中设置:如果它们是可继承的或被显式继承(在页边距上下文中使用 inherit 关键字),它们将继承到页面页边距框中。

同一附录定义了 CSS 2.1 [CSS2]适用于页面页边距框的属性的规范列表。如果符合规范的用户代理在块框上支持这些属性中的任何一个,则它也必须在页边距上下文中支持该属性。

[CSS2] 定义的其他属性不适用于这些上下文。CSS 2.1 中未包含的属性的行为是未定义的。

注意:不定义其他属性的意图是允许在适当的 CSS3 属性出现时逐步添加它们,而无需在每次添加时都更新本规范。

与文档中的元素一样,页面上下文和页边距上下文对每个属性都有一个计算值,即使该属性不适用于页面框或页面页边距框。

CSS 属性的正常规则适用,但有以下例外情况:

  • 页面页边距框继承自页面上下文。页面上下文继承自根元素。然而,由于《CSS 分页媒体模块第三级》(CSS Paged Media Level 3)的前一个修订版未明确这一点,将页面上下文中的继承属性设置为其初始值(如根元素)的实现也符合《CSS 分页媒体模块第三级》。注意,此例外情况将在第四级中删除。
  • emex 单位的值相对于其上下文关联的字体进行解释。当用于页边距上下文中的 font-size 属性时,它们相对于页面上下文的字体。当用于页面上下文中的 font-size 属性时,它们相对于根元素的 font-size。然而,由于《CSS 分页媒体模块第三级》的前一个修订版在此点上存在歧义,将 font-size 上的 emex 视为相对于初始值的实现也符合《CSS 分页媒体模块第三级》。注意,此例外情况将在第四级中删除。
  • 页边距和填充属性上的百分比值相对于包含块的尺寸。对于右侧和左侧值,百分比相对于包含块的宽度;对于顶部和底部值,百分比相对于包含块的高度。
  • widthheight 的使用值对页面框和页面页边距框有特殊的计算规则;请参阅页面尺寸计算页面页边距框尺寸
  • 页面背景的定位和绘制如上所述
  • 计数器作用域的规则被修改,如下所述
  • 与 '::before' 和 '::after' 伪元素一样,content 属性的 normal 值在页面页边距框上计算为 none
  • 在页面页边距框上,vertical-align 属性的行为与表格单元格的规定一致。无论书写模式如何,它总是执行垂直维度的对齐。

用户代理应通过用户代理样式表建立一个默认页面页边距,其中包括任何不可打印区域。作者应假设默认页面区域将不包括不可打印区域。

6.1. 基于页面的计数器

计数器可以在 @page 规则内定义和控制,并用作页面页边距框中的内容。这对于维护页面计数很有用。

页面或页边距上下文内的 counter-increment 会导致计数器随着每个页面框的生成而递增。

如果计数器在页面上下文中被重置或递增,则它在所有页面页边距框的作用域内,并会遮蔽文档中所有同名的计数器。

如果计数器在页边距上下文中被重置或递增,则它在该页面页边距框的作用域内,并会遮蔽页面上下文和文档中任何同名的计数器。

如果一个未在页边距上下文或页面上下文中重置或递增的计数器在页边距上下文中通过 counter() 或 counters() 被使用,则其结果值就如同该页面页边距框是页面开头处文档内的一个元素,位于跨越分页符的正常流中最深处的元素内一样。以这种方式使用计数器不会影响计数器值的计算。

一个名为 page 的计数器会自动创建,并在文档的每一页上递增 1,除非页面上下文中的 counter-increment 属性明确指定了 page 计数器的不同增量。隐含的 page 计数器是一个真实的计数器,可以在这些属性中明确命名时,使用 counter-incrementcounter-reset 属性直接进行影响。它也可以在 'counter()' 和 'counters()' 函数形式中使用。

以下规则将当前页码放置在每一页外侧页边距的中间。
@page {
  margin: 10%;

  @top-center {
    font-family: sans-serif;
    font-weight: bold;
    font-size: 2em;
    content: counter(page);
  }
}

添加以下规则将使所有页码为偶数。

@page {
  counter-increment: page 2;
}

此外,由用户代理自动创建一个名为 pages 的计数器。其值始终为文档中的总页数。(在连续媒体中,这始终为 1。)pages 的值无法被修改:虽然设置它的 counter-resetcounter-increment 语句是有效的,但它们不起作用。

在所有其他方面,与页面关联的计数器的行为如 [CSS2]嵌套计数器和作用域以及计数器中所述。

6.2. 页面页边距框和默认值

页面或页边距上下文中使用的属性从其各自的属性定义中获取初始值;然而,用户代理必须表现得就像下表中的值是由用户代理默认样式表中的规则所建立的一样。

表 2. 页面页边距框的默认值
页面页边距框text-align vertical-align
top-left-corner rightmiddle
top-left leftmiddle
top-center centermiddle
top-right rightmiddle
top-right-corner leftmiddle
left-top centertop
left-middle centermiddle
left-bottom centerbottom
right-top centertop
right-middle centermiddle
right-bottom centerbottom
bottom-left-corner rightmiddle
bottom-left leftmiddle
bottom-center centermiddle
bottom-right rightmiddle
bottom-right-corner leftmiddle
此样式表示例可用于创建带有当前章节名称的居中页眉
body {counter-reset: chapter;}
div.chapter {counter-increment: chapter;}
@page {
  margin: 10%;
  @top-center { content: "Chapter" counter(chapter) }
}

7. 页面尺寸

世界各地的人们使用许多不同的纸张尺寸。本规范的目标之一是让 Web 内容能够适应各种不同的尺寸,而无需为每种纸张尺寸编写特定的样式表。

然而,在某些情况下,特定的页面尺寸对于实现某种特定样式非常重要。实现此目标的一种方法是利用 size 属性,它表明文档应优先显示在特定尺寸的表面上;另一种方法是使用媒体查询 [MEDIAQ],它允许将不同的样式表应用于不同的页面尺寸。

7.1. 页面尺寸:size 属性

名称size
对于@page
<length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]
初始值auto
计算值指定值,其中 <length> 均已绝对化。

此属性指定页面框的包含块的目标尺寸和方向。在常规情况下,即一个页面框渲染到一个页面纸张上时,size 属性也表示目标页面纸张的尺寸。

页面框的尺寸可以是“绝对的”(固定尺寸)或“可缩放的”(即适合可用纸张尺寸)。下表中的前三个值可用于创建可缩放的页面框。其他值定义了固定尺寸的页面框,从而指明了首选的输出媒体尺寸。尽可能在指定的媒体尺寸上进行渲染。如果指定的尺寸不可用,则适用将页面框转换到不同尺寸的规则。

如果 size 属性声明由 widthheightdevice-widthdevice-heightaspect-ratiodevice-aspect-ratioorientation 媒体查询 [MEDIAQ](或其他关于纸张尺寸的条件)限定,则该声明必须被忽略。媒体查询不遵循 size:它们假设如果未指定 @page 规则,则会选择该纸张尺寸。

如果媒体查询至少能响应未限定的 @page 上指定的尺寸,那将非常有用。

另一种选择是像 @viewport 规则 [CSS-DEVICE-ADAPT] 那样做:首先应用 @page 规则(匹配哪些选择器?),在媒体查询和视口百分比长度 [CSS-VALUES-3] 中使用用户代理的默认页面尺寸。所得的页面尺寸即为“基本页面尺寸”。整个样式表集将再次应用,这次使用“基本页面尺寸”进行媒体查询和视口百分比长度计算。

在以下示例中
@page {
  size: 4in 6in;
}

@media (max-width: 6in) {
  @page {
    size: letter;
  }
}

第二个 size 声明被忽略,即 size 属性的指定值为 4in 6in

auto
页面框将被设置为由用户代理选择的尺寸和方向。在通常情况下,选择页面框尺寸和方向以匹配目标媒体纸张。
landscape
指定页面内容以横向(landscape)打印。页面框较长的边处于水平位置。如果未指定 <page-size>,则页面纸张的尺寸由用户代理选择。
portrait
指定页面内容以纵向(portrait)打印。页面框较短的边处于水平位置。如果未指定 <page-size>,则页面纸张的尺寸由用户代理选择。
<length>
页面框将被设置为给定的绝对尺寸。如果仅指定一个长度值,它将同时设置页面框的宽度和高度(即,框为正方形)。如果指定了两个长度值,第一个确立页面框宽度,第二个确立页面框高度。emex 单位的值引用页面上下文的字体。负长度是非法的。
<page-size>
页面尺寸可以使用以下媒体名称之一指定。这等同于使用长度值指定 size。媒体名称的定义来自“媒体标准化名称” [PWGMSN]
A5
等同于 ISO A5 媒体的尺寸:宽 148 毫米,高 210 毫米。
A4
等同于 ISO A4 媒体的尺寸:宽 210 毫米,高 297 毫米。
A3
等同于 ISO A3 媒体的尺寸:宽 297 毫米,高 420 毫米。
B5
等同于 ISO B5 媒体的尺寸:宽 176 毫米,高 250 毫米。
B4
等同于 ISO B4 媒体的尺寸:宽 250 毫米,高 353 毫米。
JIS-B5
等同于 JIS B5 媒体的尺寸:宽 182 毫米,高 257 毫米。
JIS-B4
等同于 JIS B4 媒体的尺寸:宽 257 毫米,高 364 毫米。
letter
等同于北美 Letter 媒体的尺寸:宽 8.5 英寸,高 11 英寸。
legal
等同于北美 Legal 媒体的尺寸:宽 8.5 英寸,高 14 英寸。
ledger
等同于北美 Ledger 媒体的尺寸:宽 11 英寸,高 17 英寸。

<page-size> 名称可以与 landscapeportrait 结合使用,以同时指明尺寸和方向。

@page {
size: A4 landscape;
}

上述示例将页面框的宽度设置为 297 毫米,高度设置为 210 毫米。此示例中的页面框应渲染在 210 毫米 x 297 毫米的页面纸张上。

在以下示例中,页面框的外边缘将与页面对齐。margin 属性上的百分比值相对于页面尺寸,因此如果页面纸张尺寸为 210 毫米 x 297 毫米(即 A4),则页边距为 21 毫米和 29.7 毫米。假设用户代理默认样式表中没有设置页面边框或填充,则生成的页面区域为 189 毫米 x 267.3 毫米(210 毫米 - 21 毫米 x 297 毫米 - 29.7 毫米)。
@page {
size: auto;/* auto is the initial value */
margin: 10%;
}
@page {
size: 8.5in 11in;/* width height */
}

上述示例将页面框的宽度设置为 8.5 英寸,高度设置为 11 英寸。这表明页面纸张尺寸应为 8.5 英寸 x 11 英寸,方向为 portrait(纵向)。

7.1.1. 媒体查询

本节是资料性的。

通过使用媒体查询 [MEDIAQ],一个样式表可以为不同的页面尺寸表达不同的样式偏好。考虑这个例子:

/* style sheet for "A4" printing */
@media print and (width: 21cm) and (height: 29.7cm) {
  @page {
     margin: 3cm;
  }
 }

/* style sheet for "letter" printing */
@media print and (width: 8.5in) and (height: 11in) {
  @page {
  margin: 1in;
  }
}

在上面的例子中,“A4”纸张被赋予“3 厘米”的页面页边距,“letter”纸张被赋予“1 英寸”的页面页边距。

7.1.2. 旋转打印页面:page-orientation 属性

名称page-orientation
对于@page
upright | rotate-left | rotate-right
初始值upright
计算值按指定值

高质量的打印实现能够处理不同尺寸和方向的页面,因此作者可以根据该页面内容的需求选择页面尺寸。例如,他们可能对文档中的大多数页面使用 size: letter portrait;,但切换到 size: letter landscape; 来排版一个宽大的信息表格。

然而,处理跨越不同宽度页面的内容流是一个相对复杂的任务,并且在许多流行的打印实现(特别是 Web 浏览器)中尚未解决。page-orientation 描述符旨在帮助此类实现,允许它们以单一统一的尺寸进行页面排版,但在输出介质(如 PDF)中对排版后的方向进行更改,以便希望以不同方向显示的页面能够实现这一点。

其值定义为:

upright

不应用特殊方向;页面按正常方式进行排版和格式化。

rotate-left

在页面完成排版后,如果输出介质支持旋转,此值表示页面必须相对于其排版方式向左(逆时针)旋转四分之一圈进行显示。

rotate-right

rotate-left 相同,只是页面必须相对于其排版方式向右(顺时针)旋转四分之一圈进行显示。

注意:页边距框和其他定位元素与此属性没有特殊交互;它们将在未旋转的页面上按正常方式排版,然后与其他内容一起旋转。

此属性旨在作为能力较弱的实现的一种过渡方案,允许它们在具备跨越不同尺寸页面进行内容流排版的能力之前,仍然打印混合了纵向和横向方向的文档。它需要一些笨拙的折衷手段才能使用,例如指定一个仅包含英文的宽表格实际上具有垂直的 writing-mode,以便它能以“横向”进行排版,但在打印输出中旋转回直立状态以供阅读。

在高质量的打印实现中,应该无需使用此属性;相反,应使用 size 来控制页面的 portraitlandscape 方向。

7.2. 裁剪和套准标记:marks 属性

名称marks
对于@page
none | [ crop || cross ]
初始值none(无)
计算值按指定值

此属性将裁剪标记和/或套准标记添加到文档中。这些标记打印在页面框之外,以方便纸张的修剪和对齐。各值的含义如下:

none(无)
指定既不打印裁剪标记也不打印套准标记:出血区域之外的区域将完全空白。
crop
指定打印裁剪标记。这些标记通常是页面框之外的短线,实际上是页面框四条边的延伸,从而在页面框附近或内部不放置任何油墨的情况下指示这些边的精确位置。
cross
指定打印套准标记。这些通常是页面框每条边外侧的十字形标记,用于在打印过程中对齐纸张。

注意,裁剪标记和套准标记仅在页面框小于可打印区域时可见。

要在文档上设置裁剪标记和十字标记,可以使用以下代码:
@page { marks: crop cross }

7.3. 出血区域:bleed 属性

名称bleed
对于@page
auto | <length>
初始值auto
计算值按指定值

此属性指定页面框外部的 出血区域 的范围;换句话说,即页面渲染被裁剪的超过页面框的部分。各值的含义如下:

auto
如果 marks 包含 crop,则计算为 6pt,否则计算为零。
<length>
指定 出血区域 在每个方向上延伸出 页面框 的距离。值可以是负数,但可能存在特定于实现的限制。

7.4. 渲染不适合页面纸张的页面框

如果页面框与目标页面纸张尺寸不匹配,用户代理应执行以下操作之一(按偏好顺序):

  1. 在更大的页面纸张上按指示的尺寸渲染页面框。
  2. 如果能使页面框适合页面纸张,则将页面框旋转 90°。
  3. 缩放页面框以适合页面纸张。(页面框的长宽比应保持不变。)
  4. 将页面框图形化地“切片”到多个页面纸张上。
  5. 裁剪溢出的内容(最不推荐)。

用户代理可能希望在执行这些操作之前咨询用户。

7.5. 在纸张上定位页面框

当页面框小于页面纸张时,用户代理应:

  • 将页面框居中于纸张上,因为这将使双面页面对齐并避免意外丢失打印在纸张边缘附近的信息;或者
  • 将页面框定位在页面纸张的左上角(或根据页面框的 directionwriting-mode 属性定位在另一个角落),因为这可以最大限度地减少媒体消耗。

用户代理可能希望在这方面咨询用户。

8. 分页符

CSS 分片模块(CSS Fragmentation Module) [CSS-BREAK-3] 定义了 CSS 框如何在分片(包括跨分页符)的方式和位置。它定义了一些属性,用于指示用户代理可以在哪里或必须在哪里分页,以及后续内容将在哪一页(左页或右页)恢复。每个分页符结束当前页面框中的排版,并导致文档树的剩余部分在新的页面框中进行排版。

8.1. 使用命名页面:page

名称page
auto | <custom-ident>
初始值 auto
应用于 创建 A 类断点的框
可继承 无(但请参阅正文)
百分比 不可用
计算值 指定的值
规范顺序 按语法
动画类型 离散 (discrete)

page 属性用于指定元素必须在其上显示的特定类型的页面(称为命名页面)。如有必要,会引入一个强制分页符并生成一个指定类型的新页面。

注意:此页面可以通过在页面选择器中使用相同的类型名称来进行样式设置。

页面类型名称是区分大小写的标识符。但是,auto 值作为 CSS 关键字,是不区分 ASCII 大小写的。

page 属性不继承。但是,如果元素上的 page 值为 auto,则其使用值为其具有非 auto 值的最近祖先元素上指定的值。当在根元素上指定时,auto 的使用值为空字符串。

由于本规范的早期版本指出 page 属性是可继承的,因此继承 page 属性并将 auto 始终视为命名为空字符串的实现仍然符合《CSS 分页媒体模块第三级》。注意,此例外情况将在第四级中删除。因此,作者不应在具有非 auto 值的元素的后代上显式指定 auto 值,因为所得行为将不可预测。

page 属性的工作方式如下:

  1. 首先,任何 auto 值都会针对非 auto 的祖先元素进行解析(如上所述)。
  2. 接下来,为每个框确定一个开始 page结束 page,作为从其第一个或最后一个子框(分别)传播的值(如果有),否则为框本身上的使用值。子元素仅在 page 属性应用于它时,才会传播其自身的开始结束页面值

    注意:第一个或最后一个子并不总是由第一个或最后一个子元素生成。例如,一个元素可能只有一个带有 'display: none' 的前一个兄弟元素,该元素不生成任何框。

  3. 第一个打印页面的类型是根元素的开始页面值
  4. 如果对于在 A 类断点处相遇的任何两个框,断点前框的结束页面值与断点后框的开始页面值不匹配,则会在两个框之间强制进行分页,并且断点后的内容将在命名类型的页面框上恢复。

注意:本质上,比较的两个 page 值是来自在 A 类断点处相遇的最深层框的值,忽略 page 属性不适用的框作为根的所有子树。

有关分页符的更多详细信息,请参阅 [CSS-BREAK-3]

在此示例中,这两个表格在横向页面上呈现(如果它们合适的话,甚至在同一页上)。页面类型“narrow”用于第二个表格之后的 <p>,因为表格元素的页面属性不再生效。
@page narrow { size: 9cm 18cm }
@page rotated { size: landscape }
div { page: narrow }
table { page: rotated }
使用此文档
<div>
<table>...</table>
<table>...</table>
<p>This text is rendered on a 'narrow' page</p>
</div>
在日语文档中,有时同一文档的不同部分会有不同的 kihon hanmen(基本版面)。 [JLREQ] page 属性与指定不同页面宽度的 @page 规则一起,可以适应这种类型的排版。
<!DOCTYPE html>
<html lang="ja">
  <style>
    html   {
      writing-mode: vertical-rl;
      line-height: 1.6;
    }
    .main  {
      page: main;
      columns: 2;
      column-gap: 1rem;
    }
    .index {
      page: index;
      columns: 3;
      column-gap: 1rem;
    }
    @page {
      margin: auto;  /* center kihon hanmen on page */
      width:  40rem; /* 1.6 × 25 lines        */
    }
    @page main  { height: 61rem; } /* 2 × 30 chars + 1 × gap */
    @page index { height: 62rem; } /* 3 × 20 chars + 2 × gap */
  </style>
  <section class="main"> ... </section>
  <section class="index"> ... </section>
</html>

9. 图像属性

注意:此部分已移至 [CSS-IMAGES-3]

附录 A:适用的 CSS2.1 属性

在页面上下文中适用的 CSS 2.1 属性

此列表定义了页面属性。它们在 § 6 页面属性 中有进一步描述。

双向(bidi)属性 direction
背景属性 background-color
background-image
background-repeat
background-attachment
background-position
background
边框属性 border-top-width
border-right-width
border-bottom-width
border-left-width
border-width
border-top-color
border-right-color
border-bottom-color
border-left-color
border-color
border-top-style
border-right-style
border-bottom-style
border-left-style
border-style
border-top
border-right
border-bottom
border-left
border
计数器属性 counter-reset
counter-increment
color
字体属性 font-family
font-size
font-style
font-variant
font-weight
字体 (font)
高度 属性height
min-height
max-height
line-height
外边距属性 margin-top
margin-right
margin-bottom
margin-left
margin
轮廓(outline)属性 outline-width
outline-style
outline-color
大纲
内边距属性 padding-top
padding-right
padding-bottom
padding-left
padding
quotes
文本属性 letter-spacing
text-align
text-decoration
text-indent
text-transform
white-space
word-spacing
visibility
宽度 属性width
min-width
max-width

在页边距上下文中适用的 CSS 2.1 属性

此列表定义了页面页边距属性。它们在 § 6 页面属性 中有进一步描述。

双向(bidi)属性 direction
unicode-bidi
背景属性 background-color
background-image
background-repeat
background-attachment
background-position
background
边框属性 border-top-width
border-right-width
border-bottom-width
border-left-width
border-width
border-top-color
border-right-color
border-bottom-color
border-left-color
border-color
border-top-style
border-right-style
border-bottom-style
border-left-style
border-style
border-top
border-right
border-bottom
border-left
border
计数器属性 counter-reset
counter-increment
内容
color
字体属性 font-family
font-size
font-style
font-variant
font-weight
字体 (font)
高度 属性height
min-height
max-height
line-height
外边距属性 margin-top
margin-right
margin-bottom
margin-left
margin
轮廓(outline)属性 outline-width
outline-style
outline-color
大纲
overflow
内边距属性 padding-top
padding-right
padding-bottom
padding-left
padding
quotes
文本属性 letter-spacing
text-align
text-decoration
text-indent
text-transform
white-space
word-spacing
vertical-align
visibility
宽度 属性width
min-width
max-width
z-index

附录 B:转移可能性

页面框通常(但不总是)与最终渲染文档的物理表面有一一对应关系。CSS3 页面模型指定了页面框内的排版,但将页面框转移到纸张上是用户代理的责任。CSS3 未解决的一些用户代理转移可能性包括:

  • 将一个页面框转移到一张纸上(例如单面打印);
  • 将两个页面框转移到同一张纸的正面和背面(例如双面打印);
  • 将 N 个(小)页面框转移到一张纸上(称为“N-up”);
  • 将一个(大)页面框转移到 N x M 张纸上(称为“平铺/tiling”);
  • 创建折手(signature)。折手是一组打印在一张纸上的页面,当像书一样折叠和裁剪时,它们会按正确的顺序出现;
  • 将一个文档打印到多个输出托盘;
  • 生成包含打印指令的文件。

隐私与安全考虑

本规范不引入任何新的隐私或安全考虑。

变更 (Changes)

2018 年 10 月 18 日的工作草案以来的更改为:

2013 年 3 月 14 日的工作草案以来的更改为:

致谢

CSS 工作组要特别感谢本模块的前任编辑:Robert Stevahn (Hewlett-Packard)、Håkon Wium Lie (Opera Software)、Jim Bigelow (Hewlett-Packard)、Jacob Refstrup (Hewlett-Packard) 和 Melinda Grant (Hewlett-Packard)。

我们还要感谢我们的专家贡献者 Michael Day (YesLogic)、Shinyu Murakami (Antenna House)、Peter Linss (Hewlett-Packard) 以及 CSS 工作组和 www-style 社区的其他成员,他们为《CSS 分页媒体模块第三级》提供了审查和评论。

一致性

文档约定

一致性要求通过描述性断言和 RFC 2119 术语相结合来表达。本文档规范性部分中的关键词“MUST”(必须)、“MUST NOT”(不得)、“REQUIRED”(必需)、“SHALL”(应)、“SHALL NOT”(不应)、“SHOULD”(推荐)、“SHOULD NOT”(不推荐)、“RECOMMENDED”(建议)、“MAY”(可以)和“OPTIONAL”(可选)应按照 RFC 2119 中的描述进行解释。然而,为了可读性,这些词在本文档中不以全大写形式出现。

本规范的所有文本均为规范性文本,明确标记为非规范性的部分、示例和注释除外。 [RFC2119]

本规范中的示例均以“例如”一词引入,或者通过 class="example" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以“Note”一词开头,并使用 class="note" 与规范性文本隔开,如下所示

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

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

一致性类别

本规范为三类一致性定义了一致性要求。

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

如果样式表包含的所有使用本模块定义语法的语句,根据通用 CSS 语法及本模块定义的各功能语法均有效,则该样式表符合本规范。

如果渲染器除了按相应规范解释样式表外,还通过正确解析本规范定义的所有功能并相应地渲染文档来支持这些功能,则该渲染器符合本规范。然而,由于设备限制导致 UA 无法正确渲染文档,并不意味着该 UA 不符合规范。(例如,UA 无需在单色显示器上渲染颜色。)

如果创作工具编写的样式表根据通用 CSS 语法及本模块中各功能的语法是句法正确的,并符合本模块中描述的所有其他样式表一致性要求,则该创作工具符合本规范。

部分实现

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

不稳定和专有特性的实现

为了避免与未来稳定的 CSS 功能发生冲突,CSS 工作组建议在实施不稳定功能和私有扩展遵循最佳实践

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现即可成为可能,实现者应发布他们能够证明根据规范正确实现的任何 CR 级别特性的无前缀实现。

为建立并保持 CSS 在不同实现间的互操作性,CSS 工作组请求非实验性的 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前,向 W3C 提交一份实现报告(并在必要时提交用于该实现报告的测试用例)。提交给 W3C 的测试用例需经 CSS 工作组审阅和修正。

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

索引

本规范定义的术语

通过引用定义的术语

引用

规范性引用

[CSS-ANCHOR-POSITION-1]
Tab Atkins Jr.; Ian Kilpatrick. CSS Anchor Positioning. 2023 年 6 月 29 日. WD. URL: https://w3org.cn/TR/css-anchor-position-1/
[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS 背景和边框模块第 3 级. 2023 年 2 月 14 日. CR. URL: https://w3org.cn/TR/css-backgrounds-3/
[CSS-BOX-3]
Elika Etemad. CSS 盒模型模块第 3 级. 2023年4月6日. REC. URL: https://w3org.cn/TR/css-box-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2022年11月3日. WD. URL: https://w3org.cn/TR/css-box-4/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018年12月4日. CR. URL: https://w3org.cn/TR/css-break-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018年12月18日. WD. URL: https://w3org.cn/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://w3org.cn/TR/css-cascade-5/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019年8月2日. WD. URL: https://w3org.cn/TR/css-content-3/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023年3月30日. CR. URL: https://w3org.cn/TR/css-display-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS 字体模块第 4 级. 2021 年 12 月 21 日. WD. URL: https://w3org.cn/TR/css-fonts-4/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad. CSS Inline Layout Module Level 3. 2023年4月1日. WD. URL: https://w3org.cn/TR/css-inline-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2023年4月3日. WD. URL: https://w3org.cn/TR/css-position-3/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://w3org.cn/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CR. URL: https://w3org.cn/TR/css-syntax-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2023年9月3日. CR. URL: https://w3org.cn/TR/css-text-3/
[CSS-TEXT-4]
Elika Etemad; et al. CSS Text Module Level 4. 2023 年 3 月 29 日. WD. URL: https://w3org.cn/TR/css-text-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块第 3 级. 2022年12月1日. CR. URL: https://w3org.cn/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块第 4 级. 2023 年 4 月 6 日. WD. URL: https://w3org.cn/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019年12月10日. REC. URL: https://w3org.cn/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://w3org.cn/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://w3org.cn/TR/CSS21/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016年4月12日. WD. URL: https://w3org.cn/TR/CSS22/
[MEDIAQ]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 2021年12月25日. CR. URL: https://w3org.cn/TR/mediaqueries-4/
[MEDIAQUERIES-5]
Dean Jackson; 等人. Media Queries Level 5. 2021年12月18日. WD. URL: https://w3org.cn/TR/mediaqueries-5/
[PWGMSN]
Ron Bergman; Tom Hastings. Media Standardized Names. 2002 年 2 月 26 日. IEEE ISTO Printer Working Group 5101.1-2002. URL: ftp://ftp.pwg.org/pub/pwg/candidates/cs-pwgmsn10-20020226-5101.1.pdf
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik; et al. 选择器第 3 级. 2018 年 11 月 6 日. REC. URL: https://w3org.cn/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. 选择器第 4 级. 2022 年 11 月 11 日. WD. URL: https://w3org.cn/TR/selectors-4/

参考资料

[CSS-DEVICE-ADAPT]
Rune Lillesveen; Florian Rivoal; Matt Rakow. CSS Device Adaptation Module Level 1. 2016 年 3 月 29 日. WD. URL: https://w3org.cn/TR/css-device-adapt-1/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS 图像模块第 3 级. 2020年12月17日. CR. URL: https://w3org.cn/TR/css-images-3/
[CSS3GCPM]
Dave Cramer. CSS Generated Content for Paged Media Module. 2014 年 5 月 13 日. WD. URL: https://w3org.cn/TR/css-gcpm-3/
[JLREQ]
Hiroyuki Chiba; et al. 日语排版要求 (日本語組版処理の要件). 2020年8月11日. NOTE. URL: https://w3org.cn/TR/jlreq/

属性索引

名称初始值应用于继承百分比动画类型 (Animation type)规范顺序计算值
page auto | <custom-ident>auto创建 A 类断点的框无(但请参阅正文)不可用离散 (discrete)按语法指定的值

@page 描述符

名称初始值计算值
bleed auto | <length>auto按指定值
标记 none | [ crop || cross ]none(无)按指定值
page-orientation upright | rotate-left | rotate-rightupright按指定值
size <length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]auto指定值,其中 <length>s 均已绝对化。

问题索引

在 CSS 2.1 中,页面框和页面区域都是简单的矩形。两者都不是带有页边距、边框和填充的 CSS 框。此 CSS 框应与页面框和页面区域区分开,后者分别是其页边距区域和内容区域。命名建议?
如果媒体查询至少能响应未限定的 @page 上指定的尺寸,那将非常有用。

另一种选择是像 @viewport 规则 [CSS-DEVICE-ADAPT] 那样做:首先应用 @page 规则(匹配哪些选择器?),在媒体查询和视口百分比长度 [CSS-VALUES-3] 中使用用户代理的默认页面尺寸。所得的页面尺寸即为“基本页面尺寸”。整个样式表集将再次应用,这次使用“基本页面尺寸”进行媒体查询和视口百分比长度计算。