分页媒体的CSS生成内容模块

W3C 工作草案

关于本文档的更多信息
本版本:
https://www.w3.org/TR/2024/WD-css-gcpm-3-20240125/
最新发布版本:
https://www.w3.org/TR/css-gcpm-3/
编辑草稿:
https://drafts.csswg.org/css-gcpm/
历史记录:
https://www.w3.org/standards/history/css-gcpm-3/
反馈:
CSSWG 问题仓库
规范内反馈
编辑:
BFO
Google
前编辑:
Hachette Livre
Håkon Wium LieOpera Software
为本规范提出修改建议:
GitHub 编辑器

摘要

书籍和其他分页媒体常常采用特殊的技术来展示信息。内容可能会被移到页面的特殊区域,或为这些区域生成内容,例如活页眉、活页脚或脚注。页面中的生成内容,如点线引导或交叉引用,有助于读者在页面内外进行导航。

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

本文件状态

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

本文档由 CSS 工作组工作草案 的形式,并按照 推荐轨道 发布。 作为工作草案发布并不意味着 W3C 及其成员已认可该文档。

本文档为草稿,可能随时被更新、替换或废止。除“正在进行的工作”外,不适宜引用本文件。

请通过在 GitHub 提交 issue(推荐,标题中包含规范代码 “css-gcpm”,格式例如:“[css-gcpm] …意见摘要…”)来反馈问题。 所有问题和评论都会被归档。 或者,也可以将反馈发送至(归档)公共邮件列表 www-style@w3.org

本文件受 2023年11月3日 W3C 过程文档 管辖。

本文档由遵循 W3C 专利政策 的小组制作。 W3C 维护着一份与该小组交付物相关的已披露专利的公开列表; 该页面还包括专利披露说明。 若某人实际知晓某项专利并认为其包含必要权利要求,则必须按照W3C 专利政策第6节进行披露。

引言

分页媒体在文档内容的展示上有许多特殊需求,这些需求是在印刷书籍的悠久历史中逐渐发展而来的。活页眉和活页脚有助于导航。注释可以作为脚注出现在页面底部。页面本身的属性也可能会根据其内容或在文档中的位置发生变化。引导符用于在视觉上连接相关内容。交叉引用可能需要生成文本。一些分页媒体格式(如 PDF)使用书签进行导航。

本模块定义了新的属性和值,使作者能够将这些技术应用于分页媒体。

值定义

本规范遵循CSS 属性定义惯例(参见[CSS21]),并使用值定义语法(参见[CSS-VALUES-3])。 未在本规范中定义的值类型在 CSS Values & Units [CSS-VALUES-3] 中定义。 与其他 CSS 模块的结合可能会扩展这些值类型的定义。

除了各自定义中列出的特定属性值之外, 本规范中定义的所有属性 也接受CSS 全局关键字作为其属性值。 为了可读性,这些并未在每处重复列出。

1. 活页眉和活页脚

[CSS3PAGE] 描述了可用于活页眉和活页脚的十六个页面边距盒,但并未描述在这些盒中插入内容的机制。本模块提供了两种实现方法。命名字符串可将文本复制以便在边距盒中复用。活动元素可将元素(包含样式和结构)从文档移动到边距盒。

1.1. 命名字符串

string-set 属性将元素的文本内容复制到一个命名字符串,其功能类似于变量。命名字符串的文本内容可通过string()函数获取。由于这些变量在某一页上可能会发生变化,string()函数的第二个可选参数允许作者选择页面上的哪个值被使用。

1.1.1. string-set 属性

Name: string-set
Value: [ <custom-ident> <content-list> ]# | none
Initial: none
Applies to: 所有元素,但不包括伪元素
Inherited: no
Percentages: N/A
Computed value: 指定值
Canonical order: 按语法顺序
Animation type: 离散

用户代理应在所有媒体上支持该属性,包括非可视媒体。

