CSS 分页媒体模块 第3级

W3C 工作草案,

关于此文档的更多细节
此版本:
https://www.w3.org/TR/2023/WD-css-page-3-20230914/
最新发布版本:
https://www.w3.org/TR/css-page-3/
编辑草案:
https://drafts.csswg.org/css-page-3/
历史:
https://www.w3.org/standards/history/css-page-3/
反馈:
CSSWG 问题仓库
Tracker
规约内联
编辑:
Elika J. Etemad / fantasai (Apple, formerly Mozilla)
前任编辑:
Simon Sapin (Mozilla, formerly 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://www.w3.org/TR/ 中找到。

本文件由 CSS 工作组 作为 工作草案 使用 推荐路线 发布。作为工作草案的发布并不表示 W3C 及其成员对此的认可。

本文档为草案文档,可能随时被更新、替换或被其他文档废弃。除非作为正在进行的工作,否则不应引用本文件。

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

本文件受 2023年6月12日 W3C 流程文档 约束。

本文件由在 W3C 专利政策 下运作的一个小组制作。W3C 保持一份与该小组交付物相关的任何专利披露的公开列表;该页面还包含披露专利的说明。任何确知某专利包含其认为为必要权利要求的个人,必须根据 W3C 专利政策第6节 披露相关信息。

1. 介绍

分页媒体(例如纸张、透明胶片、相册页、在计算机屏幕上作为打印输出模拟显示的页面)不同于 连续媒体,因为文档内容被拆分到一个或多个独立的静态显示面上。为处理页面,CSS3 分页媒体描述了如何:

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

尽管 CSS3 并未规定用户代理如何将 page box 传输到纸张表面,但它确实包含某些机制以告知用户代理预期的页面表面尺寸和方向。在一般情况下,CSS3 假定每个 page box 将被传输到大小相似的纸张表面的一侧。

注: [CSS-BREAK-4] 规范处理对分段(分页)的控制,例如 break-beforebreak-afterbreak-insidewidowsorphans 属性。

1.1. 值定义

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

除了在各属性定义中列出的属性特定值之外,本规范中定义的所有属性也接受 CSS 宽关键字 作为它们的属性值。为便于阅读,这些关键字未在此处重复列出。

2. 页面术语

下面的术语和附图有助于描述页面模型:

Page sheet
The corner of a page sheet with the non-printable area at the edge and printable area inside it page sheet 是物理介质的一个表面。右侧插图显示了页面表面左上角的示意图。
Printable and non-printable areas
非可打印区域是指打印设备(例如打印机)通常无法可靠地标记的页面表面区域,通常由于打印机的送纸机构所限。此值取决于打印机,通常位于页面表面每个边缘的一小块区域。可打印区域是打印机能够可靠标记的页面表面区域。可打印区域的大小等于页面表面尺寸减去非可打印区域的尺寸。用户代理可能不知道特定打印设备该区域的尺寸;但当其尺寸已知时,用户代理可以调整文档的格式,使内容位于可打印区域内。如何完成此调整取决于设备,同时受 § 7.4 渲染不能适合纸张的页面框§ 3.2 页面框外的内容 中所述约束的限制。
Page Orientation
页面方向由比较 page box 的边的长度来定义。page box 是一个矩形,具有两个互相垂直的边,称为长边和短边。长边的长度始终大于或等于短边的长度。当 page box 为正方形时,两条边长度相同,可以任意指定哪一条为长边或短边。规范定义了 portraitlandscape 两种页面方向。
Portrait Orientation
纵向页面的高度大于或等于其宽度。水平元素与短边平行,垂直元素与长边平行。
Landscape Orientation
横向页面的宽度大于或等于其高度。水平元素与长边平行,垂直元素与短边平行。

注: 注意 CSS3 不区分 landscape 与 reverse-landscape。不过,未来版本的 CSS 可能会区分。用户代理在为双面打印格式化时,应在选择 landscape 与 reverse-landscape 呈现时考虑装订边、页面前进方向和易读性。

Duplex Printing
双面打印在纸张表面的每一侧各打印一个 page box 并使用纸张的两面。本模块不提供指定文档是否双面打印的能力,但左右页的概念是基于文档为双面打印的假设,无论实际是否为双面打印。
Binding Edge
装订边是 page box 朝向装订处的那一侧边。装订边通常比对侧边有更大的边距,以提供装订所占的空间。装订边可以是四条边中的任意一条。然而,页面表面通常装订方式使得纵向页面的装订边为垂直。本模块不提供指定装订边的方法。在双面打印时,左右页的装订边位于 page box 的相对两侧。
Facing Pages
对开页是两个连续的页面,当文档双面打印时它们位于不同的纸张上。通常较早的页面会是一张纸的背面,而较晚的页面会是另一张纸的正面。它们通常布局为在正常阅读方向下,对开页的装订边垂直且相邻。
Left Page
在一对对开页中位于左侧的页面。对于使用从左到右页面前进方向的文档,较早的对开页位于左侧。可以使用 :left page selector 指定针对左页的规则。
Right Page
在一对对开页中位于右侧的页面。对于使用从右到左页面前进方向的文档,较早的对开页位于右侧。可以使用 :right page selector 指定针对右页的规则。

3. 页面模型

paged media 格式化模型中,文档被传输到一个或多个 page box。page box 是一种专用的 CSS 盒,映射到矩形的打印介质表面,例如纸张的一页。它大致类似于 viewport

与其他 CSS 盒模型一样,page box 由 margin、border、padding 和 content 区域组成。page box 的 content 区域和 margin 区域具有特殊功能:

在 CSS 2.1 中,page box 和 page area 都是简单的矩形。两者都不是具有 margin、border 和 padding 的 CSS 盒。此 CSS 盒应当与 page box 和 page area 区别开来,分别对应其 margin 区域和 content 区域。有没有命名建议?

page box 的属性由在 page context 中声明的属性决定,page context 是 声明块,即 @page 规则的声明块。类似地,page-margin box 的属性由其 margin context 中声明的属性决定。page context 中的声明可以影响 page box 并/或继承到 page-margin boxes,但它们不应用于也不继承到文档的根元素或其他内容。

page box 的 containing block 通过在 page context 中使用 size 属性来指定。然后 page box 的宽度和水平边距按与 正常流中非替换块元素 相同的方式精确计算。[CSS2] page box 的高度和垂直边距以类似方式计算(不使用块高度公式)。在这两种情况下,如果值被过度约束,则不是忽略任何边距,而是调整 containing block 的大小以与 page box 的 margin 边缘一致。

3.1. 页面背景与绘制顺序

绘制页面内容时,页面图层按下列绘制顺序(从最底层开始)绘制:

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

在页面模型中,页面背景的行为类似于根背景:其 背景绘制区域bleed area,覆盖整个 page box,包括其边距(无论 background-clip 如何设置)。页面背景默认在 page box 的 padding 区域内进行锚定(并在 UA 支持 [CSS-BACKGROUNDS-3] 时尊重 background-origin)。但是,如果 background-attachment 的值为 fixed,则图像相对于包括边距在内的 page box 定位(即 背景定位区域 是页面的 margin box)。

文档画布背景作为 page box 的背景绘制:默认其 背景绘制区域 覆盖 page box 的 border box,对于支持 [CSS-BACKGROUNDS-3] 的 UA,遵循根元素上指定的 background-clip 值。尽管如此,它仍以通常方式相对于根元素或 page area 定位。

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

z-index 属性适用于 page-margin boxes。由于 position 属性不适用于 page-margin boxes,z-index 总是如同 page-margin boxes 为定位元素一样影响它们,而不考虑 position 属性的值。每个 page-margin box 总是建立一个堆叠上下文。

page-margin boxes 相互之间的默认绘制顺序,或 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 覆盖。只有当 page-margin boxes 重叠时才会有可见影响,通常不应发生重叠。

3.2. 页面框外的内容

在页面模型中格式化内容时,部分内容可能会出现在 page box 之外。例如,当元素的 white-space 属性值为 pre 时,可能会生成比 page box 更宽的盒子。再比如,当盒子为绝对定位或相对定位时,它们可能出现在“不合适”的位置,例如图像可能放置在 page box 的边缘,或远在 page box 之下 100,000 米。

关于此类元素的精确格式化规范超出本文件范围。但是,建议作者和用户代理遵循以下关于 page box 之外内容的一般原则:

3.3. 页面前进方向

CSS 在所有文档中区分左页和右页,无论是否双面打印。每个左页之后是一个右页,反之亦然。可以使用 :left:right 伪类 对左右页应用不同样式。

文档的首页是左页还是右页取决于文档的页面前进方向。page progression 是指当页面并排布局时文档打印页面的序列方向。例如,英语和横排的日语通常从左向右前进,而阿拉伯语和竖排的日语通常从右向左前进。

页面前进方向按如下确定:

如果用户代理支持来自 CSS 3 Writing Modes Module 的 directionwriting-mode 属性,则必须通过 确定 页面前进方向由 principal writing 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 box 的各个方面,例如其尺寸、方向和边距。@page 规则可在允许使用规则集的任何位置使用。 一个 @page 规则由关键字 @page、可选的以逗号分隔的 页面选择器 列表以及一个声明块(称为 页面上下文)组成。 一个 @page 规则也可以包含其他 at-规则,穿插在声明之间。本规范的当前级别仅允许在 @page 内使用 margin at-rules

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

如果在处理 page 或 margin 上下文中的声明块时遇到错误,则适用 解析错误处理规则;也就是说,块中合法的声明仍会被应用。

4.2. 页面选择器

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

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

页面类型选择器 是一个区分大小写的 CSS 标识符。 它匹配由 page 属性生成的命名页面类型。 页面类型名为 auto(ASCII 不区分大小写)不会使规则无效,但必须永远不匹配。

页面伪类ASCII 不区分大小写,其语法与常规选择器中的 伪类 相同。各种 页面伪类 在下面定义。

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;
}

