当有反重置声明时,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 正在跟踪:
- 一个共享列表标记计数器,当它同时命中第一层 LI 和嵌套在其中的任何 LI 时都会递增。
- "some-counter" 的计数器实例,仅适用于外部列表
- 仅适用于任何内部列表的 "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>
通常当 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 正在跟踪:
- 一个共享列表标记计数器,当它同时命中第一层 LI 和嵌套在其中的任何 LI 时都会递增。
- "some-counter" 的计数器实例,仅适用于外部列表
- 仅适用于任何内部列表的 "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>