CSS 计数器样式 第3级

W3C 候选推荐快照,

此版本:
https://www.w3.org/TR/2021/CR-css-counter-styles-3-20210727/
最新发布版本:
https://www.w3.org/TR/css-counter-styles-3/
编辑草案:
https://drafts.csswg.org/css-counter-styles/
以前版本:
实现报告:
https://test.csswg.org/harness/results/css-counter-styles-3_dev/grouped/
测试套件:
http://test.csswg.org/suites/css-counter-styles-3_dev/nightly-unstable
问题追踪:
CSSWG 问题库
编辑:
Tab Atkins Jr. (Google)
建议编辑此规范:
GitHub 编辑器

摘要

此模块介绍了@counter-style规则,该规则允许作者为CSS列表标记和生成内容计数器定义自定义计数器样式[CSS-LISTS-3]。它还预定义了一组常见的计数器样式,包括CSS2和CSS2.1中存在的样式。

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

此文档的状态

本节描述了本文档在发布时的状态。 其他文档可能会取代本文档。 可在https://www.w3.org/TR/上找到W3C当前出版物的列表和本技术报告的最新版本。

本文档由CSS 工作组发布为候选推荐快照。 发布为候选推荐并不意味着W3C成员的认可。 候选推荐快照已获得广泛审查,旨在收集实施经验。 本文档旨在成为W3C推荐标准; 它将至少在2021年10月27日之前保持候选推荐状态,以收集更多反馈。

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

本文档受2020年9月15日W3C流程文件管理。

本文档由根据W3C专利政策运作的工作组产生。 W3C维护了与工作组交付物相关的公开的专利披露列表; 该页面还包括披露专利的说明。 个人如果知晓其认为包含必要专利权项的专利, 必须根据W3C专利政策第6节披露该信息。

以下功能有风险,可能在CR期间被删除:

“有风险”是W3C流程的术语,并不一定意味着该功能有被删除或延迟的危险。这意味着工作组认为该功能在及时实现中可能存在困难,标记为有风险可允许工作组在必要时在转入提议推荐阶段时删除该功能,而无需先发布一个没有该功能的候选推荐。

1. 简介

CSS 1 定义了基于HTML传统上允许在有序和无序列表上使用的一些有用的计数器样式。 虽然在CSS2.1中稍微扩展了一些, 但它并没有解决全球排版的需求。

本模块引入了@counter-style规则,它允许CSS以开放的方式解决这一问题, 通过允许作者定义自己的计数器样式。 这些样式可以在list-style-type属性中使用, 或在counter()counters() 函数中使用。 它还定义了一些额外的预定义计数器样式, 尤其是那些常见但用@counter-style难以表示的复杂样式。

2. 计数器样式

计数器样式定义了如何将计数器值转换为字符串。 计数器样式包括:

当请求使用特定的计数器样式为特定的计数器值生成计数器表示时, 请按以下步骤操作:

  1. 如果计数器样式未知, 退出此算法,改为使用生成计数器表示并使用decimal样式和相同的计数器值。
  2. 如果计数器值超出了计数器样式的范围, 退出此算法,改为使用计数器样式的回退样式为相同的计数器值生成计数器表示
  3. 使用计数器值和计数器样式的计数算法, 生成计数器值的初始表示。 如果计数器值为负 且计数器样式使用负号, 则改为使用计数器值的绝对值生成初始表示。
  4. 按照pad描述符的要求,将符号添加到表示中。
  5. 如果计数器值为负, 且计数器样式使用负号, 按照计数器样式的negative描述符的要求将表示包裹在负号中。
  6. 返回表示。

注意:前缀后缀不在此算法中发挥作用。 这是有意为之; 前缀和后缀不是counter()或counters()函数返回的字符串的一部分。 相反,前缀和后缀是通过构造content属性的算法添加的, 用于::marker伪元素。 这也意味着即使实际表示是由回退样式构造的,前缀和后缀仍然来自指定的计数器样式。

某些system值(如symbolicadditive) 和某些描述符(如pad) 可以生成大小与作者提供的数字成线性关系的表示。 这可能会被滥用来生成过大的表示, 消耗用户的不必要内存,甚至导致浏览器卡死。 用户代理必须支持至少60个Unicode代码点长的表示, 但它们可以选择在表示超过60个代码点长时使用回退样式。

3. 定义自定义计数器样式: @counter-style 规则

@counter-style规则允许作者定义自定义计数器样式计数器样式的组成由@counter-style规则中的描述符指定。 算法由systemsymbolsadditive-symbols属性隐式指定。

@counter-style规则的一般形式为:

@counter-style <counter-style-name> { <declaration-list> }

<counter-style-name> 是一个<custom-ident>,它不是与ASCII不区分大小写匹配的none<counter-style-name>树范围名称

关键字decimaldiscsquarecircledisclosure-opendisclosure-closed是有效的<counter-style-name>, 但在这里用作计数器样式名称时无效; 这样做会使规则无效。 (它们可以在其他上下文中使用,例如在extend系统中。)

注意:请注意<custom-ident>还自动排除了CSS全局关键词。 此外,一些名称,例如inside, 作为计数器样式名称是有效的, 但与像list-style这样的属性的现有值冲突, 因此在该上下文中不可用。

计数器样式名称区分大小写。 但是,本规范中定义的名称在解析时始终转换为ASCII小写, 无论它们用作计数器样式的任何地方,例如在list-style属性集、 在@counter-style规则中, 以及在counter()函数中。

每个@counter-style规则为每个计数器样式描述符指定了一个值, 无论是隐式还是显式。 本规则中未显式给出的那些值将使用本规范中列出的初始值。 这些描述符仅在定义它们的@counter-style规则的上下文中适用, 不适用于文档语言元素。 没有描述符适用于哪些元素或这些值是否由子元素继承的概念。 当在给定的@counter-style规则中多次出现给定描述符时, 只使用最后指定的有效值; 所有先前的该描述符的值必须被忽略。

定义一个@counter-style规则会使其在包含它的整个文档中可用。 如果定义了多个具有相同名称的@counter-style规则, 只有一个会生效, 根据标准级联规则。@counter-style规则"原子"级联: 如果一个规则取代了另一个同名规则, 它会完全取代, 而不仅仅是取代它所指定的特定描述符。

注意:请注意,即使是预定义的计数器样式也可以被覆盖; 用户代理样式表出现在任何其他样式表之前, 因此预定义的样式总是在级联中失效。

该规则符合CSS的前向兼容解析要求; 不理解这些规则的合格解析器将忽略它们,而不会出错。 任何未被识别或实现的描述符, 或其值与此处或本规范未来版本中给出的语法不匹配的描述符, 必须完全被忽略; 它们不会使@counter-style规则无效。

3.1. 计数器算法: system 描述符

名称: system
适用对象: @counter-style
取值: cyclic | numeric | alphabetic | symbolic | additive | [fixed <integer>?] | [ extends <counter-style-name> ]
初始值: symbolic

system描述符指定将使用哪种算法基于计数器值构建计数器的表示。例如,cyclic 计数器样式只是重复其符号, 而numeric计数器样式将其符号解释为数字, 并相应地构建其表示。 系统的定义在以下小节中。

每个system值与symbolsadditive-symbols描述符相关联, 并且具有相应描述符必须具有的最小长度; 下面的每个条目定义了这些要求。 如果@counter-style规则未满足此要求, 它不定义计数器样式。 (该规则在语法上仍然有效,但无效。)

3.1.1. 循环符号: cyclic 系统

cyclic计数器系统通过其提供的符号循环, 当它达到列表末尾时回到开头。 它可以用于简单的项目符号 (只需提供一个计数器符号), 或用于循环多个符号。 第一个计数器符号用于值1的表示, 第二个计数器符号(如果存在)用于值2的表示,依此类推。

如果系统是cyclic, 则symbols描述符必须至少包含一个计数器符号。 该系统定义适用于所有计数器值。

一个“三角形项目符号”计数器样式可以定义为:
@counter-style triangle {
  system: cyclic;
  symbols: ‣;
  suffix: " ";
}

它将生成如下的列表:

‣  One
‣  Two
‣  Three

如果有N计数器符号并且正在为整数value构建表示, 则表示为列表中索引( (value-1) mod N) 的计数器符号(从0开始索引)。

3.1.2. 耗尽符号: fixed 系统

fixed计数器系统一次性运行其计数器符号列表, 然后回退。 它对于表示只有有限数量表示的计数器样式非常有用。 例如,Unicode定义了一些用于列表的有限长度特殊字符系列, 例如带圈数字。

如果系统是fixed, 则symbols描述符必须包含至少一个计数器符号。 该系统仅在有限范围内定义计数器值, 从第一个符号值开始,长度等于 计数器符号列表的长度。

当指定该系统时, 可以选择在其后提供一个整数, 该整数设置第一个符号值。 如果省略,则第一个符号值为1。

一个“方角”计数器样式可以定义为:
@counter-style box-corner {
  system: fixed;
  symbols: ◰ ◳ ◲ ◱;
  suffix: ': ';
}

它将生成如下的列表:

◰:  One
◳:  Two
◲:  Three
◱:  Four
5:  Five
6:  Six

第一个计数器符号第一个符号值的表示, 随后的计数器值由后续的计数器符号表示。 一旦计数器符号列表被耗尽, 该计数器样式将无法再表示进一步的值, 必须改用回退计数器样式进行表示。

3.1.3. 重复符号: symbolic 系统

symbolic计数器系统通过其提供的符号重复循环, 每次通过列表时符号加倍、三倍等。 例如,如果原始符号是"*"和"†", 那么第二次通过时它们将变为"**"和"††", 第三次通过时将变为"***"和"†††"等。 它可以用于脚注样式的标记, 有时也用于字母样式列表,呈现略有不同于alphabetic系统的效果。

如果系统是symbolic, 则symbols描述符必须至少包含一个计数器符号。 该系统仅在严格正的计数器值范围内定义。

一个“脚注”计数器样式可以定义为:
@counter-style footnote {
  system: symbolic;
  symbols: '*' ⁑ † ‡;
  suffix: " ";
}

它将生成如下的列表:

*   One
⁑   Two
†   Three
‡   Four
**  Five
⁑⁑  Six
某些风格指南要求的列表编号类似于upper-alpha, 但在前26个值之后重复方式不同, 而是变为"AA"、"BB"、"CC"等。 这可以通过symbolic系统实现:
@counter-style upper-alpha-legal {
  system: symbolic;
  symbols: A B C D E F G H I J K L M
           N O P Q R S T U V W X Y Z;
}

