嵌套多级有序列表必须将子置于内部,否则编号重置、语义断裂;type仅控制本层样式,跨层编号需css counter()实现;start指定起始值,表格内嵌套会破坏计数上下文。

嵌套多级内容到 <ol></ol> 里不是“能不能”的问题,而是“结构对不对”的问题——浏览器只认嵌套在 <li> 内部的子 <ol></ol>,其他写法都会导致编号重置、语义断裂或可访问性失效。
子 <ol></ol> 必须写在 <li> 里面,不能写在 外面
这是最常踩的坑:把第二级列表放在父 <ol></ol> 结束标签之后,看起来层级分明,实际是两个独立列表。
常见错误现象:A. 后面出现另一个 A.(而不是 B.),或第二级始终从 1. 开始,无法延续上一级上下文。
- ✅ 正确位置:
<li>主条款内容<ol type="1"><li>子项</li></ol> </li> - ❌ 错误位置:
- ...
<li>)
<ol></ol> 只能是 <li> 的**直接子元素**,不是 <ol></ol> 的子元素<li>,确认子 <ol></ol> 是否真正在其内部,而非同级节点
type 属性只控制本层编号样式,不继承也不联动
type="A"、type="1"、type="a" 这些值只决定当前 <ol></ol> 的计数形式,不会自动读取父级序号或拼接前缀(比如 A.1 或 1.a)。想实现「A. → 1. → a.」这种视觉效果,靠的是三层独立但嵌套正确的 <ol></ol>。
- 第一级:
<ol type="A"></ol> - 第二级:
<ol type="1"></ol>(必须嵌在某个<li>里) - 第三级:
<ol type="a"></ol>(再嵌在第二级的某个<li>里) - 不要指望
type="A1"或类似组合写法——HTML 不支持 - 如果需要带点号的复合编号(如
2.3.1),必须用 CSScounter()实现,type无法满足
跨章节连续编号要用 start,别靠手动写数字
当主列表要从 34 开始(比如规则第 34 条),不能在 <li> 里硬写 34. 内容。那样既丧失语义,又让后续编号无法自动递增。
- ✅ 正确做法:
<ol start="34"></ol>,浏览器会自动渲染为34.、35.、36. - 子
<ol></ol>不受父级start影响,它仍从 1 开始(除非也设start) - 若某条主条款下有多个子
<ol></ol>(比如分两段列出不同子项),每段都需单独包裹在对应<li>中,否则会被识别为同一组 - 避免用
<p></p>替代<li>:写了<p>34. 内容</p>就等于放弃所有列表语义和自动编号能力
表格里塞 <ol></ol> 嵌套?别试了
<table> 是二维网格容器,而 <code><ol></ol> 嵌套依赖严格的父子流式结构。一旦把多级 <ol></ol> 塞进 <td>,计数器上下文就断了。
<ul>
<li>现象:第二级突然从 <code>A. 重来,或编号错位、换行失控
<td> 会重置 CSS 流和计数器作用域,浏览器无法追踪嵌套层级
<li>替代方案:用 <code><div> + CSS Grid/Flex 模拟表格布局,保留 <code><ol></ol> 原生嵌套结构
counter() 控制,绕过 type 和 start
真正卡住人的从来不是语法有多难,而是浏览器只按 HTML 规范解析嵌套关系——哪怕多一个空格、换一行、错一层标签,它就认定“这不是子列表”,立刻重置计数。验证前先看 DOM 树,别信视觉缩进。











