type属性仅控制视觉编号样式,不改变语义;支持1、a、a、i、i五种值;嵌套列表须严格包裹于父内;复杂层级编号需用css计数器实现。

用 type 属性选编号类型,但别依赖它做语义控制
浏览器原生支持的 type 值只有 1、A、a、I、i 五种,对应阿拉伯数字、大/小写英文字母、大/小写罗马数字。它只是视觉提示,不改变语义顺序,也不影响屏幕阅读器对序列的理解。
常见误用是把 type="A" 当作“章节标题”语义使用——其实 <h2></h2> 才该承担这个角色,<ol></ol> 只负责表达“这是一组有先后关系的条目”。
-
type="1"是默认值,兼容性最好,适合通用步骤类内容 -
type="A"或type="a"仅建议用于二级及以下嵌套列表(如 A. → 1. → a.),且必须配合严格嵌套结构 -
type="I"在长列表中易混淆(如 I、II、III 和 L、C 等),慎用于超过 10 项的场景
嵌套时编号重置?检查是否违反 <li> 包裹规则
第二级列表从 A 开始而不是延续父级 B,根本原因不是 type 写错了,而是子 <ol></ol> 没放在父级 <li> 里。
错误写法会导致浏览器把子列表当成全新独立列表处理:
<ol type="A"> <li>第一项</li> </ol><ol type="1"> <!-- ❌ 孤立在外部 --><li>子项一</li> </ol>
正确结构必须让子 <ol></ol> 成为父 <li> 的直接子元素:
<ol type="A">
<li>第一项
<ol type="1">
<li>子项一</li>
<li>子项二</li>
</ol>
</li>
</ol>
需要更灵活编号(如 1.1、2.3.1)?绕过 type,用 CSS 计数器
type 属性无法生成带分隔符的层级编号(例如 “2.3.1”),此时必须放弃 HTML 原生 type,改用 CSS counter-reset + counter-increment + counters()。
关键点:
- 每个层级需独立命名计数器(如
section、subsection) -
counters()第二个参数指定分隔符,如counters(section, ".") - 必须为每层
<li>显式设置counter-increment,否则不会递增 - IE 不支持
counters(),如需兼容旧版,得回退到 JavaScript 动态注入编号
start 和 value 属性只接受整数,别指望它们配合字母或罗马数字
start="3" 在 <ol type="a"></ol> 中会让列表从 c. 开始,但这是浏览器按字母表位置推算的结果(a=1, b=2, c=3),不是真正“设起始字母”。同样,<li value="8"> 在 type="A" 下会显示 H.,但前提是浏览器能映射该数字到对应字母。
风险点:
- 超出范围(如
value="27")在不同浏览器表现不一致:Chrome 显示 AA.,Firefox 可能仍显示 A. -
start对type="i"(小写罗马数字)无效,多数浏览器忽略并回退到 1 - 这些属性无法与 CSS 计数器共存,一旦用了
counter-increment,start和value就被覆盖
真正可控的起点控制,只存在于 CSS 计数器的 counter-reset: section 2 这类写法里。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