这种样式在前27个值与upper-alpha是相同的, 但在此之后开始不同,upper-alpha变为"AB"、"AC"、"AD"等。 从第53个值开始,upper-alpha变为"BA"、"BB"、"BC"等, 而这种样式跳入三位数,变为"AAA"、"BBB"、"CCC"等。

要构建表示,执行以下算法:

N计数器符号列表的长度,value初始为计数器值, S初始为空字符串, symbol(n)为第n个计数器符号(从0开始索引)在 计数器符号列表中的符号。

  1. 选择chosen symbolsymbol( (value - 1) mod N)
  2. 表示长度ceil( value / N )
  3. chosen symbol追加到S,追加次数等于表示长度

最后,返回S

3.1.4. 双射数字系统: alphabetic 系统

alphabetic计数器系统将计数器符号列表解释为数字, 形成字母表编号系统, 类似于默认的lower-alpha计数器样式, 其从"a"、"b"、"c"到"aa"、"ab"、"ac"。 字母表编号系统不包含表示0的数字; 因此,当添加新数字时,首个值仅由首个数字组成。 字母表编号系统通常用于列表, 也出现在许多电子表格程序中用于编号列。 列表中的第一个计数器符号解释为数字1, 第二个解释为数字2,依此类推。

如果系统是alphabetic, 则symbols描述符必须至少包含两个计数器符号。 该系统仅在严格正的计数器值范围内定义。

一个使用围棋棋子的计数器样式可以定义为:
@counter-style go {
  system: alphabetic;
  symbols: url(white.svg) url(black.svg);
  suffix: " ";
}

它将生成如下的列表:

One
Two
Three
Four
Five
Six
Seven

注意:此示例需要支持SVG图像才能正确显示。

如果有N计数器符号, 则表示为以计数器符号为数字的基N字母数字。 要构建表示,请运行以下算法:

N计数器符号列表的长度,value初始为计数器值, S初始为空字符串, symbol(n)为第n个计数器符号计数器符号列表中的符号。

value不等于0时:

  1. value设为value - 1
  2. symbol( value mod N )前置到S
  3. value设为floor( value / N )

最后,返回S

3.1.5. 位值数字系统: numeric 系统

numeric计数器系统将计数器符号列表解释为“位值”编号系统, 类似于默认的decimal计数器样式。 列表中的第一个计数器符号解释为数字0, 第二个解释为数字1, 依此类推。

如果系统是numeric, 则symbols描述符必须至少包含两个计数器符号。 该系统定义在所有计数器值范围内。

一个“三进制”计数器样式可以定义为:
@counter-style trinary {
  system: numeric;
  symbols: '0' '1' '2';
}

它将生成如下的列表:

1.   One
2.   Two
10.  Three
11.  Four
12.  Five
20.  Six

如果有N计数器符号, 则表示为以计数器符号为数字的基N数字。 要构建表示,请运行以下算法:

N计数器符号列表的长度,value初始为计数器值, S初始为空字符串, symbol(n)为第n个计数器符号计数器符号列表中的符号(从0开始索引)。

  1. 如果value为0,追加symbol(0)S并返回S
  2. value不等于0时:
    1. symbol( value mod N )前置到S
    2. value设为floor( value / N )
  3. 返回S

3.1.6. 累加数字系统: additive 系统

additive计数器系统用于表示“符号值”编号系统, 而不是通过改变其位置来重复使用数字以更改其值, 而是定义具有更大值的额外数字, 这样可以通过将所有数字加在一起来获得该数字的值。 这种系统用于罗马数字 和世界各地的其他编号系统。

如果系统是additive, 则additive-symbols描述符必须包含至少一个累加元组。 该系统名义上定义了所有计数器值的表示 (参见下文中的算法了解具体细节)。

一个“骰子”计数器样式可以定义为:
@counter-style dice {
  system: additive;
  additive-symbols: 6 ⚅, 5 ⚄, 4 ⚃, 3 ⚂, 2 ⚁, 1 ⚀;
  suffix: " ";
}

它将生成如下的列表:

  ⚀  One
  ⚁  Two
  ⚂  Three
...
 ⚅⚄  Eleven
 ⚅⚅  Twelve
⚅⚅⚀  Thirteen
要构建表示:
  1. value初始为计数器值,S初始为空字符串, symbol list初始为累加元组的列表。

  2. 如果value为0:

    1. 如果symbol list包含一个权重为零的元组, 将该元组的计数器符号追加到S并返回 S

    2. 否则,无法使用此计数器样式表示给定的计数器值, 必须使用备用计数器样式进行表示。

  3. 对于symbol list中的每个tuple

    1. symbolweight分别为tuple计数器符号和权重。

    2. 如果weight为0,或weight大于value继续

    3. repsfloor( value / weight )

    4. symbol追加到Sreps次。

    5. 通过weight * reps减少value

    6. 如果value为0,返回S

  4. 断言:value仍然非零。

    无法使用此计数器样式表示给定的计数器值, 必须使用备用计数器样式进行表示。

注意:本规范中的所有预定义累加@counter-style规则 都能为其范围内的每个值生成表示, 但可以生成一些additive-symbols值,它们在上述算法中无法找到表示, 即使理论上可以找到表示。 例如,如果定义了一个@counter-style, 使用additive-symbols: 3 "a", 2 "b";, 上述算法将无法为计数器值4找到表示, 尽管理论上可以用“bb”表示。 虽然这令人遗憾,但这是为了保持算法在相对于计数器值大小的线性时间内运行所必需的。

3.1.7. 构建自现有计数器样式: extends 系统

extends系统允许作者使用另一个计数器样式的算法, 但可以改变其他方面, 例如负号或后缀。 如果计数器样式使用extends系统, 任何未指定的描述符必须从指定的扩展计数器样式中获取, 而不是采用其初始值。

如果@counter-style使用了extends系统, 则不能包含symbolsadditive-symbols描述符, 否则@counter-style规则将无效。

如果指定的<counter-style-name>ASCII 不区分大小写的匹配, 例如disccirclesquaredisclosure-open,或disclosure-closed(任何预定义的符号计数器样式), 使用extend扩展自“标准”定义的规则, 提供规范样式表中的内容 (而不是允许它们以不同的用户代理特定方式绘制的例外情况)。

如果指定的计数器样式名称不是任何已定义的计数器样式名称, 则必须将其视为扩展decimal计数器样式。 如果一个或多个@counter-style规则的extends值形成循环, 则所有参与循环的计数器样式 必须被视为扩展了decimal计数器样式。

例如,如果您希望计数器样式与decimal相同, 但使用括号而不是句号作为后缀,如:
1) first item
2) second item
3) third item

与其编写一个全新的计数器样式, 这可以通过扩展decimal来实现:

@counter-style decimal-paren {
  system: extends decimal;
  suffix: ") ";
}

3.2. 格式化负值: negative 描述符

名称: negative
用于: @counter-style
值: <symbol> <symbol>?
初始值: "\2D" ("-" hyphen-minus)

negative描述符定义当计数器值为负时如何改变表示形式。

值中的第一个<symbol>会在计数器值为负时添加在表示的前面。第二个<symbol>,如果指定的话,会在计数器值为负时附加在表示的后面。

例如, 指定negative: "(" ")";将使负值被括在括号内, 这有时会在金融场景中使用,如“(2) (1) 0 1 2 3...”。

并非所有system值都使用负号。 特别是,如果计数器样式的system值为symbolicalphabeticnumericadditive,或者扩展的计数器样式也 extends使用负号, 则计数器样式会使用负号。如果计数器样式不使用负号, 在生成计数器表示时会忽略负号。

3.3. 符号在标记前: prefix 描述符

名称: prefix
用于: @counter-style
值: <symbol>
初始值: "" (空字符串)

prefix描述符指定一个<symbol>, 该符号将被添加到标记表示的前面。 前缀位于任何负号之前。

注意: 前缀仅由用于构造 ::marker伪元素默认内容的算法添加; 当使用counter()counters()函数时,前缀不会被自动添加。

3.4. 符号在标记后: suffix 描述符

名称: suffix
用于: @counter-style
值: <symbol>
初始值: "\2E\20" ("." 句号加空格)

后缀 描述符指定一个 <符号>,它会附加到标记表示之后。 后缀会在负号之后添加到表示中。

注意: 后缀只会通过构造默认 ::marker 伪元素内容的算法添加;当使用 counter() 或 counters() 函数时,后缀不会自动添加。

3.5. 限制计数器范围: range 描述符

名称: range
用于: @counter-style
值: [ [ <integer> | infinite ]{2} ]# | auto
初始值: auto

range描述符定义了计数器样式定义的范围。 如果计数器样式用于表示超出其范围的计数器值, 则计数器样式将退回到其后备计数器样式。

auto
范围取决于计数器系统:
[ [ <integer> | infinite ]{2} ]#
这定义了一个逗号分隔的范围列表。 对于每个单独的范围, 第一个值是下限 第二个值是上限。 该范围是包含型的 - 它包含上下限值。 如果infinite用作范围中的第一个值, 则表示负无穷; 如果用作第二个值, 则表示正无穷。 计数器样式的范围是列表中定义的所有范围的并集。

如果任何范围的下限高于上限, 整个描述符无效,必须被忽略。

实现必须支持下限至少为-215且上限至少为215-1的范围 (有符号2字节整数的范围)。 它们可以支持更高的范围。 如果任何指定的边界超出了实现支持的范围, 必须将其视为实现支持的最接近的边界。

3.6. 零填充和固定宽度表示: pad 描述符

名称: pad
用于: @counter-style
值: <integer [0,∞]> && <symbol>
初始值: 0 ""

pad 描述符允许作者指定“固定宽度”计数器样式, 其中表示的长度如果比 pad 值短,则用特定的 <symbol>进行填充。 超过指定 pad 值的表示将按正常方式构造。

<integer [0,∞]> && <symbol>
<integer> 指定所有计数器表示必须达到的最小长度。

difference 为提供的 <integer> 减去 字素集群 的数量 在 计数器值的初始表示中(注意,根据 生成计数器表示 的算法, 这发生在添加前缀/后缀/负号之前。) 如果计数器值为负数并且计数器样式使用负号, 则进一步减少 difference 的数量,由计数器样式的 negative 描述符的 <symbol> 进行补充。