如果为左右页给出了不同的声明,用户代理必须尊重这些声明,即使用户代理并未将 page box 分别传输到左右两侧的纸张上(例如仅在介质一面打印的打印机也必须产生正确格式的输出)。

注。 将声明添加到 :left:right 伪类并不必然影响文档是否以双面或单面方式由打印机输出(这超出了本规范的范围)。

4.2.2. 首页伪类: :first

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

@page { margin: 2cm } /* 所有边距设为 2cm */

@page :first {
margin-top: 10cm /* 首页顶部边距 10cm */
}

4.2.3. 空白页伪类: :blank

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

只有 leftrightrectoverso 值的 break-beforebreak-after 属性可以生成匹配 :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-margin boxes 的示例,声明块故意留空。

@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. 页面上下文中的级联

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

选择器特异性 的计算方式与 选择器模块 中定义的计算类似:

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

由于存储限制,实现可能对 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. 页面边距盒

页面边距盒是位于页面边距内的盒子,类似伪元素,可以包含生成的内容。

页面边距盒可用于创建页面的页眉和页脚,页眉/页脚是页面中为补充信息(例如页码或文档标题)保留的区域。

通常,对于以水平书写为主的文档,页面页眉 位于页面的顶部; 对于以垂直书写为主的文档,页眉位于与 装订边 相对的一侧。 对于横排文档,页眉的一种可能设计使用 @top-left-corner@top-left@top-center@top-right@top-right-corner 页面边距盒。 对于纵排文档,另一种设计可以在右页使用 @right-top@right-middle@right-bottom 页面边距盒,作为朝右页的页眉;对于朝左页,可以使用 @left-top@left-middle@left-bottom

