当有反重置声明时,Firefox 是否通过其对 LI 标记的奇怪累积应用来违反规范?

Is Firefox violating spec by its odd cumulative application of counting to LI markers when there's a counter-reset declaration?

通常当 CSS 计数器用于列表时,the OL list-style-type is set to none and and ::before pseudo-elements are used instead of true list markers

但是,我注意到在 Firefox 中(69.0、target:x86_64-apple-darwin、运行 在 MacOS Mojave 中)计数器重置的存在对实际情况有些奇怪列出标记。考虑:

ol {counter-reset: some-counter;}
li::before {
  content: "Marker should be: " counter(some-counter) ".";
  counter-increment: some-counter;
}

ol.alpha {list-style-type:lower-alpha;}
ol.alpha > li::before{content: "Marker should be: " counter(some-counter, lower-alpha) ".";}
<h2>List A</h2>
<ol>
  <li>
    <ol>
      <li></li>
      <li></li>
      <li></li>
    </ol>
  </li>
  <li>
    <ol>
      <li></li>
      <li></li>
      <li></li>
    </ol>
  </li>
</ol>

<h2>List B</h2>
<ol>
  <li>
    <ol class="alpha">
      <li></li>
      <li></li>
      <li></li>
    </ol>
  </li>
  <li>
    <ol class="alpha">
      <li style="counter-reset: some-counter"></li>
      <li></li>
      <li></li>
    </ol>
  </li>
</ol>

Chrome 和 Safari 按预期呈现,但在 FF 中,列表 A 呈现为:

列表 B 呈现为:

换句话说,当遍历两级列表时,FF 正在跟踪:

  1. 一个共享列表标记计数器,当它同时命中第一层 LI 和嵌套在其中的任何 LI 时都会递增。
  2. "some-counter" 的计数器实例,仅适用于外部列表
  3. 仅适用于任何内部列表的 "some-counter" 的计数器实例

FF 的列表标记显示共享计数器(带有任何必要的翻译,例如上面列表 B 中的低字母),而 ::before 伪元素显示适合其级别的 "some-counter" 实例。

如果您注释掉计数器重置,FF 将返回其标记中的预期行为。 (即使设置 "counter-reset:none" 仍然会导致奇怪的行为。)

这是一个错误,还是有某种原因导致在将计数器重置(甚至 counter-reset:none;)应用于顶级 <ol> 时列表标记中会出现未定义的行为?

这是intentional, pending a spec clarification. (This behavior was implemented for Firefox 68。)

Firefox 允许您的 ol {counter-reset: some-counter} 规则覆盖内置 UA 样式 ol {counter-reset: list-item},删除 ol wrt 列表编号的任何特殊含义。如错误中所述,您可以指定两个计数器 (ol {counter-reset: some-counter list-item;}) 来修复此问题。

ol {counter-reset: some-counter list-item;}
li::before {
  content: "Marker should be: " counter(some-counter) ".";
  counter-increment: some-counter;
}

ol.alpha {list-style-type:lower-alpha;}
ol.alpha > li::before{content: "Marker should be: " counter(some-counter, lower-alpha) ".";}
<h2>List A</h2>
<ol>
  <li>
    <ol>
      <li></li>
      <li></li>
      <li></li>
    </ol>
  </li>
  <li>
    <ol>
      <li></li>
      <li></li>
      <li></li>
    </ol>
  </li>
</ol>

<h2>List B</h2>
<ol>
  <li>
    <ol class="alpha">
      <li></li>
      <li></li>
      <li></li>
    </ol>
  </li>
  <li>
    <ol class="alpha">
      <li style="counter-reset: some-counter"></li>
      <li></li>
      <li></li>
    </ol>
  </li>
</ol>