正确嵌套ol必须让子ol作为父li的直接子节点,否则编号重置;DOM结构违法导致浏览器将其视为新列表,而非延续上层编号。

ol子列表脱离父li导致编号重置
浏览器把没包在<li>里的<ol></ol>当全新列表,所以第二层永远从A开始,而不是接上一层的B。这不是bug,是DOM结构违法的直接结果。
常见错误写法:<ol type="A"><li>A. Item</li></ol><ol type="1"><li>1. Sub</li></ol>(两个并列<ol></ol>,中间没<li>包裹)
- 正确嵌套必须是:
<ol type="A"><li>A. Item<ol type="1"><li>1. Sub</li></ol> </li></ol> - 用开发者工具检查:子
<ol></ol>节点是否为父<li>的**直接子节点**;如果不是,语义已断裂 - 别指望
list-style-type能“延续”编号——它只改符号,不改计数逻辑
用了position: fixed让所有ol堆叠显示
如果嵌套<ol></ol>项挤在同一垂直位置,看着像编号错乱,实际是CSS布局失控。根本原因是给<ol></ol>加了position: fixed,让它脱离文档流,所有层级都定位到top: 0; left: 0。
- 立刻移除
ol { position: fixed; },改用正常块级流布局 -
counter-reset: item不能只写在顶层<ol></ol>上——每个<ol></ol>都该有自己独立的counter-reset - 若需自定义编号(如
1.2.1),用counter-increment+::before,但前提是DOM结构合法
start属性写了却没生效的真因
start属性本身没问题,但常被其他因素掩盖。它只控制编号起始值,不负责渲染可见性。
- 检查是否误加了
list-style: none或display: flex——序号还在计算,只是被隐藏了 -
start="5"配合type="a"时,显示的是第5个字母(即e.),不是数字5.;别混用类型和数值预期 - 服务端渲染时
start=""或start={null}会退化为默认1,务必确保输出的是整数字符串 - 动态JS赋值
ol.start = 100有效,但新增<li>会基于当前项数继续递增,不会重置为100、101、102…
超过三层嵌套时编号与可访问性双崩坏
DOM允许无限嵌套,但现实里三层以上就出问题:屏幕阅读器播报混乱、键盘导航跳过中间层、缩进叠加导致文字严重右偏。
立即学习“前端免费学习笔记(深入)”;
- 法律/医疗类强结构文档,建议用CSS
counter-reset/counter-increment实现A.1.a样式,但DOM层级严格限制为3层 - 分类树(如“编程 > 前端 > HTML > 列表”)不该用
<ol></ol>嵌套——这是无序关系,该用<ul></ul>或<nav></nav>+role="tree" - 每个
<li>必须含非空文本;空<li>会让辅助技术跳过整个分支 - 最易忽略的是:你用
<ol></ol>嵌套,并不等于内容天然有序——调换项序是否改变含义?不是,就该换标签



