如果 difference 大于零, 则在表示前面加上 difference 份指定的 <symbol>

不允许负值的 <integer>

最常见的“固定宽度”编号示例是零填充的十进制编号。 如果作者知道使用的数字将小于一千, 则可以通过简单的 pad: 3 "0"; 描述符进行零填充, 确保所有表示都为3位数。

例如, 1 将表示为 "001", 20 将表示为 "020", 300 将表示为 "300", 4000 将表示为 "4000", 而 -5 将表示为 "-05"。

注意: pad 描述符计算表示中的 字素集群 的数量, 但用 <symbol> 进行填充。 如果指定的 pad <symbol> 是多字符的, 这可能不会产生预期的效果。 遗憾的是,没有办法使用 字素集群 的数量在 pad <symbol>中, 而不违反有用的约束。 建议作者仅在 <symbol> 中指定单个 字素集群pad 描述符中。

3.7. 定义回退: fallback 描述符

名称: fallback
用于: @counter-style
值: <counter-style-name>
初始值: decimal

fallback 描述符指定了一个备用计数器样式, 当当前计数器样式无法为给定的计数器值创建表示时使用。 例如,如果定义的计数器样式范围为1-10, 但请求表示计数器值为11, 则该计数器值的表示会使用备用计数器样式构建(如果备用样式也无法表示该值, 则可能继续使用下一个备用样式,依此类推)。

如果 fallback 描述符的值不是任何已定义计数器样式的名称, 则 fallback 描述符的使用值将变为 decimal。 同样,当查找可以呈现给定计数器值的计数器样式时,如果检测到指定的回退存在循环, 必须改用 decimal 样式。

注意,指定回退循环不一定是错误的。 例如,如果作者希望使用在偶数和奇数计数器值之间有显著不同表示的计数器样式, 他们可能会发现定义一个只能表示奇数值的样式和一个只能表示偶数值的样式是最简单的, 并且将每一个指定为对方的回退样式。 尽管回退图是循环的,但在执行这些回退时不会遇到循环——每个计数器值都可以由其中一个计数器样式表示。

3.8. 标记字符: symbolsadditive-symbols 描述符

名称: symbols
用于: @counter-style
值: <symbol>+
初始值: n/a
名称: additive-symbols
用于: @counter-style
值: [ <integer [0,∞]> && <symbol> ]#
初始值: n/a
<symbol> = <string> | <image> | <custom-ident>

符号加法符号 描述符指定由 系统 描述符指定的标记构造算法所使用的符号。 当计数系统为 循环数字字母符号固定 时,@counter-style 规则必须有一个有效的 符号 描述符, 当计数系统为 加法 时,必须有一个有效的 加法符号 描述符; 否则,该 @counter-style 不定义 计数样式(但仍然是有效的 at-rule)。

某些计数器系统指定 symbols 描述符必须至少包含两个条目。 如果计数器样式的系统如此, 且 symbols 描述符 仅有一个条目, 则 @counter-style 规则不定义 计数器样式

symbols 描述符值中的每个条目定义了一个 计数器符号, 根据计数器样式的系统不同,该符号的解释方式也有所不同。 additive-symbols 描述符值中的每个条目定义了 一个 累加元组, 该元组包含一个 计数器符号 和一个整数权重。 每个权重必须是非负整数, 并且 累加元组 必须按权重严格递减的顺序指定; 否则,该声明无效并且必须被忽略。

计数器符号 可以是 字符串、图像或标识符, 并且这三种类型可以在单个描述符中混合使用。 计数器表示通过将计数器符号连接在一起构建。 标识符作为包含相同字符的字符串呈现。 图像以内联替换元素的形式呈现。 图像 计数器符号默认对象大小 为 1em x 1em 的正方形。

注意: <image> 语法在 <symbol> 中目前处于风险中。 目前没有实现计划, 并且它使 counter() 的某些用法复杂化, 这些问题尚未得到完全解决。

注意: 如果使用标识符而不是字符串来定义符号, 请注意标识符的语法。 特别是,像 "*" 这样的 ascii 非字母不是标识符, 因此必须在字符串中加引号。 十六进制转义符 在本规范中定义的多个计数器样式中使用, "吞并" 后续的空格 (允许十六进制转义符后紧跟一个数字而不会产生歧义), 因此必须在十六进制转义符后放置两个空格 以将其与后续的转义符分隔开, 否则它们将被视为相邻, 并且属于同一个标识符。 例如,symbols: \660 \661; 仅定义了一个符号, 由 U+0660 和 U+0661 字符组成, 而不是预期的两个; 要么将转义符放入字符串中, 如 symbols: "\660" "\661", 要么在转义符之间放两个空格。

3.9. 语音合成: speak-as 描述符

名称: speak-as
用于: @counter-style
值: auto | bullets | numbers | words | spell-out | <counter-style-name>
初始值: auto

有时可以通过视觉轻松理解计数器样式,但通过语音合成器或其他非视觉方式难以准确表示,或者在简单朗读时毫无意义。 speak-as 描述符定义了如何合成带有特定计数器样式的计数器的语音形式。 辅助技术应使用此语音形式来读取计数器样式,并且可以使用 speak-as 的值 指导向其他输出形式(如文本)的转换。 其值的含义如下:

auto
如果计数器样式的 systemalphabetic, 则此值的效果与 spell-out 相同。 如果 systemcyclic, 此值的效果与 bullets 相同。 如果 systemextends, 此值的效果与所扩展样式的 auto 的效果相同。 否则,此值的效果与 numbers 相同。
bullets
UA 会发出由 UA 定义的短语或音频提示,代表读取无序列表项。
numbers
计数器的数值将以 内容语言 读作数字。
words
正常生成计数器表示, 然后用 内容语言 朗读它。 如果计数器表示中包含图像, 则按 numbers 的处理方式处理该值。
spell-out
正常生成计数器表示, 然后按字母顺序逐字朗读它,使用 内容语言。 如果 UA 不知道如何发音这些符号 (或者计数器表示中包含图像), 则必须按 numbers 的方式处理该值。

例如,lower-greek 在英语中将被读作 "alpha", "beta", "gamma" 等。 相反,upper-latin 在法语中将被读作(音标)/a/, /be/, /se/ 等。

<counter-style-name>
计数器的值将按指定的样式发音 (类似于 fallback 描述符 在生成计数器值的表示时的行为)。 如果指定的样式不存在, 则此值将按 auto 处理。 如果在遵循 speak-as 引用时检测到循环, 则此值将按参与循环的计数器样式的 auto 处理。
将发音推迟到另一个计数器样式有助于当使用的符号实际上不是字母时的情况。 例如,以下是可能定义的 circled-lower-latin 计数器样式, 使用了一些特殊的 Unicode 字符:
@counter-style circled-lower-latin {
  system: alphabetic;
  speak-as: lower-latin;
  symbols: ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ;
  suffix: " ";
}

将其 system 设置为 alphabetic 通常会让 UA 尝试 读取字符的名称, 但在这种情况下,可能是 "Circled Letter A", 这可能不合适。 相反,明确将 speak-as 设置为 lower-latin 可确保它们按其对应的拉丁字母读取,这符合预期。

4. 定义匿名计数器样式: symbols() 函数

symbols() 函数允许在属性值中内联定义计数器样式, 当某种样式在样式表中只使用一次时,定义完整的 @counter-style 规则可能显得过于繁琐。 它并没有提供 @counter-style 规则的全部功能, 但提供了足够的子集来满足实际需求。 symbols() 规则的语法如下:

symbols() = symbols( <symbols-type>? [ <string> | <image> ]+ )
<symbols-type> = cyclic | numeric | alphabetic | symbolic | fixed

symbols() 函数定义了一个匿名计数器样式, 没有名称, 前缀为 "" (空字符串), 后缀为 " " (U+0020 空格), 范围为 auto, 回退为 decimal, 负数表示为 "-" (连字符-减号), 补全为 0 "", 语音合成为 auto。 计数器样式的算法将根据上一章的内容,使用提供的 system 构建, 或者如果省略了 system,则使用 symbolic, 并将提供的 <string><image> 作为 symbols 属性的值。 如果 system 是 fixed,则 第一个符号值1

如果 system 是 alphabeticnumeric, 则必须至少有两个 <string><image>, 否则该函数无效。

以下代码:
ol { list-style: symbols("*" "\2020" "\2021" "\A7"); }

将生成如下列表:

*   One
†   Two
‡   Three
§   Four
**  Five
††  Six
‡‡  Seven

另一方面,指定计数器系统,如下所示:

ol { list-style: symbols(cyclic "*" "\2020" "\2021" "\A7"); }

将生成如下列表:

*   One
†   Two
‡   Three
§   Four
*   Five
†   Six
‡   Seven

注意: symbols() 函数仅允许使用字符串和图像, 而 symbols 描述符在 @counter-style 规则中还允许使用标识符。

5. 扩展 list-style-typecounter()counters()

在 CSS Level 2 中,[CSS21] 中的 list-style-type 属性和 counter() 以及 counters() 记法 接受各种预定义的关键字,每个关键字表示一种计数器样式。 本模块扩展了这些功能,使其可以接受 <counter-style> 类型,定义如下:

<counter-style> = <counter-style-name> | <symbols()>

如果使用的 <counter-style-name> 没有指向任何现有的计数器样式, 它必须与 decimal 计数器样式行为一致 (但不会计算decimal)。

当在这些上下文中使用时,<counter-style-name> 是一个树范围引用

6. 简单的预定义计数器样式

以下样式表使用 @counter-style 规则 重新定义了 CSS 2 和 CSS 2.1 中定义的所有计数器样式。 该样式表是规范性的—UA 必须将其包含在其 UA 样式表中 (或至少表现得像这些规则是在该层级中定义的)。

6.1. 数字: decimal, decimal-leading-zero, arabic-indic, armenian, upper-armenian, lower-armenian, bengali, cambodian, khmer, cjk-decimal, devanagari, georgian, gujarati, gurmukhi, hebrew, kannada, lao, malayalam, mongolian, myanmar, oriya, persian, lower-roman, upper-roman, tamil, telugu, thai, tibetan

