子列表必须严格嵌套在内部,浏览器仅识别“子是某个的直接子元素”这一结构;若置于外或用/包裹,将导致编号重置、语义失效、屏幕阅读器无法识别层级。

嵌套必须严格在 <li> 内部进行
浏览器只认「子 <ol></ol> 是某个 <li> 的直接子元素」这个结构。把 <ol></ol> 放在 <li> 外面、或者用 <p></p> 包一层再放进去,编号就断了,语义也失效。
常见错误现象包括:第二级突然从 1. 重新开始、字母变成 a. 后又跳回 A.、屏幕阅读器读不出层级、CSS 缩进消失。
- 子
<ol></ol>必须写在<li>开始标签和结束标签之间,不能跨行空出文本节点 - 不要用
<div> 或 <code><p></p>包裹子列表——它们不是合法的<li>子元素 - 如果内容有多段文字 + 子列表,全部放在同一个
<li>里,顺序书写即可 - 第三级想用小写字母加点(a.),就得写
<ol type="a"></ol>,不能省略 -
type不解决跨章节连续编号问题——比如 A. 后要接 B.,必须靠嵌套位置保证,不是靠 type 值“记住”上一个 - 旧版 IE 对
type支持有限,如需兼容,优先用 CSS counters 替代 - 如果外层是
<ol type="A" start="3"></ol>,首项显示为 C.,不是 A. - 子
<ol></ol>的start和父级无关,比如父级是 A.,子级写start="2"就从 2. 开始,不是从 B. 推导 -
start值必须是整数(对type="1")或可映射字符(如start="C"对type="A"有效,但非所有浏览器都支持字母 start) - 修复方法很简单:加一句
ol ol { margin-left: 1.5em; },比依赖浏览器默认更可靠 - 避免用
list-style-position: inside——它会让编号挤进文字区,视觉上反而像没缩进 - 如果父容器用了
display: flex或grid,<ol></ol>会失去块级流行为,缩进逻辑失效,此时需显式设display: block
type 属性控制每层编号样式,但不自动继承
type 只影响当前 <ol></ol>,不会向上或向下传递。比如外层设 type="A",内层仍需显式写 type="1",否则默认是数字 1.,不是你想的 B. 或 2.。
可用值有:"1"(阿拉伯数字)、"A"(大写字母)、"a"(小写字母)、"I"(大写罗马)、"i"(小写罗马)。注意大小写敏感,type="a" 和 type="A" 效果不同。
start 属性只作用于当前 <ol></ol>,不能跳过父级计数
start="34" 是让这一层 <ol></ol> 从 34 开始编号,它不管外面有没有 A. 或 1.。也就是说,start 是局部起始值,不是全局偏移量。
典型使用场景是法规条款(如第 34 条起)、附录编号(Appendix A 起)、或接续前文未闭合的列表。
缩进和样式失效,大概率是 CSS 干扰了默认流布局
嵌套本身不依赖 CSS 就能渲染出层级缩进,但一旦项目里用了通用重置(如 * { margin: 0; padding: 0; }),<ol></ol> 默认的 margin-left 就没了,看起来像“没嵌套”。
这不是 HTML 写错了,而是样式被吃掉了。
嵌套层级越深,越容易因一个空格、一次误删换行、或一条全局 margin 重置而崩掉视觉和语义。真正难的不是写对第一层,而是确保每一层的 <li> 都干净闭合、子 <ol></ol> 都紧贴其后、没有看不见的文本节点卡在中间。











