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

为什么<ol>嵌套后第二级总是从1开始?
因为浏览器把没嵌在<li>里的<ol>当成全新列表,自动重置计数器。常见错误是把子<ol>写在父</li>外面,比如:
<ol type="A"> <li>A. First item</li> </ol> <ol type="1"> <!-- ❌ 这里脱离了上一个 <li>,浏览器当新列表 --> <li>1. Sub-item</li> </ol>
正确结构必须让子<ol>成为某个<li>的直接子内容,否则语义断裂,编号必然中断。
start属性怎么配合type让编号接续?
start只管“从第几个数开始”,它本身不识别字母或罗马数字——真正起作用的是type和start的组合逻辑。比如想让第二级从“3.”开始,就写<ol type="1" start="3">;想让第三级从“d.”开始,得算清字母顺序:d是第4个,所以用<ol type="a" start="4">。
-
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>实现连续编号可行吗?
纯HTML做不到。<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>都在<li>内,不依赖JS干预编号逻辑。



