string-set 属性包含一个或多个对,每对由自定义标识符(命名字符串的名称)后跟一个<content-list>组成,用于描述如何构造命名字符串的值。

<content-list> 可扩展为以下值之一或多个,顺序不限。

<content-list> = [ <string> | <counter()> | <counters()> | <content()> | <attr()> ]+
<string>
一个字符串,定义见[CSS21]
<counter()>
一个counter()函数,详见[CSS21]
<counters()>
一个counters()函数,详见[CSS21]
<content()>
下文描述的content()函数。
<attr()>
一个attr()函数,定义见[CSS-VALUES-3]
1.1.1.1. content() 函数
content() = content([text | before | after | first-letter ])

我们如何定义该函数的默认值?

text
元素的字符串值,效果等同于设置 white-space: normal。这是默认值。
before
::before 伪元素的字符串值,效果等同于设置 white-space: normal
after
::after 伪元素的字符串值,效果等同于设置 white-space: normal
first-letter
元素的首字母,定义见 ::first-letter 伪元素

命名字符串的内容值在元素内容盒首次创建时(或如果元素的 display 为 none 时,假定会创建时)被分配。页面的入口值为上一页结束时生效的赋值,出口值为当前页结束时生效的赋值。

每当元素的值发生变化时,命名字符串的值也会被更新。用户代理必须能够记住命名字符串的多个值,因为string()函数可以返回过去、现在或未来的赋值值。

HTML:

<h1>Loomings</h1>

CSS:

h1::before { content: 'Chapter ' counter(chapter); }
h1 { string-set: header content(before) ':' content(text); }
h1::after { content: '.'; }

命名字符串“header”的值将为“Chapter 1: Loomings”。

HTML:
<section title="Loomings">

CSS:

section { string-set: header attr(title) }

“header”字符串的值将为“Loomings”。

1.1.2. string() 函数

string() 函数用于通过content属性将命名字符串的值复制到文档中。该函数需要一个参数,即命名字符串的名称。由于命名字符串的值在页面上可能会多次变化(因为定义该字符串的元素实例不断出现),可选的第二个参数用来指定应使用命名字符串的哪个值。

string()函数的第二个参数为以下关键字之一:

first
使用页面上的第一次赋值的值。如果页面上没有赋值,则使用入口值first是默认值。
start
如果该元素是页面上的第一个元素,则使用第一次赋值的值。否则使用入口值。如果该元素尚未出现,入口值可能为空。
last
使用该命名字符串的出口值
first-except
first一致,但在赋值所在的页面上使用空字符串。
CSS:
@page {
   size: 15cm 10cm;
   margin: 1.5cm;

   @top-left {
   content: "first: " string(heading, first);
   }
   @top-center {
   content: "start: " string(heading, start);
   }
    @top-right {
    content: "last: " string(heading, last);
   }
  }

h2 { string-set: heading content() }

下方示意图展示了各页上“heading”字符串的 first、start 和 last 赋值:

start值为空,因为该页开始时字符串尚未被设置。
由于该页以 h2 开头,start值为该标题的值。
由于本页顶部不是 h2,start值为前一页的出口值

1.2. 活动元素

许多页眉和页脚不能仅用未格式化的文本表示。例如,作为活页眉的书名可能包含斜体单词。需要一种机制将元素移动或复制到边距盒中。为此,我们为 position 属性增加了running()值,并为 content 属性增加了element()值。
@page {
  @top { content: element(header); }
}

h1 { position: running(header); }

在该示例中,h1 元素被放置在 @top 边距盒内,保留格式和所有子元素,并不会在常规文档流内显示。

1.2.1. running()

position: running(custom-ident) 会将该元素(及其关联的 ::before 和 ::after 伪元素)从常规文档流移除,并可通过element()放到页面边距盒。该元素保留其在文档中的继承属性,但不会在原文档位置显示。

Name: position
New values: <running()>
running() = running( <custom-ident> )

HTML:

<p class="rh"><i>Miranda v. Arizona</i> in Context</p>
<h2><i>Miranda v. Arizona</i> in Context</h2>

CSS:

@top-center {
  content: element(heading);
  }

p.rh {
  position: running(heading);
  }

p.rh::before {
  content: counter(page) ' / ';
  }

running header using running elements

页面边距盒中的活动元素

element()只能用于页面边距盒,且不能与 content 属性的其他可选值组合使用。

如果我们也能复制(而不仅仅是移动)元素,这个想法会更有用。这将避免上面示例中的 HTML 重复。

Bert Bos 提出了一个替代语法,允许元素被移动或复制到活页眉中。如下例所示,h2 元素既出现在文档正常位置,也会被复制到活页眉。

h2 {
display: block;
running: chapter;
font-size: 18pt;
font-weight: bold;
}

h2:running {
display: inline;
font-size: 11pt;
font-weight: normal;
font-variant: small-caps;
letter-spacing: 1pt;
}

@page {
  @top-center {
    content: element(chapter);
    }
  }
Name: running
Value: <custom-ident>
Initial: none
Applies to: 元素
Inherited: no
Percentages: N/A
Computed value: 指定值
Canonical order: 按语法顺序
Animation type: 离散

用户代理应在所有媒体上支持该属性,包括非可视媒体。

1.2.2. element()

content 属性的 element() 值可将一个(通过 running() 移出常规流的)元素放置到页面边距盒中。每当元素的值发生变化时,element() 的值也会更新。

string() 类似,element() 也可以带一个可选关键字,用于描述在页面上有多次赋值时应使用哪个值。用户代理必须能够记住多个值,因为 element() 可以返回赋值的过去、当前或未来的值。

Name: content
New values: <element()>
element() = element( <custom-ident> , [ first | start | last | first-except ]? )

2. 脚注

辅助内容可以被移动到页面的底部或侧边。当这样的内容被移动到页面底部并留下一条引用标记时,就创建了脚注。

2.1. 术语

脚注是复杂的对象(参见 脚注章节[dpub-latinreq]),因此在继续之前,定义一些术语会很有帮助。

page with footnotes

脚注术语
footnote element
包含脚注内容的元素,将从文档流中移除并作为脚注显示。
footnote marker (也称为 footnote number)
位于脚注正文旁的数字或符号,用于标识特定脚注。脚注标记应与相应脚注调用使用相同的数字或符号,尽管标记可以包含额外的标点符号。
footnote body
脚注标记位于脚注元素前,与脚注元素共同组成脚注正文,最终放置在脚注区域。
footnote call (也称为 footnote reference)
主文本中出现的数字或符号,用于指向脚注正文。
footnote area
用于显示脚注的页面区域。
footnote rule (也称为 footnote separator)
水平分隔线通常用于将脚注区域与页面其他部分分隔开。该分隔线(及整个脚注区域)不能在没有脚注的页面上渲染。

2.2. 创建脚注

通过对元素应用 float: footnote,该元素会变成脚注。这将触发以下操作:
  1. 脚注元素从文档流中移除,其位置插入一个 ::footnote-call 伪元素,用作对脚注的引用。
  2. 一个用于标识脚注的 ::footnote-marker 伪元素被放在脚注元素的开头。它们一起构成脚注正文。
  3. 脚注计数器递增。
  4. 脚注正文被放置在页面底部的脚注区域。来自同一页的脚注元素按文档顺序放入该页的脚注区域。
HTML:
<p>Though the body was erect, the head was thrown back so that the closed eyes were pointed towards the needle of the tell-tale that swung from a beam in the ceiling.<span class="footnote">The cabin-compass is called the tell-tale, because without going to the compass at the helm, the Captain, while below, can inform himself of the course of the ship.</span></p>

CSS:

@page {
  @footnote {
    float: bottom;
  }
}

span.footnote { float: footnote; }