decimal
西方十进制数字 (如 1, 2, 3, ..., 98, 99, 100)。
decimal-leading-zero
十进制数字,前面填充零 (如 01, 02, 03, ..., 98, 99, 100)。
arabic-indic
阿拉伯数字系统 (如 ١‎, ٢‎, ٣‎, ٤‎, ..., ٩٨‎, ٩٩‎, ١٠٠‎)。
armenian
upper-armenian
传统大写亚美尼亚数字 (如 Ա, Բ, Գ, ..., ՂԸ, ՂԹ, Ճ)。
lower-armenian
小写亚美尼亚数字 (如 ա, բ, գ, ..., ղը, ղթ, ճ)。
bengali
孟加拉数字 (如 ১, ২, ৩, ..., ৯৮, ৯৯, ১০০)。
cambodian
khmer
柬埔寨/高棉数字 (如 ១, ២, ៣, ..., ៩៨, ៩៩, ១០០)。
cjk-decimal
汉字十进制数字 (如 一, 二, 三, ..., 九八, 九九, 一〇〇)。
devanagari
天城数字 (如 १, २, ३, ..., ९८, ९९, १००)。
georgian
传统格鲁吉亚数字 (如 ა, ბ, გ, ..., ჟჱ, ჟთ, რ)。
gujarati
古吉拉特数字 (如 ૧, ૨, ૩, ..., ૯૮, ૯૯, ૧૦૦)。
gurmukhi
古木基数字 (如 ੧, ੨, ੩, ..., ੯੮, ੯੯, ੧੦੦)。
hebrew
传统希伯来数字 (如 א‎, ב‎, ג‎, ..., צח‎, צט‎, ק‎)。
kannada
卡纳达数字 (如 ೧, ೨, ೩, ..., ೯೮, ೯೯, ೧೦೦)。
lao
老挝数字 (如 ໑, ໒, ໓, ..., ໙໘, ໙໙, ໑໐໐)。
malayalam
马拉雅拉姆数字 (如 ൧, ൨, ൩, ..., ൯൮, ൯൯, ൧൦൦)。
mongolian
蒙古数字 (如 ᠑, ᠒, ᠓, ..., ᠙᠘, ᠙᠙, ᠑᠐᠐)。
myanmar
缅甸数字 (如 ၁, ၂, ၃, ..., ၉၈, ၉၉, ၁၀၀)。
oriya
奥里亚数字 (如 ୧, ୨, ୩, ..., ୯୮, ୯୯, ୧୦୦)。
persian
波斯数字 (如 ۱, ۲, ۳, ۴, ..., ۹۸, ۹۹, ۱۰۰)。
lower-roman
小写ASCII罗马数字 (如 i, ii, iii, ..., xcviii, xcix, c)。
upper-roman
大写ASCII罗马数字 (如 I, II, III, ..., XCVIII, XCIX, C)。
tamil
泰米尔数字 (如 ௧, ௨, ௩, ..., ௯௮, ௯௯, ௧௦௦)。
telugu
泰卢固数字 (如 ౧, ౨, ౩, ..., ౯౮, ౯౯, ౧౦౦)。
thai
泰语(暹罗)数字 (如 ๑, ๒, ๓, ..., ๙๘, ๙๙, ๑๐๐)。
tibetan
藏文数字 (如 ༡, ༢, ༣, ..., ༩༨, ༩༩, ༡༠༠)。

以下样式表片段提供了这些预定义计数器样式的规范定义:

@counter-style decimal {
  system: numeric;
  symbols: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
}

@counter-style decimal-leading-zero {
  system: extends decimal;
  pad: 2 '0';
}

@counter-style arabic-indic {
  system: numeric;
  symbols: "\660" "\661" "\662" "\663" "\664" "\665" "\666" "\667" "\668" "\669";
  /* ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ */
}

@counter-style armenian {
  system: additive;
  range: 1 9999;
  additive-symbols: 9000 \554, 8000 \553, 7000 \552, 6000 \551, 5000 \550, 4000 \54F, 3000 \54E, 2000 \54D, 1000 \54C, 900 \54B, 800 \54A, 700 \549, 600 \548, 500 \547, 400 \546, 300 \545, 200 \544, 100 \543, 90 \542, 80 \541, 70 \540, 60 \53F, 50 \53E, 40 \53D, 30 \53C, 20 \53B, 10 \53A, 9 \539, 8 \538, 7 \537, 6 \536, 5 \535, 4 \534, 3 \533, 2 \532, 1 \531;
  /* 9000 Ք, 8000 Փ, 7000 Ւ, 6000 Ց, 5000 Ր, 4000 Տ, 3000 Վ, 2000 Ս, 1000 Ռ, 900 Ջ, 800 Պ, 700 Չ, 600 Ո, 500 Շ, 400 Ն, 300 Յ, 200 Մ, 100 Ճ, 90 Ղ, 80 Ձ, 70 Հ, 60 Կ, 50 Ծ, 40 Խ, 30 Լ, 20 Ի, 10 Ժ, 9 Թ, 8 Ը, 7 Է, 6 Զ, 5 Ե, 4 Դ, 3 Գ, 2 Բ, 1 Ա */
}

@counter-style upper-armenian {
  system: extends armenian;
}

@counter-style lower-armenian {
  system: additive;
  range: 1 9999;
  additive-symbols: 9000 "\584", 8000 "\583", 7000 "\582", 6000 "\581", 5000 "\580", 4000 "\57F", 3000 "\57E", 2000 "\57D", 1000 "\57C", 900 "\57B", 800 "\57A", 700 "\579", 600 "\578", 500 "\577", 400 "\576", 300 "\575", 200 "\574", 100 "\573", 90 "\572", 80 "\571", 70 "\570", 60 "\56F", 50 "\56E", 40 "\56D", 30 "\56C", 20 "\56B", 10 "\56A", 9 "\569", 8 "\568", 7 "\567", 6 "\566", 5 "\565", 4 "\564", 3 "\563", 2 "\562", 1 "\561";
  /* 9000 ք, 8000 փ, 7000 ւ, 6000 ց, 5000 ր, 4000 տ, 3000 վ, 2000 ս, 1000 ռ, 900 ջ, 800 պ, 700 չ, 600 ո, 500 շ, 400 ն, 300 յ, 200 մ, 100 ճ, 90 ղ, 80 ձ, 70 հ, 60 կ, 50 ծ, 40 խ, 30 լ, 20 ի, 10 ժ, 9 թ, 8 ը, 7 է, 6 զ, 5 ե, 4 դ, 3 գ, 2 բ, 1 ա */
}

@counter-style bengali {
  system: numeric;
  symbols: "\9E6" "\9E7" "\9E8" "\9E9" "\9EA" "\9EB" "\9EC" "\9ED" "\9EE" "\9EF";
  /* ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ */
}

@counter-style cambodian {
  system: numeric;
  symbols: "\17E0" "\17E1" "\17E2" "\17E3" "\17E4" "\17E5" "\17E6" "\17E7" "\17E8" "\17E9";
  /* ០ ១ ២ ៣ ៤ ៥ ៦ ៧ ៨ ៩ */
}

@counter-style khmer {
  system: extends cambodian;
}

@counter-style cjk-decimal {
  system: numeric;
  range: 0 infinite;
  symbols: \3007  \4E00  \4E8C  \4E09  \56DB  \4E94  \516D  \4E03  \516B  \4E5D;
  /* 〇 一 二 三 四 五 六 七 八 九 */
  suffix: "\3001";
  /* "、" */
}

@counter-style devanagari {
  system: numeric;
  symbols: "\966" "\967" "\968" "\969" "\96A" "\96B" "\96C" "\96D" "\96E" "\96F";
  /* ० १ २ ३ ४ ५ ६ ७ ८ ९ */
}

@counter-style georgian {
  system: additive;
  range: 1 19999;
  additive-symbols: 10000 \10F5, 9000 \10F0, 8000 \10EF, 7000 \10F4, 6000 \10EE, 5000 \10ED, 4000 \10EC, 3000 \10EB, 2000 \10EA, 1000 \10E9, 900 \10E8, 800 \10E7, 700 \10E6, 600 \10E5, 500 \10E4, 400 \10F3, 300 \10E2, 200 \10E1, 100 \10E0, 90 \10DF, 80 \10DE, 70 \10DD, 60 \10F2, 50 \10DC, 40 \10DB, 30 \10DA, 20 \10D9, 10 \10D8, 9 \10D7, 8 \10F1, 7 \10D6, 6 \10D5, 5 \10D4, 4 \10D3, 3 \10D2, 2 \10D1, 1 \10D0;
  /* 10000 ჵ, 9000 ჰ, 8000 ჯ, 7000 ჴ, 6000 ხ, 5000 ჭ, 4000 წ, 3000 ძ, 2000 ც, 1000 ჩ, 900 შ, 800 ყ, 700 ღ, 600 ქ, 500 ფ, 400 ჳ, 300 ტ, 200 ს, 100 რ, 90 ჟ, 80 პ, 70 ო, 60 ჲ, 50 ნ, 40 მ, 30 ლ, 20 კ, 10 ი, 9 თ, 8 ჱ, 7 ზ, 6 ვ, 5 ე, 4 დ, 3 გ, 2 ბ, 1 ა */
}

@counter-style gujarati {
  system: numeric;
  symbols: "\AE6" "\AE7" "\AE8" "\AE9" "\AEA" "\AEB" "\AEC" "\AED" "\AEE" "\AEF";
  /* ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯ */
}

@counter-style gurmukhi {
  system: numeric;
  symbols: "\A66" "\A67" "\A68" "\A69" "\A6A" "\A6B" "\A6C" "\A6D" "\A6E" "\A6F";
  /* ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ */
}

