ol 必须只包含 li 元素,所有条款需包裹在 li 内;子列表必须嵌套于父 li 中;start 和 type 属性应优先用于编号控制,确保语义正确与辅助技术兼容。

ol 必须只包含 li,不能直接塞 p 或 div
浏览器和屏幕阅读器依赖 ol 的子元素必须是 li 这一结构规则。一旦你在 ol 里直接写 <p>第34条...</p>,就等于告诉辅助技术“这是一段普通文字”,编号逻辑、层级关系、键盘导航顺序全部失效。
常见错误现象包括:编号突然中断、子列表不缩进、用 VoiceOver 或 NVDA 朗读时跳过序号、CSS 的 counter-increment 失效。
- 所有主干条款必须包裹在
li标签内,哪怕内容很长、含多段文字 -
li内部可以嵌套任意合法 HTML(p、strong、ol、ul等),但ol自身不能跳过li - 不要用
div模拟列表项——它没有语义,也不参与浏览器默认的列表计数流程
嵌套子列表必须完整放在某个 li 内部
子 ol 或 ul 不是独立存在的,它必须是父级 li 的后代,否则会被当作“悬空列表”,脱离上下文语义。比如第三条规则下有四点细则,那整个 <ol type="a">...</ol> 就得写在第三条对应的 li 里面,而不是紧贴着 ol 标签平级放置。
- 错误写法:
ol→li→ 文字,然后另起一行写ol type="a"(脱离父li) - 正确写法:
ol→li→ 文字 +ol type="a"(子ol是该li的子节点) - 这种嵌套关系直接影响 CSS 选择器作用域,例如
ol > li ol才能精准命中子列表,而ol ol会误选到非嵌套结构
start 属性控制起始编号,但仅对外层 ol 有效
如果你需要从 34 开始编号,直接给外层 ol 加 start="34" 即可,浏览器会自动递增为 35、36……不需要手动写数字或用 CSS 伪元素模拟。
-
start只作用于当前ol元素,对嵌套的子ol无影响;子列表编号重置,需单独设start或靠type切换格式 - 避免混用
start和 CSScounter-reset,两者逻辑冲突时后者可能覆盖前者 - 若起始编号是变量(如 CMS 输出),确保服务端或 JS 注入时
start值为纯数字,字符串如"34"在部分旧浏览器中可能不生效
type 属性够用就别动 CSS list-style-type
type="a"、type="i" 这些原生属性足够覆盖大多数场景,且兼容性比 CSS 的 list-style-type: lower-alpha 更稳(尤其在邮件模板或老旧 WebView 中)。
- 优先使用 HTML 属性而非 CSS 控制编号类型,减少样式层与结构层耦合
-
type不支持自定义前缀(如 “Step 1.”),此时才考虑 CSS counters,但要额外处理嵌套层级的counter-reset - 移除默认序号用
list-style: none即可,别用list-style-type: none——后者不是标准值,无效
ol 就算完事”,而是整棵树的父子关系是否经得起 DOM 解析器和辅助技术的检验。一个错位的 li、一段漏掉的嵌套,都会让编号变成纯装饰,失去机器可读性。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