为什么在脚注区域要用 float:bottom?将脚注浮动到脚注区域,然后再将脚注区域自身浮动,看起来过于复杂,因为实现上并不允许脚注区域浮动到其他地方。注意有些实现允许脚注区域绝对定位。

2.3. 脚注类型

以下是 float 属性的新值,用于创建脚注元素:
Name: float
New values: footnote
footnote
每个脚注元素被放置在页面的脚注区域中

footnote-display 属性决定脚注是以块级元素还是内联元素显示。

Name: footnote-display
Value: block | inline | compact
Initial: block
Applies to: elements
Inherited: no
Percentages: N/A
Computed value: specified value
Canonical order: per grammar
Animation type: discrete
block
脚注元素以块级元素的方式放入脚注区域
inline
脚注元素以内联元素的方式放入脚注区域
compact
由用户代理决定脚注元素是以块级还是内联方式放置。如果同一行可以容纳两个以上脚注,则应以内联方式放置。

2.4. 脚注区域

可以用于显示脚注的页面区域,在页面上下文中通过 @footnote 规则描述。该规则定义了一个盒子,若被使用,将包含该页所有出现的脚注元素。

在 CSS3-Page 的语法中如何描述这一点?

2.4.1. 脚注区域的位置

脚注区域的底边缘与页面区域的底部贴合。脚注区域只能包含脚注。

脚注在多栏文本中如何工作?Prince 使用 float: prince-column-footnote 可在栏底生成脚注而不是页面底部。

支持脚注的实现一般也支持 float: bottom 等页面浮动。页面浮动内容应出现在脚注区域之上,这应如何规范?

2.4.2. 脚注区域的尺寸

脚注区域上的 max-height 属性限制该区域的大小,除非页面只包含脚注(如文档最后一页可能出现的情况)。

由于页面只包含脚注是不理想的,用户代理可以为脚注区域设置默认 max-height 值。

2.5. 脚注计数器

脚注计数器 是与脚注元素关联的预定义计数器。它的值用于标识脚注的数字或符号,在脚注调用和脚注标记中都要使用,并应为每个脚注递增。

2.5.1. 脚注计数器的值

脚注计数器与其他计数器一样,可以采用任意计数器样式。脚注常用符号序列。

::footnote-call { content: counter(footnote, symbols('*', '†', '‡', '§')); }

::footnote-marker { content: counter(footnote, symbols('*', '†', '‡', '§')) '. '; }

2.5.2. 重置脚注计数器

脚注计数器可以在每一页重置。

@page {
  counter-reset: footnote;
  @footnote { … }
}

注意,脚注计数器的值应取决于脚注元素在文档树中的位置,而不是最终放置的位置。有时脚注元素会被放到脚注调用之后的页面,但两者必须使用同一个计数器值。

2.6. footnote-call 伪元素

当脚注元素被移出文档流时,会在其原位置插入一个 ::footnote-call 伪元素。默认情况下,该伪元素的内容为脚注计数器的值,样式为上标数字。
::footnote-call {
content: counter(footnote);
vertical-align: baseline;
font-size: 100%;
line-height: inherit;
font-variant-position: super;
}

2.7. footnote-marker 伪元素

::footnote-marker 伪元素表示脚注元素的标记,即用来标识每个脚注的数字或符号。该伪元素行为类似 ::marker 伪元素(定义见[CSS3LIST])。它被放置在上级父元素内容的开头,默认是内联的。::footnote-marker 可以像其他 ::marker 元素一样设置样式。默认样式应包括 list-style-position: inside
::footnote-marker {
content: counter(footnote);
}

::footnote-marker::after {
content: '. ';
}

2.8. 脚注渲染与 footnote policy

渲染脚注有一定复杂性。如果脚注出现在页面底部附近,则页面上可能没有足够空间容纳脚注正文。footnote-policy 属性允许作者对复杂页面的脚注渲染方式进行一定控制。