页面页脚 通常位于页面页眉的相对端。 例如,对于在页面顶部有页眉的横排文档,其页脚可以使用 @bottom-left-corner@bottom-left@bottom-center@bottom-right@bottom-right-corner 页面边距盒 作为页脚。 对于纵排文档,页脚可能使用页面上装订边所在侧的页面边距盒。

页面边距盒相对于 page area 定位,并且与页面方向无关;例如,无论纵向还是横向,顶部的页面边距盒都位于 page area 的上方。下面的图示定义并说明了各种页面边距盒:

表 1 页面边距盒定义
盒子 描述 放置
top-left-corner 由 page box 的上边距和左边距的交叉处定义的固定尺寸盒 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 由 page box 的上边距和右边距的交叉处定义的固定尺寸盒 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 由 page box 的下边距和左边距的交叉处定义的固定尺寸盒 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 由 page box 的下边距和右边距的交叉处定义的固定尺寸盒 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. 页面边距盒的 at-规则

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

margin at-rule 是一种at-rule,用于标识页面边距盒(例如 @top-left)并包含一个描述符块(称为 margin context)。

下面的样式表在页眉中建立了标题(“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

page-margin boxes 不适用 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 的适用规则与页面边距盒相关,并可能在指定的 widthheight 导致违反其约束时,触发宽度、高度和/或边距的重新计算。如果用户代理不支持 min-heightmin-width 属性,则必须表现得好像 min-heightmin-width 恒为零。

5.3.1. 页面边距盒布局术语

除了 CSS2.1 的盒模型定义和 CSS Sizing 的尺寸术语外,以下术语在后续页面边距盒计算中使用:

available width
页面的左边框宽度、左内边距、page area 宽度、 右内边距和右边框宽度之和。换句话说,它是 page box 左右边框边缘之间的距离。该量用于计算上下页面边距盒的尺寸。
available height
页面的上边框宽度、上内边距、page area 高度、 下内边距和下边框宽度之和。换句话说,它是 page box 顶部和底部边框边缘之间的距离。该量用于计算左右页面边距盒的尺寸。
outer width
outer edge 定义的外缘宽度(参见 [CSS-BOX-3])。
min-content width
物理宽度为 min-content block sizemin-content inline size 中的较小者。
max-content width
物理宽度为 max-content block sizemax-content inline size 中的较大者。
outer min width
类似于 outer width,只是当计算的 widthauto 时使用 min-content width
outer max width
类似于 outer width,只是当计算的 widthauto 时使用 max-content width

页面边距盒的 containing block 取决于其位置:

对于角落页面边距盒,其 containing block 是由该角落相交的两个页面边距定义的矩形。

对于其它页面边距盒,containing block 是由封装的页面边距减去相邻角落页面边距盒的 containing block 所形成的矩形。这意味着该 containing block 的一维由使用的页面边距给出,另一维由 available width(对于上、下页面边距盒)或 available height(对于左、右页面边距盒)给出。

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 宽度

下列算法确定每个盒子的使用宽度。为此,未被 生成 的盒子假定具有宽度和 outer width 为零。

注:总体目标(按优先顺序)是:若中间盒 B 被生成则将其居中,最小化溢出与重叠,并按内容量成比例分配空间。

如果中间盒 B 未被 生成,则按以下方式将 available width 分配给 A 和 C:

如果中间盒 B 被 生成,按如下方式确定 A、B 和 C 的 auto 宽度:

  1. 首先,解析中间盒(B)的任何 auto 宽度:假定存在两个盒子,B 和 AC,其中 AC 的每个维度为 A 和 C 最大值的两倍(以保持 B 的居中)。按上述为 A 和 C 分配空间的方式将空间分配给这两个盒子(B 和虚拟的 AC)。
  2. 然后,通过将侧边盒(A 和 C)的 outer 宽度设置为 (available width − B 的使用 outer 宽度) ÷ 2 来解析任何侧边盒的 auto 宽度。
5.3.2.3. 处理 min-widthmax-width

min-widthmax-width 属性在可变尺寸维度上像对普通元素一样应用于页面边距盒,但同一侧的三个盒子被一起考虑。

更精确地:

  1. 临时的使用宽度按 § 5.3.2.2 解析 auto 宽度 的规则计算(不考虑 min-widthmax-width)。
  2. 如果三者中任何一个的临时使用宽度大于其 max-width,则再次应用上述规则,但这次将 max-width 的计算值用作 width 的计算值。
  3. 如果三者中任何一个的结果宽度小于其 min-width,则再次应用上述规则,但这次将 min-width 的值用作 width 的计算值。
5.3.2.4. 定位

一旦确定了盒子的尺寸,按如下方式定位:

5.3.2.5. 其它侧的盒子

@bottom-left@bottom-center@bottom-right 页面边距盒的使用值由与 @top-left@top-center@top-right 相同的规则确定。

@left-top@left-middle@left-bottom 盒子的使用值由相同规则确定,但将 "width" 替换为 "height"、将 "left" 替换为 "top"、将 "right" 替换为 "bottom"、将 "center" 替换为 "middle"。

@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 盒属性的使用值之间必须满足以下约束:

    margin-top + border-top-width + padding-top + height + padding-bottom + border-bottom-width + margin-bottom = top page margin

  2. 如果 border-top-width + padding-top + height(如果其不是 auto)+ padding-bottom + border-bottom-width, 再加上如果不是 automargin-top 和/或 margin-bottom,大于顶部页面边距的高度,则在接下来的规则中,任何作为 automargin-topmargin-bottom 值被视为零。
  3. 如果此时 heightmargin-topmargin-bottom 的计算值都不是 auto,则这些值被称为“过度约束”。在这种情况下,margin-top 的指定值被视为 auto
  4. 如果现在恰好只有一个值被指定为 auto,则其使用值由等式决定。
  5. 如果 height 被设置为 auto,则任何其它为 auto 的值变为 0,并且 height 根据得到的等式确定。
  6. 如果 margin-topmargin-bottom 都为 auto,则它们的使用值相等。这会在顶部页面边距内垂直居中页面边距盒的内容。

相同的规则适用于底部页面边距盒(bottom-left-corner、bottom-left、bottom-center、bottom-right 和 bottom-right-corner),但在过度约束的情况下,忽略的是 margin-bottom,而不是 margin-top

与此类似,对于左右页面边距盒的属性(top-left-corner, left-top, left-middle, left-bottom, bottom-left-corner; top-right-corner, right-top, right-middle, right-bottom, bottom-right-corner),有关宽度的规则适用,但将“top”替换为“left”,“bottom”替换为“right”,“height”替换为“width”。在左(右)页面边距盒的过度约束情况下,指定的 margin-leftmargin-right)会被忽略。