@counter-style hebrew {
  system: additive;
  range: 1 10999;
  additive-symbols: 10000 \5D9\5F3, 9000 \5D8\5F3, 8000 \5D7\5F3, 7000 \5D6\5F3, 6000 \5D5\5F3, 5000 \5D4\5F3, 4000 \5D3\5F3, 3000 \5D2\5F3, 2000 \5D1\5F3, 1000 \5D0\5F3, 400 \5EA, 300 \5E9, 200 \5E8, 100 \5E7, 90 \5E6, 80 \5E4, 70 \5E2, 60 \5E1, 50 \5E0, 40 \5DE, 30 \5DC, 20 \5DB, 19 \5D9\5D8, 18 \5D9\5D7, 17 \5D9\5D6, 16 \5D8\5D6, 15 \5D8\5D5, 10 \5D9, 9 \5D8, 8 \5D7, 7 \5D6, 6 \5D5, 5 \5D4, 4 \5D3, 3 \5D2, 2 \5D1, 1 \5D0;
  /* 10000 י׳, 9000 ט׳, 8000 ח׳, 7000 ז׳, 6000 ו׳, 5000 ה׳, 4000 ד׳, 3000 ג׳, 2000 ב׳, 1000 א׳, 400 ת, 300 ש, 200 ר, 100 ק, 90 צ, 80 פ, 70 ע, 60 ס, 50 נ, 40 מ, 30 ל, 20 כ, 19 יט, 18 יח, 17 יז, 16 טז, 15 טו, 10 י, 9 ט, 8 ח, 7 ז, 6 ו, 5 ה, 4 ד, 3 ג, 2 ב, 1 א */
  /* This system manually specifies the values for 19-15 to force the correct display of 15 and 16, which are commonly rewritten to avoid a close resemblance to the Tetragrammaton. */
  /* Implementations MAY choose to implement this manually to a higher range; see note below. */
}

@counter-style kannada {
  system: numeric;
  symbols: "\CE6" "\CE7" "\CE8" "\CE9" "\CEA" "\CEB" "\CEC" "\CED" "\CEE" "\CEF";
  /* ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯ */
}

@counter-style lao {
  system: numeric;
  symbols: "\ED0" "\ED1" "\ED2" "\ED3" "\ED4" "\ED5" "\ED6" "\ED7" "\ED8" "\ED9";
  /* ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ */
}

@counter-style malayalam {
  system: numeric;
  symbols: "\D66" "\D67" "\D68" "\D69" "\D6A" "\D6B" "\D6C" "\D6D" "\D6E" "\D6F";
  /* ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯ */
}

@counter-style mongolian {
  system: numeric;
  symbols: "\1810" "\1811" "\1812" "\1813" "\1814" "\1815" "\1816" "\1817" "\1818" "\1819";
  /* ᠐ ᠑ ᠒ ᠓ ᠔ ᠕ ᠖ ᠗ ᠘ ᠙ */
}

@counter-style myanmar {
  system: numeric;
  symbols: "\1040" "\1041" "\1042" "\1043" "\1044" "\1045" "\1046" "\1047" "\1048" "\1049";
  /* ၀ ၁ ၂ ၃ ၄ ၅ ၆ ၇ ၈ ၉ */
}

@counter-style oriya {
  system: numeric;
  symbols: "\B66" "\B67" "\B68" "\B69" "\B6A" "\B6B" "\B6C" "\B6D" "\B6E" "\B6F";
  /* ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ */
}

@counter-style persian {
  system: numeric;
  symbols: "\6F0" "\6F1" "\6F2" "\6F3" "\6F4" "\6F5" "\6F6" "\6F7" "\6F8" "\6F9";
  /* ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ */
}

@counter-style lower-roman {
  system: additive;
  range: 1 3999;
  additive-symbols: 1000 m, 900 cm, 500 d, 400 cd, 100 c, 90 xc, 50 l, 40 xl, 10 x, 9 ix, 5 v, 4 iv, 1 i;
}

@counter-style upper-roman {
  system: additive;
  range: 1 3999;
  additive-symbols: 1000 M, 900 CM, 500 D, 400 CD, 100 C, 90 XC, 50 L, 40 XL, 10 X, 9 IX, 5 V, 4 IV, 1 I;
}

@counter-style tamil {
  system: numeric;
  symbols: "\BE6" "\BE7" "\BE8" "\BE9" "\BEA" "\BEB" "\BEC" "\BED" "\BEE" "\BEF";
  /* ௦ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ */
}

@counter-style telugu {
  system: numeric;
  symbols: "\C66" "\C67" "\C68" "\C69" "\C6A" "\C6B" "\C6C" "\C6D" "\C6E" "\C6F";
  /* ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯ */
}

@counter-style thai {
  system: numeric;
  symbols: "\E50" "\E51" "\E52" "\E53" "\E54" "\E55" "\E56" "\E57" "\E58" "\E59";
  /* ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ */
}

@counter-style tibetan {
  system: numeric;
  symbols: "\F20" "\F21" "\F22" "\F23" "\F24" "\F25" "\F26" "\F27" "\F28" "\F29";
  /* ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ */
}

实现必须至少实现hebrew到上述@counter-style规则中指定的范围, 但也可以实现到更高的范围。 如果实现了更高的范围, 相应的range描述符必须反映实现的范围。

6.2. 字母: lower-alpha, lower-latin, upper-alpha, upper-latin, lower-greek, hiragana, hiragana-iroha, katakana, katakana-iroha

lower-alpha
lower-latin
小写 ASCII 字母 (如 a, b, c, ..., z, aa, ab)。
upper-alpha
upper-latin
大写 ASCII 字母 (如 A, B, C, ..., Z, AA, AB)。
lower-greek
小写古典希腊字母 (如 α, β, γ, ..., ω, αα, αβ)。
hiragana
字典顺序平假名字母 (如 あ, い, う, ..., ん, ああ, あい)。
hiragana-iroha
伊吕波顺序平假名字母 (如 い, ろ, は, ..., す, いい, いろ)。
katakana
字典顺序片假名字母 (如 ア, イ, ウ, ..., ン, アア, アイ)。
katakana-iroha
伊吕波顺序片假名字母 (如 イ, ロ, ハ, ..., ス, イイ, イロ)

以下样式表片段提供了这些预定义计数器样式的规范定义:

@counter-style lower-alpha {
  system: alphabetic;
  symbols: a b c d e f g h i j k l m n o p q r s t u v w x y z;
}

@counter-style lower-latin {
  system: extends lower-alpha;
}

@counter-style upper-alpha {
  system: alphabetic;
  symbols: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z;
}

@counter-style upper-latin {
  system: extends upper-alpha;
}

@counter-style lower-greek {
  system: alphabetic;
  symbols: "\3B1" "\3B2" "\3B3" "\3B4" "\3B5" "\3B6" "\3B7" "\3B8" "\3B9" "\3BA" "\3BB" "\3BC" "\3BD" "\3BE" "\3BF" "\3C0" "\3C1" "\3C3" "\3C4" "\3C5" "\3C6" "\3C7" "\3C8" "\3C9";
  /* α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω */
}

@counter-style hiragana {
  system: alphabetic;
  symbols: "\3042" "\3044" "\3046" "\3048" "\304A" "\304B" "\304D" "\304F" "\3051" "\3053" "\3055" "\3057" "\3059" "\305B" "\305D" "\305F" "\3061" "\3064" "\3066" "\3068" "\306A" "\306B" "\306C" "\306D" "\306E" "\306F" "\3072" "\3075" "\3078" "\307B" "\307E" "\307F" "\3080" "\3081" "\3082" "\3084" "\3086" "\3088" "\3089" "\308A" "\308B" "\308C" "\308D" "\308F" "\3090" "\3091" "\3092" "\3093";
  /* あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ ら り る れ ろ わ ゐ ゑ を ん */
  suffix: "、";
}

@counter-style hiragana-iroha {
  system: alphabetic;
  symbols: "\3044" "\308D" "\306F" "\306B" "\307B" "\3078" "\3068" "\3061" "\308A" "\306C" "\308B" "\3092" "\308F" "\304B" "\3088" "\305F" "\308C" "\305D" "\3064" "\306D" "\306A" "\3089" "\3080" "\3046" "\3090" "\306E" "\304A" "\304F" "\3084" "\307E" "\3051" "\3075" "\3053" "\3048" "\3066" "\3042" "\3055" "\304D" "\3086" "\3081" "\307F" "\3057" "\3091" "\3072" "\3082" "\305B" "\3059";
  /* い ろ は に ほ へ と ち り ぬ る を わ か よ た れ そ つ ね な ら む う ゐ の お く や ま け ふ こ え て あ さ き ゆ め み し ゑ ひ も せ す */
  suffix: "、";
}

@counter-style katakana {
  system: alphabetic;
  symbols: "\30A2" "\30A4" "\30A6" "\30A8" "\30AA" "\30AB" "\30AD" "\30AF" "\30B1" "\30B3" "\30B5" "\30B7" "\30B9" "\30BB" "\30BD" "\30BF" "\30C1" "\30C4" "\30C6" "\30C8" "\30CA" "\30CB" "\30CC" "\30CD" "\30CE" "\30CF" "\30D2" "\30D5" "\30D8" "\30DB" "\30DE" "\30DF" "\30E0" "\30E1" "\30E2" "\30E4" "\30E6" "\30E8" "\30E9" "\30EA" "\30EB" "\30EC" "\30ED" "\30EF" "\30F0" "\30F1" "\30F2" "\30F3";
  /* ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヰ ヱ ヲ ン */
  suffix: "、";
}

@counter-style katakana-iroha {
  system: alphabetic;
  symbols: "\30A4" "\30ED" "\30CF" "\30CB" "\30DB" "\30D8" "\30C8" "\30C1" "\30EA" "\30CC" "\30EB" "\30F2" "\30EF" "\30AB" "\30E8" "\30BF" "\30EC" "\30BD" "\30C4" "\30CD" "\30CA" "\30E9" "\30E0" "\30A6" "\30F0" "\30CE" "\30AA" "\30AF" "\30E4" "\30DE" "\30B1" "\30D5" "\30B3" "\30A8" "\30C6" "\30A2" "\30B5" "\30AD" "\30E6" "\30E1" "\30DF" "\30B7" "\30F1" "\30D2" "\30E2" "\30BB" "\30B9";
  /* イ ロ ハ ニ ホ ヘ ト チ リ ヌ ル ヲ ワ カ ヨ タ レ ソ ツ ネ ナ ラ ム ウ ヰ ノ オ ク ヤ マ ケ フ コ エ テ ア サ キ ユ メ ミ シ ヱ ヒ モ セ ス */
  suffix: "、";
}

6.3. 符号: disc, circle, square, disclosure-open, disclosure-closed

disc
一个实心圆,类似于 • U+2022 BULLET。
circle
一个空心圆,类似于 ◦ U+25E6 WHITE BULLET。
square
一个实心方块,类似于 ▪ U+25AA BLACK SMALL SQUARE。
disclosure-open
disclosure-closed
用于表示打开或关闭的符号,例如 HTML details 元素。

以下样式表片段提供了这些预定义计数器样式的规范定义:

