计数器和列表样式

许多类型的内容最好以 HTML 列表的形式呈现。对于有序列表内容(例如食谱步骤或文章脚注),标记通常也包含信息。CSS 提供了多种方式来控制列表中的计数器。

列出样式

预定义的列表样式类型有很多,支持数字、字母、罗马数字和许多国际计数系统。

除了浏览器支持的样式之外,W3C 还发布了现成的计数器样式,支持 45 种书写系统中的 181 种其他样式。

如果这些选项不符合您的需求,您还可以定义自定义 @counter-style。这样一来,您就可以指定自定义符号、前缀和后缀等。

默认情况下,项目标记是列表中的 outside,位于列表前面,并靠右对齐。您还可以使用 list-style-position: inside 将项目标记放置在列表内。

计数器

列表样式用于控制列表项标记的显示方式,而计数器则用于控制要显示的值。对于 <li> 列表项元素,浏览器会创建一个名为 list-item 的计数器,每遇到一个列表项,该计数器就会递增 1。

CSS 计数器会持续统计设置了相应 counter-increment 值的元素被渲染的次数。

如需创建新计数器,请使用 counter-reset 并指定计数器名称和可选的初始值。您通常会在包含所有要统计的元素的父元素上设置此属性。

然后,在要统计的每个元素上添加 counter-increment 属性。

最后,使用 counter() 函数显示计数器值。

在此示例中,我们希望将脚注的运行计数显示为每个脚注的链接文字。由于我们希望整个文档使用一个计数器,因此我们在正文上设置 counter-reset: note,并在每个脚注链接上递增。

您还可以设置多个计数器来统计不同的项目。在脚注示例中,如果您想显示脚注所在的部分和段落的索引,该怎么办?

可以使用 counter-reset 在正文中创建部分计数,然后在每个 <h2> 元素上递增。我们希望每个部分的段落数都重置,因此我们将在 <h2> 元素上使用 counter-reset,并在 <p> 元素上使用增量。

最后,我们将 content 属性中的计数器值合并。

a:after {
  content: "(S" counter(section) "P" counter(paragraph) "N" counter(note) ")";
  font-size: small;
  vertical-align: super;
}

嵌套计数器

将一个列表嵌套在另一个列表中会发生什么情况?系统会为每个 <ul><ol> 元素初始化 list-item 计数器,而使用 counter() 只会返回最内层计数的值。如果您想显示每个嵌套计数器的数量,请使用 counters() 函数,该函数接受计数器名称和分隔符。

li::marker {
  content: counters(list-item, ".")
  }

反向计数器

默认情况下,计数器(包括 <ol> 元素的隐式 list-item 计数器)从 0 开始,并为每个元素递增 1,这意味着第一个元素将计为 1。如果您想倒数到 1,该怎么办?

为此,请将 reversed 属性添加到 <ol>。如果您使用的是标准列表样式,标记将按预期工作。不过,如果您使用的是自定义计数器,则需要将 counter-increment 设置为负值,并手动计算计数器的起始值。