因为浏览器将未嵌套在内的视为独立列表而重置计数器;正确结构要求子必须作为父级的直接子元素,否则语义断裂导致编号中断。

为什么<ol></ol>嵌套后第二级总是从1开始?
因为浏览器把没嵌在<li>里的<ol></ol>当成全新列表,自动重置计数器。常见错误是把子<ol></ol>写在父外面,比如:
<ol type="A"> <li>A. First item</li> </ol><ol type="1"> <!-- ❌ 这里脱离了上一个 <li>,浏览器当新列表 --><li>1. Sub-item</li> </ol>
正确结构必须让子<ol></ol>成为某个<li>的直接子内容,否则语义断裂,编号必然中断。
start属性怎么配合type让编号接续?
start只管“从第几个数开始”,它本身不识别字母或罗马数字——真正起作用的是type和start的组合逻辑。比如想让第二级从“3.”开始,就写<ol type="1" start="3"></ol>;想让第三级从“d.”开始,得算清字母顺序:d是第4个,所以用<ol type="a" start="4"></ol>。
-
start="5"+type="A"→ 显示E.(不是“第5个大写字母”的直觉,而是按A=1、B=2…推导) -
start值必须是整数,start="c"或start="5.2"会被静默转成1或5 - 如果父级最后一项是
B.,下一项要显示C.,只需确保第二个<li>紧跟在第一个闭合之后,且仍属于外层<ol></ol>——不用手动设start
跨多个独立<ol></ol>实现连续编号可行吗?
纯HTML做不到。<ol></ol>之间没有状态继承,每个都是孤立计数器。你看到的“连续”效果,本质是靠严格嵌套达成的视觉连贯,不是跨标签同步。
若真需物理分离(比如中间插了段落、标题或组件),只能放弃原生<ol></ol>,改用CSS counter-reset/counter-increment手动维护计数器,或者用JS遍历可见<li>动态更新value属性——但后者会破坏语义和可访问性,仅限特定交互场景。
容易被忽略的兼容性细节
旧版IE对type属性支持有限,type="i"或type="a"可能退化为数字;start在所有现代浏览器中稳定,但若通过JS动态修改ol.start,屏幕阅读器可能不会及时播报新编号——这不是样式问题,是DOM与AT(辅助技术)同步延迟。
最稳妥的做法:用嵌套+type+start组合,确保每个子<ol></ol>都在<li>内,不依赖JS干预编号逻辑。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