5.4. 页面边距盒示例

下面是一些页面边距盒用法的示例集。

下面是仅在左上方有页眉的页面示例:
@page {
  @top-left { content: "Header in Left Cell (top-left)" }
}

由于未为 top-center 或 top-right 页面边距盒定义内容,top-left 页面边距盒的范围被允许跨越 page box 的中间。

Header Example 1

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

Header Example 2

下面是一个仅在 top-right 页面边距盒有页眉的页面示例:
@page {
  @top-right { content: "Header in Right Cell (top-right)" }
}

由于中间单元格的内容为空,top-right 页面边距盒的范围被允许跨越 page box 的中间。

Header Example 3

下面是一个在 top-center 和 top-left 都有页眉的页面示例:
@page {
  @top-left { content: "Left Cell (top-left)" }
  @top-center { content: "Header in Center Cell (top-center)" }
}

Header Example 4

下面是一个在 top-center 和 top-right 都有页眉的页面示例:
@page {
  @top-center { content: "Header in Center Cell (top-center)" }
  @top-right { content: "Right Cell (top-right)" }
}
margin: 10%;

Header Example 5

下面是一个在 top-left 和 top-right 都有页眉的页面示例:
@page {
  @top-left { content: "Header in top-left with approx. twice as many words as right cell." }
  @top-right { content: "Right cell (top-right)" }
}

由于没有中心单元格内容,top-left 的范围被允许跨越 page box 的中间。

Header Example 6

6. 页面属性

附录 A 定义了适用于 page box 的规范性 CSS 2.1 [CSS2] 属性列表。如果符合规范的用户代理在块级盒上支持其中任何属性,则它也必须在 page context 中支持该属性。 本规范还定义了仅在 page context 中适用的 size 属性。

