HTML规范强制要求ol内所有内容必须包裹在li中,否则纯文本或非li元素会被忽略;嵌套列表需将子ol置于父li内;type属性仅作用于当前ol,start和reversed存在兼容性问题,推荐用CSS counter控制编号。

ol标签里直接写文字会失效
浏览器会忽略<ol></ol>内部的纯文本,编号根本不会出现——哪怕你写了<ol>第一项</ol>,结果也是空的。这不是 bug,是 HTML 规范强制要求:所有内容必须包裹在<li>里。
常见错误包括把<p></p>、<div>或标题标签直接塞进<code><ol></ol>,比如:
<ol> <p>第一步</p> <div>第二步</div> </ol>
这些非<li>子元素会被浏览器跳过,只保留空白编号项。正确写法只有一条:每个条目必须用<li>包裹,且<li>必须是<ol></ol>的直接子元素。
立即学习“前端免费学习笔记(深入)”;
嵌套多级列表必须用语义化结构
想实现 A. → 1. → a. 这样的层级编号,不能靠多个并列的<ol></ol>,也不能靠 CSS 模拟。必须用嵌套:子<ol></ol>必须放在父级<li>内部,而不是<ol></ol>外面。
-
<ol type="A"></ol>下一级<ol></ol>要写在某个<li>里,而不是紧挨着父<ol></ol> - 错位嵌套(如子
<ol></ol>放在父<ol></ol>闭合后)会导致编号重置、字母从 A 重新开始 - 深层嵌套时,
type属性只作用于当前<ol></ol>,不影响父或子层级
例如第三级用小写字母,就写<ol type="a"></ol>,它自动继承上级计数逻辑,无需手动干预起始值。
start和reversed的兼容性陷阱
start和reversed看着简单,但实际用起来容易翻车:
-
start只接受整数,start="3.5"或start="-2"会被忽略,退化为start="1" - IE11 及更早版本完全不支持
start,始终从 1 开始编号 -
reversed仅对type="1"(默认数字)生效;设了type="a"或type="I"后,reversed会被浏览器静默忽略 -
reversed和start可共存,但顺序无关——<ol reversed start="10"></ol>就是从 10 往下递减
如果你需要跨浏览器稳定控制起始编号,别依赖start,改用 CSS 的counter-reset配合::before伪元素更可靠。
type属性值不是都安全可用
type支持"1"、"a"、"A"、"i"、"I"五种,但实际效果受字体、渲染引擎和可读性限制:
-
type="1"是默认值,显式写出来纯属冗余 -
type="i"(小写罗马数字)在长列表中极易混淆,比如viii和iii肉眼难分辨 -
type="I"(大写罗马数字)在 Safari 上渲染异常概率略高,尤其在 iOS 设备上可能回退为数字 - 所有
type值都不改变语义顺序,屏幕阅读器仍按 DOM 位置播报“第 X 项”,不会读成“A.”或“Ⅰ.”
真正需要精细控制样式时,CSS 的list-style-type比 HTML type更灵活,支持lower-greek等扩展值,还能响应式切换,建议优先考虑。



