@counter-style disc {
  system: cyclic;
  symbols: \2022;
  /* • */
  suffix: " ";
}

@counter-style circle {
  system: cyclic;
  symbols: \25E6;
  /* ◦ */
  suffix: " ";
}

@counter-style square {
  system: cyclic;
  symbols: \25AA;
  /* ▪ */
  suffix: " ";
}

@counter-style disclosure-open {
  system: cyclic;
  suffix: " ";
  /* for symbols, see normative text below */
}

@counter-style disclosure-closed {
  system: cyclic;
  suffix: " ";
  /* for symbols, see normative text below */
}

当使用list-style-type时, UA 可以选择使用 UA 生成的图像或 UA 选择的字体渲染这些样式, 而不是使用元素自己的字体渲染指定的字符。 如果使用图像,图像应与字符相似, 并且应调整大小以适合 1em × 1em 的正方形。

对于 disclosure-opendisclosure-closed 计数器样式, 标记应为适合指示展开和关闭状态的图像或字符, 例如 HTML 的 details 元素。 如果图像具有方向性, 则应响应元素的 书写模式, 类似于 Images 4 模块中的bidi-sensitive images功能。 例如,disclosure-closed 样式可能使用字符 U+25B8 BLACK RIGHT-POINTING SMALL TRIANGLE (▸) 和 U+25C2 BLACK LEFT-POINTING SMALL TRIANGLE (◂), 而 disclosure-open 样式可能使用字符 U+25BE BLACK DOWN-POINTING SMALL TRIANGLE (▾)。

6.4. 固定: cjk-earthly-branch, cjk-heavenly-stem

cjk-earthly-branch
汉字“地支”序数 (例如,子,丑,寅,...,亥)。
cjk-heavenly-stem
汉字“天干”序数 (例如,甲,乙,丙,...,癸)

以下样式表片段提供了这些预定义计数器样式的规范定义:

@counter-style cjk-earthly-branch {
  system: fixed;
  symbols: "\5B50" "\4E11" "\5BC5" "\536F" "\8FB0" "\5DF3" "\5348" "\672A" "\7533" "\9149" "\620C" "\4EA5";
  /* 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 */
  suffix: "、";
}

@counter-style cjk-heavenly-stem {
  system: fixed;
  symbols: "\7532" "\4E59" "\4E19" "\4E01" "\620A" "\5DF1" "\5E9A" "\8F9B" "\58EC" "\7678";
  /* 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 */
  suffix: "、";
}

7. 复杂的预定义计数器样式

虽然作者可以使用 @counter-style 规则 来定义他们自己的计数器样式,或依赖预定义的计数器样式集, 但有一些计数器样式的规则过于复杂,无法通过预定义的算法捕获。 本节将描述这些计数器样式。

本节中指定的一些计数器样式具有自定义的生成计数值的算法, 但在其他方面与通过 @counter-style 规则定义的计数器样式相同。 例如,作者可以在 extends 系统中引用这些样式之一, 重用算法但更换一些其他描述符。

本节中定义的所有计数器样式都有 发音形式 ,即 数字, 并且 使用负号

7.1. 东亚长格式计数器样式

中文、日文和韩文有一些“长格式”的计数器样式, 类似于英文中的“十三千一百二十三”。 它们都有正式和非正式两种变体。 正式样式通常用于财务和法律文件中, 因为这些字符更难被修改。

下表展示了这些样式的示例, 尤其是在某些方面的不同。
计数器样式 0 1 2 3 10 11 99 100 101 6001
japanese-informal 十一 九十九 百一 六千一
japanese-formal 壱拾 壱拾壱 九拾九 壱百 壱百壱 六阡壱
korean-hangul-formal 일십 일십일 구십구 일백 일백일 육천일
korean-hanja-informal 十一 九十九 百一 六千一
korean-hanja-formal 壹拾 壹拾壹 九拾九 壹百 壹百壹 六仟壹
simp-chinese-informal 十一 九十九 一百 一百零一 六千零一
simp-chinese-formal 壹拾 壹拾壹 玖拾玖 壹佰 壹佰零壹 陆仟零壹
trad-chinese-informal 十一 九十九 一百 一百零一 六千零一
trad-chinese-formal 壹拾 壹拾壹 玖拾玖 壹佰 壹佰零壹 陸仟零壹

由于对如何最佳表示 10k 或更大数字的意见分歧, 本节定义的所有计数器样式的范围为 -9999 到 9999, 但实现可能支持更大的范围。 在实现支持的范围之外, 后备计数器样式为 cjk-decimal

注意: 鼓励实现者对超过 10k 的计数表示法进行研究和实现, 并在发现普遍接受的答案时向 CSS 工作组反馈数据。 有关此主题的一些先前研究包含在 早期草案 中。

7.1.1. 日文:japanese-informaljapanese-formal

japanese-informal
非正式的日文汉字计数法 (例如,千百十一)
japanese-formal
正式的日文汉字计数法 (例如,壱阡壱百壱拾壱)
@counter-style japanese-informal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \4E5D\5343, 8000 \516B\5343, 7000 \4E03\5343, 6000 \516D\5343, 5000 \4E94\5343, 4000 \56DB\5343, 3000 \4E09\5343, 2000 \4E8C\5343, 1000 \5343, 900 \4E5D\767E, 800 \516B\767E, 700 \4E03\767E, 600 \516D\767E, 500 \4E94\767E, 400 \56DB\767E, 300 \4E09\767E, 200 \4E8C\767E, 100 \767E, 90 \4E5D\5341, 80 \516B\5341, 70 \4E03\5341, 60 \516D\5341, 50 \4E94\5341, 40 \56DB\5341, 30 \4E09\5341, 20 \4E8C\5341, 10 \5341, 9 \4E5D, 8 \516B, 7 \4E03, 6 \516D, 5 \4E94, 4 \56DB, 3 \4E09, 2 \4E8C, 1 \4E00, 0 \3007;
  /* 9000 九千, 8000 八千, 7000 七千, 6000 六千, 5000 五千, 4000 四千, 3000 三千, 2000 二千, 1000 千, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 三百, 200 二百, 100 百, 90 九十, 80 八十, 70 七十, 60 六十, 50 五十, 40 四十, 30 三十, 20 二十, 10 十, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 三, 2 二, 1 一, 0 〇 */
  suffix: '\3001';
  /* 、 */
  negative: "\30DE\30A4\30CA\30B9";
  /* マイナス */
  fallback: cjk-decimal;
}

@counter-style japanese-formal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \4E5D\9621, 8000 \516B\9621, 7000 \4E03\9621, 6000 \516D\9621, 5000 \4F0D\9621, 4000 \56DB\9621, 3000 \53C2\9621, 2000 \5F10\9621, 1000 \58F1\9621, 900 \4E5D\767E, 800 \516B\767E, 700 \4E03\767E, 600 \516D\767E, 500 \4F0D\767E, 400 \56DB\767E, 300 \53C2\767E, 200 \5F10\767E, 100 \58F1\767E, 90 \4E5D\62FE, 80 \516B\62FE, 70 \4E03\62FE, 60 \516D\62FE, 50 \4F0D\62FE, 40 \56DB\62FE, 30 \53C2\62FE, 20 \5F10\62FE, 10 \58F1\62FE, 9 \4E5D, 8 \516B, 7 \4E03, 6 \516D, 5 \4F0D, 4 \56DB, 3 \53C2, 2 \5F10, 1 \58F1, 0 \96F6;
  /* 9000 九阡, 8000 八阡, 7000 七阡, 6000 六阡, 5000 伍阡, 4000 四阡, 3000 参阡, 2000 弐阡, 1000 壱阡, 900 九百, 800 八百, 700 七百, 600 六百, 500 伍百, 400 四百, 300 参百, 200 弐百, 100 壱百, 90 九拾, 80 八拾, 70 七拾, 60 六拾, 50 伍拾, 40 四拾, 30 参拾, 20 弐拾, 10 壱拾, 9 九, 8 八, 7 七, 6 六, 5 伍, 4 四, 3 参, 2 弐, 1 壱, 0 零 */
  suffix: '\3001';
  /* 、 */
  negative: "\30DE\30A4\30CA\30B9";
  /* マイナス */
  fallback: cjk-decimal;
}

7.1.2. 韩文:korean-hangul-formalkorean-hanja-informal,以及 korean-hanja-formal

korean-hangul-formal
韩文韩字计数法 (例如,일천일백일십일)
korean-hanja-informal
非正式的韩文汉字计数法 (例如,千百十一)
korean-hanja-formal
正式的韩文汉字计数法 (例如,壹仟壹百壹拾壹)
@counter-style korean-hangul-formal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \AD6C\CC9C, 8000 \D314\CC9C, 7000 \CE60\CC9C, 6000 \C721\CC9C, 5000 \C624\CC9C, 4000 \C0AC\CC9C, 3000 \C0BC\CC9C, 2000 \C774\CC9C, 1000 \C77C\CC9C, 900 \AD6C\BC31, 800 \D314\BC31, 700 \CE60\BC31, 600 \C721\BC31, 500 \C624\BC31, 400 \C0AC\BC31, 300 \C0BC\BC31, 200 \C774\BC31, 100 \C77C\BC31, 90 \AD6C\C2ED, 80 \D314\C2ED, 70 \CE60\C2ED, 60 \C721\C2ED, 50 \C624\C2ED, 40 \C0AC\C2ED, 30 \C0BC\C2ED, 20 \C774\C2ED, 10 \C77C\C2ED, 9 \AD6C, 8 \D314, 7 \CE60, 6 \C721, 5 \C624, 4 \C0AC, 3 \C0BC, 2 \C774, 1 \C77C, 0 \C601;
  /* 9000 구천, 8000 팔천, 7000 칠천, 6000 육천, 5000 오천, 4000 사천, 3000 삼천, 2000 이천, 1000 일천, 900 구백, 800 팔백, 700 칠백, 600 육백, 500 오백, 400 사백, 300 삼백, 200 이백, 100 일백, 90 구십, 80 팔십, 70 칠십, 60 육십, 50 오십, 40 사십, 30 삼십, 20 이십, 10 일십, 9 구, 8 팔, 7 칠, 6 육, 5 오, 4 사, 3 삼, 2 이, 1 일, 0 영 */
  suffix: ', ';
  negative: "\B9C8\C774\B108\C2A4  ";
  /* 마이너스 (followed by a space) */
}