可在 page context 中设置也适用于 page-margin boxes 的属性:如果这些属性是可继承的或在 margin context 中显式使用 inherit 关键字继承的,它们将继承到页面边距盒。

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

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

注: 未定义其它属性的目的是允许随时间逐步添加合适的 CSS3 属性,而无需每次添加时都更新本规范。

与文档中的元素一样,page context 和 margin context 对每个属性都有一个计算值,即使该属性不适用于 page 或 page-margin box。

CSS 属性的常规规则适用,但有下列例外:

用户代理应通过其用户代理样式表建立一个包含任何不可打印区域的默认页面边距。作者应假定默认页面区域不会包含不可打印区域。

6.1. 基于页面的计数器

计数器可以在 @page 规则内定义和控制,并可在页面边距盒中用作 content。这在维护页面计数时很有用。

在 page 或 margin context 中的 counter-increment 会在每生成一个 page box 时使计数器递增。

如果在 page context 中重置或递增一个计数器,则该计数器在所有页面边距盒中都有作用域,并遮蔽文档中同名的所有计数器。

如果在 margin context 中重置或递增一个计数器,则该计数器在该页面边距盒中有作用域,并遮蔽 page context 和文档中同名的任何计数器。

如果 margin context 或 page context 中未重置或递增的计数器在 margin context 中被 counter() 或 counters() 使用,则结果值正如页面边距盒作为在页面开始处文档内的一个元素、位于跨页断点的正常流中最深的元素内部那样计算。以这种方式使用计数器不会影响计数器值的计算。

名为 page 的计数器会自动创建,并在文档的每一页上递增 1,除非 counter-incrementpage context 中显式指定了对 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. 页面边距盒与默认值

在 page 或 margin 上下文中使用的属性从各自的属性定义取得其初始值;然而,用户代理必须表现得好像下面表格中的值由用户代理默认样式表中的规则建立。

表 2. 页面边距盒的默认值
页面边距盒 text-align vertical-align
top-left-corner right middle
top-left left middle
top-center center middle
top-right right middle
top-right-corner left middle
left-top center top
left-middle center middle
left-bottom center bottom
right-top center top
right-middle center middle
right-bottom center bottom
bottom-left-corner right middle
bottom-left left middle
bottom-center center middle
bottom-right right middle
bottom-right-corner left middle
这个示例样式表可用于创建一个居中的页眉,显示当前章节名:
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 属性

Name: size
For: @page
Value: <length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]
Initial: auto
Computed value: specified value, with <length>s made absolute.

该属性指定 page box 的 containing block 的目标尺寸和方向。在通常情况下,如果一个 page box 呈现在一个 page sheet 上,size 属性也指示目标 page sheet 的尺寸。

page box 的尺寸可以是“绝对的”(固定尺寸)或“可缩放的”(即适配可用的纸张尺寸)。下表的前三个值可用于创建可缩放 page box。其它值定义固定尺寸的 page box,从而指示首选的输出介质尺寸。应尽可能在所指示的介质尺寸上呈现输出。如果指定的尺寸不可用,则适用将 page box 转置到不同尺寸的规则。

如果 size 属性声明被某个 width、height、device-width、device-height、aspect-ratio、device-aspect-ratio 或 orientation 媒体查询(或其它基于纸张大小的条件)限定,则该声明必须被忽略。媒体查询不会尊重 size:它们假定在未指定任何 @page 规则时会选择的纸张尺寸。

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

另一种选择可能像 @viewport 规则那样:首先应用 @page 规则(匹配哪些选择器?),使用用户代理的默认页面尺寸为媒体查询和视口百分比长度提供基准。得到的页面尺寸作为“基页尺寸”。然后再次应用整个样式表,这次在媒体查询和视口百分比长度中使用“基页尺寸”。

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

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

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

auto
page box 将被设置为由用户代理选择的尺寸和方向。在通常情况下,page box 的尺寸和方向选择与目标介质表面匹配。
landscape
指定页面内容以横向方向打印。page box 的较长边为水平。如果未指定 <page-size>,page sheet 的尺寸由用户代理选择。
portrait
指定页面内容以纵向方向打印。page box 的较短边为水平。如果未指定 <page-size>,page sheet 的尺寸由用户代理选择。
<length>
page box 将设置为给定的绝对尺寸。如果仅指定一个长度值,则同时设置宽度和高度(即为正方形)。如果指定两个长度值,第一个为 page box 宽度,第二个为 page box 高度。以 em 和 ex 为单位的值参照 page context 的字体。负长度非法。
<page-size>
页面尺寸可以使用下列媒体名称之一指定。这等价于使用长度值指定 size。媒体名称的定义来自 Media Standardized Names [PWGMSN]。
A5
等同于 ISO A5:宽 148mm,高 210mm。
A4
等同于 ISO A4:宽 210mm,高 297mm。
A3
等同于 ISO A3:宽 297mm,高 420mm。
B5
等同于 ISO B5:宽 176mm,高 250mm。
B4
等同于 ISO B4:宽 250mm,高 353mm。
JIS-B5
等同于 JIS B5:宽 182mm,高 257mm。
JIS-B4
等同于 JIS B4:宽 257mm,高 364mm。
letter
等同于北美 letter:宽 8.5 英寸,高 11 英寸。
legal
等同于北美 legal:宽 8.5 英寸,高 14 英寸。
ledger
等同于北美 ledger:宽 11 英寸,高 17 英寸。

