type="i"是HTML中表示小写罗马数字的唯一合法值,type="lower-roman"无效;start属性必须为阿拉伯数字整数,如start="5"对应"v";嵌套列表须严格置于<li>内,超3999项行为未定义。

type="i" 是唯一合法写法,别写 type="lower-roman"
浏览器只认 type="i" 表示小写罗马数字,type="lower-roman" 在 HTML5 中完全无效,会直接回退到默认阿拉伯数字。这个错误在 CSS 和 HTML 混用时特别常见——CSS 里确实有 list-style-type: lower-roman,但 HTML 的 type 属性不支持这种值。
常见错误现象:<ol type="lower-roman"><li>第一项</li></ol> 渲染出来是 “1. 第一项”,不是 “i. 第一项”。
-
type="i"→ i, ii, iii, iv, v…(小写) -
type="I"→ I, II, III, IV, V…(大写) - 不要混用大小写逻辑:比如
type="i"和type="I"是两套独立序列,不能靠改大小写来“切换风格”
start 属性必须用阿拉伯数字,哪怕编号是罗马字
想让列表从 “v” 开始?不能写 start="v",必须写 start="5"。HTML 规范强制要求 start 值为整数,浏览器再根据当前 type 把它转成对应形式。
例如:<ol type="i" start="5"><li>内容</li></ol> 渲染为 “v. 内容”,而不是 “5. 内容”。漏掉 start 就只能从 i 开始,无法对齐文档结构。
立即学习“前端免费学习笔记(深入)”;
- 嵌套时子
<ol>的start也得用阿拉伯数字,比如第二级想从 “ii” 起,就写start="2" -
start影响后续所有项,包括嵌套里的子项,除非子项显式重置 - IE 和现代浏览器都遵守这一规则,无需兼容性妥协
嵌套列表必须严格放在 <li> 里,否则计数重置
小写罗马数字嵌套在大写字母下(如 A. → i. → a.),最容易出错的是 DOM 结构。如果把子 <ol> 放在父 <ol> 外面,或者插在两个 <li> 之间,浏览器会把它当全新列表处理,计数立刻重置为 i。
正确结构必须是:子 <ol> 是某个 <li> 的直接子元素。
- ✅ 正确:
<li>A. 主项<ol type="i"><li>i. 子项</li></ol></li> - ❌ 错误:
</li><ol type="i"><li>i. 子项</li></ol><li>B. 主项</li> - 小写罗马数字层级一旦脱离父
<li>,就失去上下文,无法延续或对齐上层编号逻辑
超过 3999 项时,type="i" 行为未定义
type="i" 在规范中只保证对 1–3999(即 MMMCMXCIX)范围内的数字有明确定义。超出后,不同浏览器可能显示为空、重复、乱码,甚至崩溃渲染。实际项目中几乎不会遇到,但若生成长目录或动态数据列表,得留意项数。
这不是 bug,是 HTML 标准的明确限制。如果你真需要超长罗马编号,必须用 CSS 计数器 + counter() 函数手动实现,而非依赖原生 type。
- 常规文档、章节、法规条目基本都在 100 项以内,
type="i"安全可用 - 自动构建的列表(如 CMS 输出)建议加项数校验,>100 时主动警告或降级为数字
- 别指望
type="i"支持负数、小数、零或非整数起始值



















