嵌套ol必须将子ol置于li内部,否则编号重置;type属性仅控制符号不继承计数;多层缩进用padding-left调整,禁用text-indent;超三层嵌套损害可访问性,建议限3层或改用CSS counter。

ol 嵌套不是“加个标签就行”,关键在于子列表是否被包在 li 里——没包,编号就重置;包了,浏览器才认它是“同一段逻辑的延续”。
嵌套必须写在 li 内部,不能并列放在 ol 外面
常见错误是把两个 ol 并排写,比如:
<ol type="A"> <li>A. 主条款</li> </ol> <ol type="1"> <!-- ❌ 独立新列表,永远从 1 开始 --> <li>1. 子条款</li> </ol>
这样第二级永远是 1.,不会接在 A. 后面变成 B.。正确写法是:
- 所有子
ol必须作为某个li的直接子内容 - 父
li可以包含文本、strong、p、甚至div,但子ol得在它里面 - 用开发者工具检查 DOM:确认子
ol是li的第一层子节点,而不是ol的兄弟节点
type 属性只控制符号,不控制计数连续性
设 <ol type="A"> 和里面嵌的 <ol type="1">,后者永远从 1 开始,哪怕上一级已到 Z.——这是规范行为,不是 bug。
立即学习“前端免费学习笔记(深入)”;
-
type="A"、type="a"、type="1"都只改显示字符,不影响计数器继承 - 想实现「A.1.a」这种跨层级拼接编号,得用 CSS
counter-reset/counter-increment+::before - 纯 HTML 场景下,接受“每层独立编号”是合理预期;强行用 CSS counter 时,注意 IE11 不支持
counter-set
多层嵌套后缩进失控?别碰 text-indent
嵌套三层后列表明显右偏,不是结构错了,是浏览器默认给每个 ol 加了 padding-left: 40px,层层叠加导致。
- 修复方式统一用:
ol ol, ol ul, ul ul { padding-left: 20px; margin-left: 0; } - 绝对不要用
text-indent:它只缩进首行,多行li内容会文字错位 - 如果用了
normalize.css或其他 reset,先查它是否覆盖了ol的padding,再针对性覆盖
超过三层嵌套时,语义和可访问性快速下降
HTML 允许无限嵌套,但屏幕阅读器对 >3 层的 ol 嵌套常播报混乱,键盘用户按 ↓ 键也容易跳过中间层级。
- 医疗/法律类文档建议限制 DOM 层级为 3 层(如 A. → 1. → a.),更深层用 CSS counter 模拟视觉效果,而非真实嵌套
- 若实际需要“分类 > 子类 > 标签”这类无序关系,该换
ul,甚至考虑dl或语义化section+h3 - 空
li会导致辅助技术跳过整段结构,每个li至少含可见文本或aria-label
最常被忽略的,是把“有顺序”和“有层级”混为一谈:嵌套 ol 表达的是“主步骤→子步骤→操作细则”这样的执行序列;如果只是“大类→小类→实例”,那它本质是分类关系,不该用 ol 强套。



