这些 <page-size> 名称可与 landscapeportrait 结合使用以指示尺寸与方向。

@page {
size: A4 landscape;
}

上例将 page box 的宽度设置为 297mm,高度设置为 210mm。此示例中的 page box 应在 210 mm x 297 mm 的 page sheet 上呈现。

在下列示例中,page box 的外边缘将与页面对齐。margin 属性上的百分比值相对于页面尺寸,因此如果 page sheet 尺寸为 210mm x 297mm(即 A4),边距分别为 21mm 和 29.7mm。假设 UA 默认样式表中未设置页面边框或内边距,结果的 page area 为 189mm x 267.3mm(210mm-21mm x 297mm-29.7mm)。
@page {
size: auto;/* auto is the initial value */
margin: 10%;
}
@page {
size: 8.5in 11in;/* width height */
}

上例将 page box 的宽度设置为 8.5 英寸,高度设置为 11 英寸。这表明 page sheet 尺寸应为 8.5"x11",方向为 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" 纸张被设置为 3cm 的页面边距,而 "letter" 纸张被设置为 1in 的页面边距。

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

Name: page-orientation
For: @page
Value: upright | rotate-left | rotate-right
Initial: upright
Computed value: 按指定值

高质量的打印实现能够处理不同尺寸和方向的页面,因此作者可以根据页面内容的最佳呈现选择页面尺寸。例如,他们可能对文档的大部分页面使用 size: letter portrait;,但为了排版一张宽表格而改用 size: letter landscape;

然而,将内容在不同宽度的页面之间流动是相对复杂的任务,目前许多流行的打印实现(尤其是网页浏览器)尚未完善解决该问题。page-orientation 描述符旨在帮助这些实现,使它们能够在单一一致的尺寸下进行布局,但在输出媒体(例如 PDF)中在布局后改变方向,以便希望以不同方向显示的页面能够实现该效果。

其值定义如下:

upright

不应用特殊方向;页面按常规布局和格式化。

rotate-left

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

rotate-right

rotate-left 相同,区别在于页面必须相对于其布局方向向右(顺时针)旋转四分之一圈进行显示。

注: 页边盒和其它定位内容与此属性没有特殊交互;它们将在未旋转的页面中按常规布局,然后与其它内容一同旋转。

该属性旨在作为对能力较弱实现的权宜之计,使其在尚未具备跨不同尺寸页面流动内容能力之前,仍能打印混合纵向和横向方向的文档。使用此属性需要一些不便的变通,例如需要指定一个仅包含英文的宽表格使用垂直的 writing-mode,使其以“侧向”方式布局,然后在打印输出中再旋转回可读的方向。

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

7.2. 裁切和对位标记:marks 属性

Name: marks
For: @page
Value: none | [ crop || cross ]
Initial: none
Computed value: 按指定值

此属性向文档添加裁切(crop)和/或对位(registration)标记。这些标记打印在 page box 之外,用于便于修边和对齐纸张。各值含义如下:

none
指定不打印裁切标记或对位标记:bleed area 之外的区域将完全为空白。
crop
指定应打印裁切标记。通常这些是位于 page box 之外的短线,实质上是 page box 四条边的延伸,从而指示这些边的精确位置,而不会在 page box 内或其附近放置墨水。
cross
指定应打印对位标记。通常这些是在 page box 每条边外的十字形标记,用于打印过程中的纸张对齐。

注意,只有当 page box 小于可打印区域时,裁切标记和对位标记才可见。

若要在文档上设置裁切和对位标记,可使用如下代码:
@page { marks: crop cross }

7.3. 出血区域:bleed 属性

Name: bleed
For: @page
Value: auto | <length>
Initial: auto
Computed value: 按指定值

此属性指定 page box 之外的 bleed area 的范围;换言之,指定了 page box 之外页面渲染被裁剪的范围。各值含义如下:

auto
如果 marks 包含 crop,则计算为 6pt,否则为零。
<length>
指定 bleed area 在每个方向上相对于 page box 向外延伸的距离。值可以为负,但可能存在实现特定的限制。

7.4. 将不适合纸张的 page box 渲染到纸张上

如果 page box 与目标 page sheet 尺寸不匹配,用户代理应采取下列之一措施(按首选顺序):

  1. 在更大的 page sheet 上以指定尺寸渲染该 page box。
  2. 如果旋转 90° 能使 page box 适配 page sheet,则对 page box 进行 90° 旋转。
  3. 缩放 page box 以适配 page sheet。(应保持 page box 的纵横比。)
  4. 以图形方式将 page box“切片”到多个 page sheet 上。
  5. 裁剪溢出的内容(最不推荐)。

用户代理在执行这些操作前可能希望征询用户意见。

7.5. 在纸张上定位 page box

