ol的start属性只接受整数,字符串或小数会被截断或退化为1;start="-2"或"0"合法,但type="a"时start="c"等非数字值无效;嵌套ol需严格包裹在li内,reversed和value会干扰start逻辑,复杂编号应使用css计数器。

ol 的 start 属性只认整数,别传字符串或小数
浏览器对 start 的值做严格类型判断:只接受整数,其余一律截断或退化为 1。写 start="5.8" 会变成 start="5";写 start="c" 或 start="" 则直接回退到默认的 start="1"。
常见错误是动态生成 HTML 时传入 JS 变量却没转类型:start={currentStart} 在 React 中若 currentStart 是字符串 "7" 还行,但要是 "7.0" 或 "7px" 就失效。建议显式用 Number(currentStart) 转换。
-
start="-2"合法,渲染为-2.、-1.、0. -
start="0"也合法,第一项显示0.(对type="1"有效;type="A"下部分浏览器映射为A.,属非标准行为,应避免) - 服务端渲染时若变量为空或
null,输出start="",等价于未声明,结果就是从 1 开始
type 和 start 不是“样式+起始字符”,而是“计数逻辑+映射规则”
type 不改计数,只改显示映射;start 永远指“这是第几个项”。比如 <ol type="a" start="3"></ol>,浏览器内部仍按阿拉伯数字计数:第 1 项对应序号 3 → 查字母表第 3 位 → 显示 c.,不是“从字母 c 开始排”。
所以这些写法全是错的:
-
<ol type="A" start="C"></ol>——start只收整数,"C"被忽略,回退到 1 -
<ol type="i" start="iv"></ol>—— 同样非法,start必须是4才能显示iv. -
<ol type="1" start="3"></ol>看似冗余,但语义清晰:明确声明“从 3 开始用阿拉伯数字”,比不写更可靠(尤其在 SSR 或框架中)
嵌套 ol 时,每层的 start 和 type 相互独立
外层 <ol start="10"></ol> 不会让内层自动从 10 开始。内层默认还是从 1 起,除非你显式给它设 start。而且,子 <ol></ol> 必须严格放在父级 <li> 里,否则就断开层级关系。
典型结构错误:
- 把子
<ol></ol>写在父<ol></ol>外面 → 它变成全新列表,编号重置为 1 - 子
<ol></ol>没包在<li>里 → 浏览器不识别嵌套,序号不继承 - 想实现 “3.1、3.2” 这类带前缀编号 → 单靠
start/type做不到,必须用 CSScounter-reset+counter-increment
reversed 和 value 会干扰 start 的预期行为
reversed 是布尔属性,启用后编号倒着减,但 DOM 顺序不变。比如 <ol start="5" reversed>
<li>A</li>
<li>B</li>
</ol> 渲染为 5. A、4. B,不是 5. B、4. A。焦点和读屏顺序仍是 A→B。
value 是 <li> 的属性,它覆盖当前项编号,并让后续项在此基础上 +1,彻底绕过 start 的初始设定:
-
<ol start="10"><li value="20">B</li></ol>→ 显示20. B,第三项若存在会是21. - 多个
value连续出现,后一个不继承前一个逻辑:<li value="5"> <li value="1">就真显示5.、1.,然后下一项是2. - 用
value补start的锅(比如编号乱了就挨个打补丁),会导致语义断裂,屏幕阅读器无法正确理解序列关系
真正需要跨列表连续编号、跳号或加章节前缀时,start 已经力不从心——这时候得切到 CSS 计数器,而不是硬塞 value 或反复调 start。











