ol嵌套必须写在li内,否则序号重置;type属性仅作用于本层且不继承;超三层嵌套应改用CSS counter或重构结构。

ol嵌套必须写在li里,否则序号重置
浏览器对<ol>的计数器是“每遇到一个新<ol>就重置”,不是按文档顺序连续编号。如果你把两个<ol type="A">并列写,第二组永远从 A 开始——哪怕它逻辑上该是 B。
真正起作用的嵌套,只有一种写法:子<ol>必须作为父级<li>的直接子元素。
- ✅ 正确:
<ol type="A"><li>A. 主项<ol type="1"><li>1. 子项</li></ol></li></ol> - ❌ 错误:
<ol type="A"><li>A. 主项</li></ol><ol type="A"><li>B. 主项</li></ol>(两个独立列表) - ⚠️ 即使
<li>内容为空,也得写<li><ol></ol></li>,否则结构非法
type属性只作用于本层,不继承也不级联
type是单层属性,<ol type="A">里的所有直接子<li>都用大写字母,但它的子<ol>必须自己声明type,否则回退到默认数字。
-
<ol type="A"><li>A. 章节<ol><li>1. 条款</li></ol></li></ol>→ 第二层显示为1.,不是A.1. - 要实现
A. → 1. → a.,就得三层都显式写:<ol type="A"><ol type="1"><ol type="a"></ol></ol></ol> -
type可选值包括:"1"、"a"、"A"、"i"、"I";大小写敏感,type="a"是小写,type="A"是大写
超过三层嵌套时,type属性不可靠
HTML规范没定义第四层<ol>的默认行为,不同浏览器处理不一致。比如<ol type="i">在 Chrome 可能渲染为 i.、ii.、iii.,但在 Safari 可能 fallback 到 1.、2.、3.。
立即学习“前端免费学习笔记(深入)”;
- 需要四层及以上(如
A. → 1. → a. → i. → (1)),别依赖type,改用 CSScounter - CSS关键三行:
counter-reset初始化,counter-increment自增,content: counters()拼接层级 - 缩进和可访问性依赖 DOM 嵌套结构,不是 CSS;用
margin-left模拟嵌套只是视觉欺骗,对屏幕阅读器无效
嵌套层级超过三层就该重新评估结构合理性
人眼阅读已吃力,多数专业文档止步于三级(A. → 1. → a.)。如果业务上真需要更深编号,优先考虑是否该用<details>折叠、JS 树形控件,或拆分文档章节。
最容易被忽略的是:屏幕阅读器靠 DOM 嵌套识别层级,<ol><ol></ol></ol>会被读作“列表,1 项,子列表,1 项”;一旦结构断开,它就变成两个平级列表,语义彻底丢失。



