当 page box 小于 page sheet 时,用户代理应当:

用户代理在这方面也可能希望征询用户意见。

8. 页面分页

CSS 分段模块 [CSS-BREAK-3] 定义了 CSS 盒子如何以及在何处可以被分段(fragmented),包括跨页面分页。它定义了一些属性,用于指示用户代理可在何处或必须在何处分页,以及随后的内容在哪一类页面(左页或右页)上继续。每个页面分页结束当前 page box 的布局,并导致文档树剩余部分在新的 page box 中继续布局。

8.1. 使用命名页面:page

Name: page
Value: auto | <custom-ident>
Initial: auto
Applies to: 在创建 类 A 断点的盒子上
Inherited: 否(但见正文)
Percentages: 不适用
Computed value: 指定值
Canonical order: 按语法
Animation type: 离散

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

注: 可以在 页面选择器 中使用相同的类型名称为该页面进行样式设置。

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

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

由于本规范的先前版本曾表明 page 属性被继承,仍然符合 CSS Paged Media Level 3 的实现可选择继承该属性并将 auto 始终视为命名空字符串。注意此例外将在第4级被移除。因此作者不应在具有非 auto 值的元素的后代上显式指定 auto,因为结果行为将不可预测。

page 属性的工作方式如下:

  1. 首先,将任何 auto 值解析为相对于非 auto 的祖先(如上所述)。
  2. 接下来,为每个盒子确定一个 start pageend page,它们分别是来自其第一个或最后一个子盒子(如果有)传播的值,否则为该盒子自身的使用值。当且仅当 page 属性适用于子盒子时,子盒子才会传播其自己的 startend page value

    注: 第一个或最后一个子 盒子 并不总是由第一个或最后一个子 元素 生成。例如,一个元素可能只有一个前置兄弟元素,其设置为 display: none,并未生成任何盒子。

  3. 根的第一个打印页面的类型即为根的 start page value
  4. 如果在任何两个在 类 A 断点相接的盒子中,先行盒子的 end page value 与后续盒子的 start page value 不匹配,则在两盒子之间强制分页,并使分页后续内容在具有该命名类型的 page box 上继续。

注: 本质上,被比较的两个 page 值来自于在 类 A 断点 处相接的最深盒子,忽略任何以不适用 page 属性的盒子为根的子树。

有关页面分页的更多细节,请参见 [CSS-BREAK-3]

在此示例中,两张表格被渲染在横向页面上(若它们能适合,甚至在同一页上)。表格之后的 <p> 使用页面类型 "narrow",因为表格元素的页面属性不再生效:
@page narrow { size: 9cm 18cm }
@page rotated { size: landscape }
div { page: narrow }
table { page: rotated }
with this document:
<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. 图像属性

Note: 本节已移至 [CSS-IMAGES-3]

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

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

此列表定义了 page properties(页面属性)。 它们在 § 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 属性 height
min-height
max-height
line-height
边距属性 margin-top
margin-right
margin-bottom
margin-left
margin
轮廓(outline)属性 outline-width
outline-style
outline-color
outline
内边距(padding)属性 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 属性 width
min-width
max-width

适用于边距上下文的 CSS 2.1 属性

此列表定义了 page-margin properties(页面边距属性)。 它们在 § 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
content
color
字体属性 font-family
font-size
font-style
font-variant
font-weight
font
height 属性 height
min-height
max-height
line-height
边距属性 margin-top
margin-right
margin-bottom
margin-left
margin
轮廓(outline)属性 outline-width
outline-style
outline-color
outline
overflow
内边距(padding)属性 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 属性 width
min-width
max-width
z-index

附录 B:传输可能性

在许多情况下(但并非总是),page box 与最终将文档呈现到其上的物理表面是一一对应的。CSS3 页面模型仅规定 page box 内的格式化,但将 page box 转移到纸张表面是用户代理的责任。一些不在 CSS3 中处理的用户代理传输方式包括:

隐私和安全注意事项

本规范未引入新的隐私或安全注意事项。

更改

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 Paged Media Level 3 提供了评审和评论。

一致性

文档约定

一致性要求以描述性断言和 RFC 2119 术语的组合来表达。规范性部分中使用的关键词 “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY” 和 “OPTIONAL” 应按 RFC 2119 中的描述进行解释。 为了可读性,这些词在本规范中并非全部大写显示。

除非明确标注为非规范性、示例和注释的章节外,本规范文本均为规范性文本。[RFC2119]

本规范中的示例以 “for example” 引入,或以 class="example" 与规范性文本区分,如下示例所示:

这是一个参考性示例。

参考性注释以 “Note” 开头,并以 class="note" 与规范性文本区分,如下所示:

注意:这是一个参考性注释。

提示性段落为规范性章节并以 <strong class="advisement"> 标记与其它规范性文本区分,例如: 用户代理必须提供可访问的替代方案。

一致性类别

本规范定义了三类一致性对象:

样式表
CSS 样式表
呈现器
指解释样式表语义并呈现使用它们的文档的用户代理(UA)。
创作工具
指生成样式表的用户代理(UA)。