Name: footnote-policy
Value: auto | line | block
Initial: auto
Applies to: elements
Inherited: no
Percentages: N/A
Computed value: specified value
Canonical order: per grammar
Animation type: discrete
auto
用户代理决定如何渲染脚注,并且可以将脚注正文放在脚注引用之后的页面。脚注正文绝不可出现在引用之前的页面。
line
如果某个脚注正文因空间不足无法放在当前页,用户代理会在包含脚注引用的行前强制分页,使引用和正文都出现在下一页。注意,用户代理在这样做时必须遵循孤行寡行设置,因此可能需要在更前的行插入分页。
block
line 类似,但强制分页发生在包含脚注的段落前。

我们需要一个脚注排版算法

2.9. 未来方向

下一版本将包括边注、分栏脚注和多脚注区。

3. 选择页面

分页文档由一系列页面组成。[CSS3PAGE] 定义了 页面选择器,可选择文档首页、左页、右页和空白页。这里我们扩展页面选择器的概念,使其可以选择任意文档页。

3.1. 页面选择器

:nth() 页面伪类可选择任意文档页。该伪类的参数为 An + B,定义见 [CSS3SYN]。应用于默认 @page 规则时,:nth() 选择索引与参数匹配的文档页。
:nth() = :nth( <an+b> [of <custom-ident>]? )

:nth() 与页面计数器无关,后者可重置且支持多种编号方案。

:nth() 选择器应用于命名页面,且该页面属于页面组(见下文)时,将选择页面组中的第 n 页。

@page :nth(1)

这将选择文档的第 1 页。

@page :nth(2n)
这将选择所有偶数页。

3.2. 页面组

许多分页文档具有重复结构,包括多个章节、节或文章。每个子区块的首页通常需要特殊处理,但 [CSS3PAGE] 并未定义如何选择每章首页(区别于文档首页)。

page 属性应用于同时拥有强制分页属性的元素时,会创建一个 页面组页面组 是由该元素的所有实例生成的页面集合。每渲染一个新实例,就会开始新的 页面组

一个页面可以属于多个页面组,因为某个 页面组 可能有祖先或后代属于另一个 页面组

CSS:
div { 
  page: A;
  break-before: page;
}
child { 
  page: B;
  break-before: page;
}
一个页面可以属于多个页面组。
注意,第 5 页可通过三种方式选择:
@page :nth(5 of A) /* 选择每个 <div> 的第 5 页 */
@page :nth(1 of B) /* 选择每个 <child> 的第 1 页 */
@page :nth(5)   /* 选择文档的第 5 页 */

考虑如下 HTML:

<div class="chapter">
<h1>Chapter One</h1>
<p>some text</p>
<table class="broadside">
...
</table>
...
</div>
<div class="chapter">
<h1>Chapter Two</h1>
<p>some text</p>
...
<table class="broadside">
...
</table>
...
</div>

以及 CSS:

div.chapter {
  page: body;
  break-before: page;
}

table.broadside {
  page: broadside;
  break-before: page;
}

在此情况下,每个章节将形成独立的页面组。@page:nth(3 of body) 将选择每章的第 3 页,即使该页实际使用的是 “broadside” 命名页。@page:nth(1) 只会选择文档的第 1 页,@page:first 也是如此。

4. 引导符(已迁移)

现在已在 [CSS3-CONTENT] 中描述

5. 交叉引用(已迁移)

现在已在 [CSS3-CONTENT] 中描述

6. 书签(已迁移)

现在已在 [CSS3-CONTENT] 中描述

附录 A:它们现在在哪?

许多曾出现在 2011 年 11 月 29 日工作草案 的章节已被移至其他规范。以下是各部分的迁移说明。

印刷标记与出血区

本节已移至 CSS 分页媒体模块第 3 级

CMYK 颜色

本节已移至 CSS 颜色模块第 5 级

空白页样式

本节已移至 CSS 分页媒体模块第 3 级

分页展示

本节已移至 CSS 溢出模块第 4 级