@counter-style korean-hanja-informal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \4E5D\5343, 8000 \516B\5343, 7000 \4E03\5343, 6000 \516D\5343, 5000 \4E94\5343, 4000 \56DB\5343, 3000 \4E09\5343, 2000 \4E8C\5343, 1000 \5343, 900 \4E5D\767E, 800 \516B\767E, 700 \4E03\767E, 600 \516D\767E, 500 \4E94\767E, 400 \56DB\767E, 300 \4E09\767E, 200 \4E8C\767E, 100 \767E, 90 \4E5D\5341, 80 \516B\5341, 70 \4E03\5341, 60 \516D\5341, 50 \4E94\5341, 40 \56DB\5341, 30 \4E09\5341, 20 \4E8C\5341, 10 \5341, 9 \4E5D, 8 \516B, 7 \4E03, 6 \516D, 5 \4E94, 4 \56DB, 3 \4E09, 2 \4E8C, 1 \4E00, 0 \96F6;
  /* 9000 九千, 8000 八千, 7000 七千, 6000 六千, 5000 五千, 4000 四千, 3000 三千, 2000 二千, 1000 千, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 三百, 200 二百, 100 百, 90 九十, 80 八十, 70 七十, 60 六十, 50 五十, 40 四十, 30 三十, 20 二十, 10 十, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 三, 2 二, 1 一, 0 零 */
  suffix: ', ';
  negative: "\B9C8\C774\B108\C2A4  ";
  /* 마이너스 (followed by a space) */
}

@counter-style korean-hanja-formal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \4E5D\4EDF, 8000 \516B\4EDF, 7000 \4E03\4EDF, 6000 \516D\4EDF, 5000 \4E94\4EDF, 4000 \56DB\4EDF, 3000 \53C3\4EDF, 2000 \8CB3\4EDF, 1000 \58F9\4EDF, 900 \4E5D\767E, 800 \516B\767E, 700 \4E03\767E, 600 \516D\767E, 500 \4E94\767E, 400 \56DB\767E, 300 \53C3\767E, 200 \8CB3\767E, 100 \58F9\767E, 90 \4E5D\62FE, 80 \516B\62FE, 70 \4E03\62FE, 60 \516D\62FE, 50 \4E94\62FE, 40 \56DB\62FE, 30 \53C3\62FE, 20 \8CB3\62FE, 10 \58F9\62FE, 9 \4E5D, 8 \516B, 7 \4E03, 6 \516D, 5 \4E94, 4 \56DB, 3 \53C3, 2 \8CB3, 1 \58F9, 0 \96F6;
  /* 9000 九仟, 8000 八仟, 7000 七仟, 6000 六仟, 5000 五仟, 4000 四仟, 3000 參仟, 2000 貳仟, 1000 壹仟, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 參百, 200 貳百, 100 壹百, 90 九拾, 80 八拾, 70 七拾, 60 六拾, 50 五拾, 40 四拾, 30 參拾, 20 貳拾, 10 壹拾, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 參, 2 貳, 1 壹, 0 零 */
  suffix: ', ';
  negative: "\B9C8\C774\B108\C2A4  ";
  /* 마이너스 (followed by a space) */
}

7.1.3. 中文:simp-chinese-informalsimp-chinese-formaltrad-chinese-informal,以及 trad-chinese-formal

simp-chinese-informal
简体中文非正式数字 (例如,一千一百一十一)
simp-chinese-formal
简体中文正式数字 (例如,壹仟壹佰壹拾壹)
trad-chinese-informal
繁体中文非正式数字 (例如,一千一百一十一)
trad-chinese-formal
繁体中文正式数字 (例如,壹仟壹佰壹拾壹)
cjk-ideographic
该计数样式与 trad-chinese-informal 相同。 (它的存在是为了兼容遗留系统。)

中文的长格式样式通过几乎相同的算法定义(这里作为一个统一的算法进行规范,并在相关之处指出差异),但使用不同的字符集,如下表所示。

  1. 如果计数值为0,则表示结果为指定计数样式的0字符。跳过算法的其余部分。
  2. 初始将计数值表示为一个十进制数。对于每个非0的数字,附加适当的数字标记到该数字。个位数没有标记。
  3. 对于非正式样式,如果计数值在十到十九之间,则删除十位数字(保留数字标记)。
  4. 删除任何尾随的零,并将其余的零压缩为一个零字符。
  5. 用指定计数样式的适当字符替换数字0-9。返回结果字符串作为计数值的表示形式。

对于所有这些计数样式,后缀为 "、"(U+3001), 回退样式cjk-decimal范围-9999 9999, 负数样式在符号表中给出。

以下表格定义了这些样式中使用的字符:

码点
simp-chinese-informal simp-chinese-formal trad-chinese-informal trad-chinese-formal
Digit 0 零 U+96F6 零 U+96F6 零 U+96F6 零 U+96F6
Digit 1 一 U+4E00 壹 U+58F9 一 U+4E00 壹 U+58F9
Digit 2 二 U+4E8C 贰 U+8D30 二 U+4E8C 貳 U+8CB3
Digit 3 三 U+4E09 叁 U+53C1 三 U+4E09 參 U+53C3
Digit 4 四 U+56DB 肆 U+8086 四 U+56DB 肆 U+8086
Digit 5 五 U+4E94 伍 U+4F0D 五 U+4E94 伍 U+4F0D
Digit 6 六 U+516D 陆 U+9646 六 U+516D 陸 U+9678
Digit 7 七 U+4E03 柒 U+67D2 七 U+4E03 柒 U+67D2
Digit 8 八 U+516B 捌 U+634C 八 U+516B 捌 U+634C
Digit 9 九 U+4E5D 玖 U+7396 九 U+4E5D 玖 U+7396
Tens Digit Marker 十 U+5341 拾 U+62FE 十 U+5341 拾 U+62FE
Hundreds Digit Marker 百 U+767E 佰 U+4F70 百 U+767E 佰 U+4F70
Thousands Digit Marker 千 U+5343 仟 U+4EDF 千 U+5343 仟 U+4EDF
Negative Sign 负 U+8D1F 负 U+8D1F 負 U+8CA0 負 U+8CA0

参考如下,为 simp-chinese-informal 样式的前120个值:

 1     一    41   四十一    81   八十一
 2     二    42   四十二    82   八十二
 3     三    43   四十三    83   八十三
 4     四    44   四十四    84   八十四
 5     五    45   四十五    85   八十五
 6     六    46   四十六    86   八十六
 7     七    47   四十七    87   八十七
 8     八    48   四十八    88   八十八
 9     九    49   四十九    89   八十九
10     十    50    五十    90    九十
11    十一    51   五十一    91   九十一
12    十二    52   五十二    92   九十二
13    十三    53   五十三    93   九十三
14    十四    54   五十四    94   九十四
15    十五    55   五十五    95   九十五
16    十六    56   五十六    96   九十六
17    十七    57   五十七    97   九十七
18    十八    58   五十八    98   九十八
19    十九    59   五十九    99   九十九
20    二十    60    六十   100    一百
21   二十一    61   六十一   101  一百零一
22   二十二    62   六十二   102  一百零二
23   二十三    63   六十三   103  一百零三
24   二十四    64   六十四   104  一百零四
25   二十五    65   六十五   105  一百零五
26   二十六    66   六十六   106  一百零六
27   二十七    67   六十七   107  一百零七
28   二十八    68   六十八   108  一百零八
29   二十九    69   六十九   109  一百零九
30    三十    70    七十   110  一百一十
31   三十一    71   七十一   111 一百一十一
32   三十二    72   七十二   112 一百一十二
33   三十三    73   七十三   113 一百一十三
34   三十四    74   七十四   114 一百一十四
35   三十五    75   七十五   115 一百一十五
36   三十六    76   七十六   116 一百一十六
37   三十七    77   七十七   117 一百一十七
38   三十八    78   七十八   118 一百一十八
39   三十九    79   七十九   119 一百一十九
40    四十    80    八十   120  一百二十

7.2. 埃塞俄比亚数字计数器样式: ethiopic-numeric

ethiopic-numeric 计数器样式适用于所有正非零数字。以下算法将十进制数字转换为埃塞俄比亚数字:

  1. 如果数字为 1,则返回 "፩" (U+1369)。
  2. 将数字按两位分组,从最不重要的十进制数字开始。
  3. 依次为每个分组编索引,从最不重要的分组编号为零开始。
  4. 如果该组的值为零,或者该组是最重要的一组且值为 1,或者该组的索引是奇数且值为 1,则移除这些数字(但保留该组,以便稍后附加分隔符)。
  5. 对每个剩余的数字,从下面的列表中替换为相关的埃塞俄比亚字符。
    十位 个位
    码点 码点
    10 U+1372 1 U+1369
    20 U+1373 2 U+136A
    30 U+1374 3 U+136B
    40 U+1375 4 U+136C
    50 U+1376 5 U+136D
    60 U+1377 6 U+136E
    70 U+1378 7 U+136F
    80 U+1379 8 U+1370
    90 U+137A 9 U+1371
  6. 对于索引为奇数的每个分组(如第二步所述),除了最初值为零的分组,附加 ፻ U+137B。
  7. 对于索引为偶数的每个分组(如第二步所述),除了索引为 0 的分组,附加 ፼ U+137C。
  8. 将所有分组连接成一个字符串,并返回结果。

对于此系统,名称为 "ethiopic-numeric",范围1 无限后缀"/ "(U+002F 斜杠后跟 U+0020 空格),其余描述符具有其初始值。

十进制数字 100 在埃塞俄比亚语中是 ፻ U+137B

十进制数字 78010092 在埃塞俄比亚语中是 ፸፰፻፩፼፺፪ U+1378 U+1370 U+137B U+1369 U+137C U+137A U+136A。

十进制数字 780100000092 在埃塞俄比亚语中是 ፸፰፻፩፼፼፺፪ U+1378 U+1370 U+137B U+1369 U+137C U+137C U+137A U+136A。

8. 额外的“现成”计数器样式

国际化工作组维护了一个包含多种世界语言的现成@counter-style规则的列表, 该列表位于他们的现成计数器样式文档中。 [predefined-counter-styles]

这些额外的计数器样式并不打算由用户代理默认支持, 但可以通过用户或作者直接将其复制到样式表中使用。

9. API

9.1. CSSRule接口的扩展

CSSRule接口扩展如下:

partial interface CSSRule {
    const unsigned short COUNTER_STYLE_RULE = 11;
};

9.2. CSSCounterStyleRule接口

CSSCounterStyleRule接口表示@counter-style规则。

[Exposed=Window]
interface CSSCounterStyleRule : CSSRule {
  attribute CSSOMString name;
  attribute CSSOMString system;
  attribute CSSOMString symbols;
  attribute CSSOMString additiveSymbols;
  attribute CSSOMString negative;
  attribute CSSOMString prefix;
  attribute CSSOMString suffix;
  attribute CSSOMString range;
  attribute CSSOMString pad;
  attribute CSSOMString speakAs;
  attribute CSSOMString fallback;
};
name, 类型 CSSOMString
获取时,name 属性必须返回一个 CSSOMString 对象, 该对象包含与该规则关联的<counter-style-name>的序列化结果。

设置 name 属性时,执行以下步骤:

  1. 如果值与任何预定义的计数器样式进行 ASCII大小写不敏感匹配,则将其转为小写。

  2. 如果值不是“decimal”、“disc”或“none”, 则将关联规则的名称替换为与该值相等的标识符

  3. 否则,什么也不做。

system, 类型 CSSOMString
symbols, 类型 CSSOMString
additiveSymbols, 类型 CSSOMString
negative, 类型 CSSOMString
prefix, 类型 CSSOMString
suffix, 类型 CSSOMString
range, 类型 CSSOMString
pad, 类型 CSSOMString
speakAs, 类型 CSSOMString
fallback, 类型 CSSOMString
剩余的属性在获取时必须返回一个CSSOMString对象, 该对象包含与该规则关联的描述符的序列化结果。 如果关联规则中未指定描述符, 该属性必须返回空字符串。

在设置时,执行以下步骤:

  1. 从值中解析组件值列表

  2. 如果返回的值根据给定描述符的语法无效, 或者会导致@counter-style规则无效, 则不执行任何操作并中止这些步骤。 (例如,某些系统要求symbols描述符包含两个值。)

  3. 如果要设置的属性是system, 并且新值会更改所使用的算法, 则不执行任何操作并中止这些步骤。可以更改算法的某个方面, 例如首个符号值,适用于fixed系统。

  4. 将描述符设置为该值。

10. HTML 示例样式表

本节为说明性内容,非规范内容。 HTML 本身定义了适用于其元素的样式, 并且在某些情况下,交由用户代理自行决定。

details > summary {
  display: list-item;
  list-style: disclosure-closed inside;
}

details[open] > summary {
  list-style: disclosure-open inside;
}

变更

自 2017 年 12 月候选推荐标准以来的变更

2017 年 12 月 14 日候选推荐标准以来的重大变更:

提供了评论处理结果

自 2015 年 6 月候选推荐标准以来的变更

2015 年 6 月 11 日候选推荐标准以来的重大变更:

提供了评论处理结果

自 2015 年 2 月候选推荐标准以来的变更

致谢

以下人员及其编写的文档在定义编号系统时非常有用: Alexander Savenkov, Arron Eicholz, Aryeh Gregor, Christopher Hoess, Daniel Yacob, Frank Tang, Jonathan Rosenne, Karl Ove Hufthammer, Musheg Arakelyan, Nariné Renard Karapetyan, Randall Bart, Richard Ishida, Simon Montagu (Mozilla, smontagu@smontagu.org)

特别感谢 Xidorn Quan 对该规范各个方面的广泛审查, 还要感谢 Simon Sapin 和 Håkon Wium Lie 对其审查意见的贡献。

隐私和安全考虑

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

符合性

文档约定

符合性要求通过描述性断言和 RFC 2119 术语的组合来表达。关键字 “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY” 和 “OPTIONAL” 在本文件的规范部分应按照 RFC 2119 中的说明解释。然而,为了可读性,这些词在本规范中并未全部以大写字母出现。

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

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

这是一个信息性示例。

信息性注释以“注”开头,并通过 class="note" 与规范性文本区分开来,例如:

注:这是一个信息性注释。

建议性部分是规范性部分,通过 <strong class="advisement"> 样式突出显示,例如: 用户代理必须提供一个可访问的替代方案。

符合性类别

本规范的符合性定义为三类:

样式表
CSS 样式表
渲染器
解释样式表语义并渲染使用样式表的文档的用户代理
创作工具
编写样式表的用户代理

如果样式表中使用的语法符合本模块的通用 CSS 语法和每个功能的单独语法,则该样式表符合本规范。

如果渲染器在解释样式表时支持本规范中定义的所有功能并正确解析它们,则该渲染器符合本规范。然而,由于设备限制导致用户代理无法正确渲染文档的情况不会使用户代理不符合规范。(例如,用户代理不需要在单色显示器上渲染颜色。)

如果创作工具编写的样式表语法正确,并符合本模块中描述的所有其他符合性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用向前兼容的解析规则来分配回退值,CSS 渲染器必须将不支持的 at-rule、属性、属性值、关键字和其他语法结构视为无效,并适当地忽略它们。特别是,用户代理不得选择性地忽略不支持的组件值并同时处理单个多值属性声明中的支持值:如果任何值被视为无效,CSS 规定应忽略整个声明。

不稳定和专有功能的实现

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

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现就变得可行,实施者应发布符合 CR 级别功能并根据规范正确实现的非前缀版本。

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

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

候选推荐退出标准

为了将本规范推进到建议推荐阶段,必须至少有两个独立的、可互操作的实现。每个功能可以由不同的产品实现,不要求所有功能都由单个产品实现。为了达到该标准,我们定义了以下术语:

独立
每个实现必须由不同方开发,不能共享、重用或派生自其他合格实现的代码。不影响本规范实现的代码部分不受此要求的限制。
可互操作
通过官方 CSS 测试套件中的相应测试用例,或在非 Web 浏览器实现的情况下,通过等效测试。每个相关测试都应该有一个等效测试,以便此类用户代理(UA)在声称互操作性时使用。如果要使用此类用户代理声称互操作性,则必须有一个或多个其他用户代理也能以相同方式通过这些等效测试以实现互操作性。这些等效测试必须公开提供以供同行评审。
实现
用户代理必须:
  1. 实现本规范。
  2. 向公众开放。该实现可以是发布的产品或其他公开版本(即测试版、预览版或“每夜构建版”)。非发布产品版本必须已实现该功能至少一个月,以证明其稳定性。
  3. 不是实验性的(即设计为通过测试套件的版本,并且不打算在未来正常使用)。

该规范将保持候选推荐阶段至少六个月。

索引

本规范定义的术语

由参考定义的术语

参考文献

规范性引用

[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS 级联和继承 第 5 级。 2021 年 6 月 8 日。 WD。 URL: https://www.w3.org/TR/css-cascade-5/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS 图像模块 第 3 级。2020 年 12 月 17 日。 CR。 URL: https://www.w3.org/TR/css-images-3/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS 列表和计数器模块 第 3 级。 2020 年 11 月 17 日。 WD。 URL: https://www.w3.org/TR/css-lists-3/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS 作用域模块 第 1 级。2014 年 4 月 3 日。 WD。 URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 语法模块 第 3 级。 2019 年 7 月 16 日。 CR。 URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS 文本模块 第 3 级。 2021 年 4 月 22 日。 CR。 URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS 文本装饰模块 第 4 级。2020 年 5 月 6 日。 WD。 URL: https://www.w3.org/TR/css-text-decor-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块 第 3 级。2019 年 6 月 6 日。 CR。 URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块 第 4 级。 2021 年 7 月 15 日。 WD。 URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS 书写模式 第 4 级。 2019 年 7 月 30 日。 CR。 URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos 等。级联样式表 第 2 级 修订 1 (CSS 2.1) 规范。 2011 年 6 月 7 日。 REC。 URL: https://www.w3.org/TR/CSS21/
[CSSOM-1]
Simon Pieters; Glenn Adams. CSS 对象模型 (CSSOM)。 2016 年 3 月 17 日。 WD。 URL: https://www.w3.org/TR/cssom-1/
[HTML]
Anne van Kesteren 等。HTML 标准。 现行标准。 URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola。基础设施标准。现行标准。 URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner。用于在 RFCs 中指示要求级别的关键词。1997 年 3 月。最佳现行做法。URL: https://datatracker.ietf.org/doc/html/rfc2119
[WebIDL]
Boris Zbarsky。Web IDL。2016 年 12 月 15 日。ED。 URL: https://heycam.github.io/webidl/

参考性引用

[CSS-CONTENT-3]
Elika Etemad; Dave Cramer。CSS 生成内容模块 第 3 级。2019 年 8 月 2 日。 WD。URL: https://www.w3.org/TR/css-content-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns。CSS 伪元素模块 第 4 级。2020 年 12 月 31 日。 WD。URL: https://www.w3.org/TR/css-pseudo-4/
[PREDEFINED-COUNTER-STYLES]
Richard Ishida。预定义计数样式。2021 年 6 月 9 日。 NOTE。URL: https://www.w3.org/TR/predefined-counter-styles/

属性索引

未定义属性。

@counter-style 描述符

名称 初始值
additive-symbols [ <integer [0,∞]> && <symbol> ]# n/a
fallback <counter-style-name> decimal
negative <symbol> <symbol>? "\2D" ("-" hyphen-minus)
pad <integer [0,∞]> && <symbol> 0 ""
prefix <symbol> "" (the empty string)
range [ [ <integer> | infinite ]{2} ]# | auto auto
speak-as auto | bullets | numbers | words | spell-out | <counter-style-name> auto
suffix <symbol> "\2E\20" ("." full stop followed by a space)
symbols <symbol>+ n/a
system cyclic | numeric | alphabetic | symbolic | additive | [fixed <integer>?] | [ extends <counter-style-name> ] symbolic

IDL 索引

partial interface CSSRule {
    const unsigned short COUNTER_STYLE_RULE = 11;
};

[Exposed=Window]
interface CSSCounterStyleRule : CSSRule {
  attribute CSSOMString name;
  attribute CSSOMString system;
  attribute CSSOMString symbols;
  attribute CSSOMString additiveSymbols;
  attribute CSSOMString negative;
  attribute CSSOMString prefix;
  attribute CSSOMString suffix;
  attribute CSSOMString range;
  attribute CSSOMString pad;
  attribute CSSOMString speakAs;
  attribute CSSOMString fallback;
};