HTML有序列表编号由浏览器按DOM结构机械计算,ol必须仅含li元素,start和reversed有明确边界,嵌套需严格置于li内,CSS list-style-type比type属性更可靠。

HTML 有序列表的编号不是“自动聪明地延续”,而是由浏览器按 DOM 结构和属性规则机械计算出来的。理解这点,才能避开重置、错位、IE 兼容失效等常见问题。
ol 必须只包含 li,否则编号直接消失
浏览器对 <ol> 的子元素有严格限制:只接受 <li>(以及 <script>、<template> 等极少数例外)。任何其他标签或纯文本塞进 <ol> 都会被忽略,且不报错——结果就是编号不显示,看着像“列表失效”。
-
<ol><p>第一项</p></ol>→ 编号不会出现,<p>被丢弃 -
<ol>第一项</ol>→ 纯文本被忽略,列表空渲染 - 正确写法只能是:
<ol><li>第一项</li></ol>
start 和 reversed 的行为边界很明确
start 只控制视觉起始值,不影响语义顺序;reversed 只对 type="1"(默认 decimal)生效,设了 type="a" 就失效。
-
start值必须为整数,start="-2"或start="3.5"都退化为start="1" -
reversed和start可共存:<ol reversed start="10">渲染为 10、9、8… - IE11 及更早版本完全不支持
start和reversed,需降级处理或用 CSS 计数器替代
嵌套时编号重置,根本原因是结构写错了
多级列表(如 A. → 1. → a.)编号中断,99% 是因为子 <ol> 没写在父级 <li> 里面,而是放在了父 <ol> 外部——这会让浏览器认为是两个独立列表,各自从 1 开始计数。
立即学习“前端免费学习笔记(深入)”;
- ❌ 错误:
<ol type="A"><li>A.</li></ol><ol><li>1.</li></ol>→ 第二个<ol>是新列表 - ✅ 正确:
<ol type="A"><li>A.<ol><li>1.</li></ol></li></ol>→ 子<ol>是<li>的内容 - 所有子列表都必须作为
<li>的后代存在,不能脱离父<ol>的 DOM 范围
CSS list-style-type 比 HTML type 属性更可靠
type 属性支持的值少(仅 5 种),且 Safari 对 type="I" 兼容性弱;而 CSS 的 list-style-type 支持更多值(如 lower-greek)、可继承、可响应式切换,还兼容旧浏览器。
- 推荐写法:
<ol style="list-style-type: upper-alpha;">,而非<ol type="A"> -
list-style-type: lower-roman在长列表中比type="i"更稳定,尤其在移动端 - 若需跨层级连续计数(如 1.1, 1.2, 2.1),必须用 CSS
counter-reset/counter-increment,HTML 原生属性做不到
最常被忽略的一点:编号是否连续,不取决于你写了多少个 type 或 start,而取决于 DOM 是否真正嵌套、<li> 是否完整闭合、以及目标浏览器是否支持对应属性——结构永远比样式优先。



