相关内容见 WHATWG CSS 书籍

页面浮动

本节已移至 CSS 页面浮动

选择列和页面

关于选择列的简要说明见 WHATWG CSS 书籍

附录 B:默认 UA 样式表

本附录为说明性内容,旨在帮助 UA 开发者实现 HTML 的默认样式表,但 UA 开发者可根据需要自由忽略或修改。

@page {
  counter-reset: footnote;
  @footnote {
    counter-increment: footnote;
    float: bottom;
    column-span: all;
    height: auto;
  }
}

::footnote-marker {
  content: counter(footnote);
  list-style-position: inside;
}

::footnote-marker::after {
  content: '. ';
}

::footnote-call {
  content: counter(footnote);
  vertical-align: super;
  font-size: 65%;
}

@supports ( font-variant-position: super ) {
  ::footnote-call {
    content: counter(footnote);
    vertical-align: baseline;
    font-size: 100%;
    line-height: inherit;
    font-variant-position: super;
  }
}

h1 { bookmark-level: 1 }
h2 { bookmark-level: 2 }
h3 { bookmark-level: 3 }
h4 { bookmark-level: 4 }
h5 { bookmark-level: 5 }
h6 { bookmark-level: 6 }

附录 C:变更记录

2014 年 5 月 13 日工作草案 后的变更:

2013 年 9 月 24 日编辑草案 后的变更:

2011 年 11 月 29 日工作草案 后的变更:

WHATWG CSS 书籍 规范的区别:

隐私注意事项

目前本规范未报告新的隐私注意事项。

安全注意事项

目前本规范未报告新的安全注意事项。

致谢

本工作离不开 Håkon Wium Lie 的巨大贡献。

Chris Lilley、Elika J. Etemad、Alan Stearns、L. David Baron、Bert Bos、Florian Rivoal、[$your_name, ", " ]+ 和 Liam Quin 提供了宝贵的反馈意见。

一致性

文档约定

一致性要求通过描述性断言和 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" 区分,例如: UA 必须(MUST)提供可访问的替代方案。

一致性类别

本规范的一致性定义分为三类:

style sheet
一个 CSS 样式表
renderer
一个 UA,用于解释样式表语义并渲染使用该样式表的文档。
authoring tool
一个 UA,用于编写样式表。

如果样式表中使用本模块定义的语法的所有语句,均符合通用 CSS 语法及本模块每项功能的单独语法,则该样式表符合本规范。

如果渲染器除按相应规范解释样式表外,还能正确解析本规范定义的全部功能并据此渲染文档,则该渲染器符合本规范。但如果 UA 因设备限制无法正确渲染文档,并不视为不符合规范。(例如,UA 不要求在黑白显示器上呈现颜色。)

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

部分实现

为了让作者能够利用前向兼容解析规则指定回退值,CSS 渲染器必须将所有不支持的 at-规则、属性、属性值、关键字及其它语法结构视为无效,并适当忽略。特别是,用户代理不得只忽略不支持的组件值而保留同一多值属性声明中的支持值:如果任何值被视为无效(不支持的值必须如此),则整个声明都必须被 CSS 忽略。

不稳定与专有特性的实现

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

非实验性实现

当规范进入候选推荐阶段(CR)后,可以进行非实验性实现,且实现者应在能够证明正确实现 CR 级别特性的前提下,发布无前缀实现。

