ol嵌套必须将子ol写在li内,否则计数器重置;type属性仅作用于本层,多层需显式声明;超三层应改用css counter实现,确保语义与可访问性。

ol 嵌套必须写在 li 里面,否则计数器重置
浏览器对 <ol></ol> 的计数器是“每遇到一个新 <ol></ol> 就重置”,不是按文档顺序连续编号。所以如果你把两个 <ol type="A"></ol> 并列写,第二组永远从 A 开始——哪怕它逻辑上该是 B。
真正起作用的嵌套,只有一种写法:子 <ol></ol> 必须作为父级 <li> 的直接子元素。
- ✅ 正确:
<ol type="A"> <li>A. 主项<ol type="1"><li>1. 子项</li></ol> </li> <li>B. 主项</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"></ol> 里的所有直接子 <li> 都用大写字母,但它的子 <ol></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> 的默认行为,不同浏览器处理不一致。比如 <ol type="i"></ol> 在 Chrome 可能渲染为 i., ii., iii.,但在 Safari 可能 fallback 到 1., 2., 3.。
- 如果需要四层及以上(如 A. → 1. → a. → i. → (1)),别依赖
type,改用 CSScounter - 关键三行:
counter-reset初始化,counter-increment自增,content: counters(...)拼接层级 - 例如:
<ol class="level-a"><li>...<ol class="level-1">...</ol> </li></ol>,再配对应 CSS 类
缩进和可访问性依赖结构,不是 CSS
屏幕阅读器靠 DOM 嵌套识别层级,<ol><li><ol><li></ol></li></ol> 会被读作“列表,1 项,子列表,1 项”。如果结构断开,它就变成两个平级列表,语义丢失。
- 不要用
margin-left模拟嵌套——那只是视觉欺骗,对辅助技术无效 - 避免把
<ol></ol>放进<p></p>或<div> 再塞进 <code><li>;必须是<li><ol>...</ol></li> - 嵌套超过三层后,人眼阅读已吃力,优先考虑是否真需要这么深——多数专业文档止步于三级(A. → 1. → a.)











