reversed是原生布尔属性,用于倒序编号,但浏览器支持不一:chrome/edge(v80+)稳定,firefox依赖start推算,safari≤16.4忽略;它静态不可变,真倒计时须用js更新textcontent。

检查reversed是否被浏览器识别为有效属性
直接读取 DOM 的 reversed 属性值不可靠——比如 Safari 16.4 及更早版本会返回 true(因属性存在),但渲染时完全忽略;Chrome 则返回 true 且生效。真正判断是否“可用”,得看它是否影响了编号行为。
推荐用运行时检测:创建一个临时 <ol reversed start="3">
<li>A</li>
<li>B</li>
</ol>,插入文档后读取第一个 <li> 的 getComputedStyle 或伪元素内容,再比对是否显示为 "3." 而非 "1."。不要依赖 ol.reversed === true 这种表面判断。
动态列表中reversed失效的典型表现
常见现象包括:<ol reversed></ol> 在 JS 动态添加新 <li> 后,新增项编号变成 1. 或跳号(如原为 4. 3. 2. 1.,插入后变 4. 3. 2. 1. 5.);或某个 <li value="7"> 出现后,后续所有编号脱离 reversed 控制,开始递增。
-
reversed对带value属性的<li>完全无效,一旦出现,整条链断裂 - 浏览器不会自动重算
start,必须手动调用ol.setAttribute('start', ol.children.length) - 若用
innerHTML += '<li>X</li>',旧节点被销毁,计数器重置,reversed彻底失能
IE 和旧 Safari 下的兜底方案选择
IE 全系(含 IE11)不支持 reversed,Safari ≤16.4 也忽略该属性。此时不能只加 CSS 或 polyfill,而要分层应对:
- 服务端渲染场景:直接输出反序的 HTML(如数组先
.reverse()再生成<ol></ol>),最稳妥 - 纯前端场景:用
counter-reset+::before模拟,但需提前知道总项数,否则得 JS 注入counter-reset: item N - 需要 DOM 顺序真实反转时:用
while (ol.lastElementChild) ol.prepend(ol.lastElementChild),避免 IE 不支持prepend()的问题,可 fallback 到insertBefore(child, ol.firstElementChild)
为什么reversed在可访问性测试里常被标为“语义错误”
屏幕阅读器仍按原始 DOM 顺序朗读,而编号却是倒着的(例如 DOM 是 A→B→C,视觉编号是 3. A / 2. B / 1. C)。用户听到“第三项 A”,实际焦点在第一个位置,操作预期与播报严重错位。
这不是样式问题,是语义断裂。如果列表承载步骤、日志优先级或法律条款编号,reversed 就不该用——此时必须让数据源本身倒序,再生成 <ol></ol>。最容易被忽略的一点是:当编号用于交互锚点(如 <a href="#step-3"></a>)时,reversed 会让链接指向错误的语义位置,而非视觉位置。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