为建立和维护 CSS 在各实现间的互操作性,CSS 工作组要求非实验性 CSS 渲染器在发布无前缀实现前,向 W3C 提交实现报告(如有必要还需提交用于该报告的测试用例)。提交给 W3C 的测试用例将由 CSS 工作组审核和修正。

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

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS 定位布局模块第 3 级。2023 年 4 月 3 日。工作草案。URL: https://www.w3.org/TR/css-position-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块第 3 级。2022 年 12 月 1 日。候选推荐。URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块第 4 级。2023 年 12 月 18 日。工作草案。URL: https://www.w3.org/TR/css-values-4/
[CSS-VALUES-5]
CSS 值与单位模块第 5 级。编辑草稿。URL: https://drafts.csswg.org/css-values-5/
[CSS21]
Bert Bos 等. 层叠样式表第 2 级修订 1 版(CSS 2.1)规范。2011 年 6 月 7 日。正式推荐。URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. 层叠样式表第 2 级修订 2 版(CSS 2.2)规范。2016 年 4 月 12 日。工作草案。URL: https://www.w3.org/TR/CSS22/
[CSS3-CONTENT]
Elika Etemad; Dave Cramer. CSS 生成内容模块第 3 级。2019 年 8 月 2 日。工作草案。URL: https://www.w3.org/TR/css-content-3/
[CSS3LIST]
Elika Etemad; Tab Atkins Jr.. CSS 列表与计数器模块第 3 级。2020 年 11 月 17 日。工作草案。URL: https://www.w3.org/TR/css-lists-3/
[CSS3PAGE]
Elika Etemad. CSS 分页媒体模块第 3 级。2023 年 9 月 14 日。工作草案。URL: https://www.w3.org/TR/css-page-3/
[CSS3SYN]
Tab Atkins Jr.; Simon Sapin. CSS 语法模块第 3 级。2021 年 12 月 24 日。候选推荐。URL: https://www.w3.org/TR/css-syntax-3/
[RFC2119]
S. Bradner. RFC 中用于指示需求级别的关键词。1997 年 3 月。最佳当前实践。URL: https://datatracker.ietf.org/doc/html/rfc2119

参考性引用

[DPUB-LATINREQ]
Dave Cramer. 拉丁文本排版与分页需求。FPWD。URL: https://www.w3.org/TR/dpub-latinreq/

属性索引

名称 初始值 适用对象 继承 %ages 动画类型 规范顺序 计算值
footnote-display block | inline | compact block elements no N/A discrete per grammar specified value
footnote-policy auto | line | block auto elements no N/A discrete per grammar specified value
running <custom-ident> none elements no N/A discrete per grammar specified value
string-set [ <custom-ident> <content-list> ]# | none none all elements, but not pseudo-elements no N/A discrete per grammar specified value

问题索引

我们如何定义该函数的默认值?

如果我们也能复制(而不仅仅是移动)元素,这个想法会更有用。这可以避免上例中的 HTML 重复。

Bert Bos 提出了另一种语法,允许元素既可移动也可复制到活页眉中。如下例所示,h2 元素既出现在文档正常位置,也会被复制到活页眉。

h2 {
display: block;
running: chapter;
font-size: 18pt;
font-weight: bold;
}

h2:running {
display: inline;
font-size: 11pt;
font-weight: normal;
font-variant: small-caps;
letter-spacing: 1pt;
}

@page {
  @top-center {
    content: element(chapter);
    }
  }
Name: running
Value: <custom-ident>
Initial: none
Applies to: elements
Inherited: no
Percentages: N/A
Computed value: specified value
Canonical order: per grammar
Animation type: discrete

用户代理应在所有媒体上支持该属性,包括非可视媒体。

为什么脚注区域要用 float:bottom?将脚注浮动到脚注区域、再将脚注区域自身浮动,似乎过于复杂,因为实现上并不允许脚注区域浮动到其他地方。注意有些实现允许脚注区域绝对定位。
在 CSS3-Page 语法中如何描述这一点?
脚注在多栏文本中如何工作?Prince 使用 float: prince-column-footnote 可在栏底生成脚注而不是页面底部。
支持脚注的实现一般也支持 float: bottom 等页面浮动。页面浮动内容应出现在脚注区域之上,这应如何规范?
我们需要一个脚注排版算法
现在已在 [CSS3-CONTENT] 描述
现在已在 [CSS3-CONTENT] 描述
现在已在 [CSS3-CONTENT] 描述