如果一个样式表中使用了本模块定义的语法,且该语句在通用 CSS 语法和各功能的独立语法下均为有效,则该样式表符合本规范。

如果一个呈现器在解释样式表时遵循相关规范,且通过正确解析并呈现文档来支持本规范定义的所有特性,则该呈现器符合本规范。但是,由于设备限制导致的无法正确呈现不应视为不符合(例如,单色显示器上无法呈现颜色并不使 UA 不符合规范)。

如果创作工具能生成在通用 CSS 语法和本模块各特性语法下均语法正确的样式表,并满足本模块对样式表的一切一致性要求,则该创作工具符合本规范。

部分实现

为了让作者利用向前兼容的解析规则来指定回退值,CSS 呈现器必须将其不具备可用支持级别的 at-rule、属性、属性值、关键字及其它语法构造视为无效(并按需忽略)。特别地,用户代理不得在单个多值属性声明中选择性地忽略不支持的组件值而保留支持的值:若某个值被视为无效(如不支持的值应被视为无效),CSS 要求整个声明被忽略。

不稳定和专有特性的实现

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

非实验性实现

一旦规范进入候选推荐(Candidate Recommendation)阶段,可以出现非实验性实现,且实现者应在能证明正确实现 CR 级别特性的情况下发布无前缀实现。

为建立并维护跨实现的 CSS 互操作性,CSS 工作组请求非实验性 CSS 呈现器在发布任何其能证明正确实现的 CR 级别特性的不带前缀实现之前,向 W3C 提交实现报告(如有必要,包含用于该实现报告的测试用例)。提交给 W3C 的测试用例将接受 CSS 工作组的审查和修正。

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

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性参考

[CSS-ANCHOR-POSITION-1]
Tab Atkins Jr.; Ian Kilpatrick. CSS Anchor Positioning. 29 June 2023. WD. URL: https://www.w3.org/TR/css-anchor-position-1/
[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 14 February 2023. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-3]
Elika Etemad. CSS Box Model Module Level 3. 6 April 2023. REC. URL: https://www.w3.org/TR/css-box-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 3 November 2022. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 4 December 2018. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 18 December 2018. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 13 January 2022. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2 August 2019. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 30 March 2023. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 21 December 2021. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad. CSS Inline Layout Module Level 3. 1 April 2023. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 3 April 2023. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 17 December 2021. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 24 December 2021. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 3 September 2023. CR. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-4]
Elika Etemad; et al. CSS Text Module Level 4. 29 March 2023. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 1 December 2022. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 6 April 2023. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 10 December 2019. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 30 July 2019. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 7 June 2011. REC. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 12 April 2016. WD. URL: https://www.w3.org/TR/CSS22/
[MEDIAQ]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 25 December 2021. CR. URL: https://www.w3.org/TR/mediaqueries-4/
[MEDIAQUERIES-5]
Dean Jackson; et al. Media Queries Level 5. 18 December 2021. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[PWGMSN]
Ron Bergman; Tom Hastings. Media Standardized Names. 26 February 2002. 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. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik; et al. Selectors Level 3. 6 November 2018. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 11 November 2022. WD. URL: https://www.w3.org/TR/selectors-4/

参考性参考

[CSS-DEVICE-ADAPT]
Rune Lillesveen; Florian Rivoal; Matt Rakow. CSS Device Adaptation Module Level 1. 29 March 2016. WD. URL: https://www.w3.org/TR/css-device-adapt-1/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 17 December 2020. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS3GCPM]
Dave Cramer. CSS Generated Content for Paged Media Module. 13 May 2014. WD. URL: https://www.w3.org/TR/css-gcpm-3/
[JLREQ]
Hiroyuki Chiba; et al. Requirements for Japanese Text Layout 日本語組版処理の要件(日本語版). 11 August 2020. NOTE. URL: https://www.w3.org/TR/jlreq/

属性索引

名称 初始值 适用对象 继承 % 值 动画类型 规范顺序 计算值
page auto | <custom-ident> auto 创建 class A 断点的盒子 否(但见正文) 不适用 离散 按语法 指定值

@page 描述符

名称 初始值 计算值
bleed auto | <length> auto 按指定值
marks none | [ crop || cross ] none 按指定值
page-orientation upright | rotate-left | rotate-right upright 按指定值
size <length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ] auto 指定值,且 <length> 被转换为绝对值。

问题索引

在 CSS 2.1 中,page box 和 page area 都是简单的矩形。它们都不是带 margin、border 和 padding 的 CSS 盒。这个 CSS 盒应该与 page box 和 page area 区分开来,分别对应其 margin 区域和 content 区域。有没有命名建议?
如果媒体查询至少能响应未限定 @page 上指定的尺寸,那会很有用。

另一种选择可能像 @viewport 规则那样:首先应用 @page 规则(匹配哪些选择器?),使用用户代理的默认页面尺寸作为媒体查询和视口百分比长度的基准。得到的页面尺寸为“基页尺寸”。然后再次应用整个样式表,这次在媒体查询和视口百分比长度中使用“基页尺寸”。