HTML规范要求ol必须仅包含li(及script、template等例外),否则编号消失;start属性设整数起始编号但IE11不支持,type属性已废弃应改用CSS;reversed仅对decimal有效;嵌套ol须完整置于li内,且层级不宜超2层。

ol必须只包含li,否则编号直接消失
浏览器遇到<ol>第一步</ol>这种写法,会默默忽略纯文本内容,连编号都不渲染——不是报错,是“假装看不见”。这不是bug,是HTML规范强制要求:<ol></ol>的直接子元素只能是<li>(以及<script></script>、<template></template>等极少数例外)。常见翻车现场包括:
- 把整段说明文字直接塞进
<ol></ol>里,没包<li> - 用
<p></p>包裹每条内容再放进<ol></ol>,结果编号没了,样式也错乱 - 在
<li>外面加<div>做布局,破坏语义层级 <p>正确写法只有一种:<code><ol> <li>第一步</li> <li>第二步</li> </ol>。嵌套子列表时,整个子<ol></ol>必须完整落在某一个<li>标签内部。start和type属性的实际效果与兼容性陷阱
start控制视觉起始编号,比如<ol start="34"></ol>会让第一条显示为“34.”,但后续仍按顺序递增;它不改变DOM顺序,也不影响屏幕阅读器播报(读的仍是“第1项”)。关键限制有:-
start值必须是整数,start="-2"或start="3.5"会被浏览器忽略,退化为1 - IE11及更早版本完全不支持
start,始终从1开始 -
type属性(如type="a")在HTML5中已被废弃,仅作向后兼容;现代项目应改用CSS的list-style-type
如果你需要跨浏览器稳定显示小写字母编号,写CSS比依赖
type更可靠:ol { list-style-type: lower-alpha; }。立即学习“前端免费学习笔记(深入)”;
reversed属性只对decimal类型有效
reversed是个布尔属性,启用后编号倒序显示,但它有个隐藏前提:只对list-style-type: decimal(即默认数字)生效。如果你同时设了type="A"或CSS里写了list-style-type: upper-roman,reversed会被浏览器无视。典型误用:
<ol type="a" reversed> <li>a</li> <li>b</li> </ol>—— 这不会变成“b, a”,而是照常显示“a, b”。真正想实现字母倒序,得手动控制内容顺序,或用JS动态生成。嵌套ol时,语义比样式更重要
看到“34. …… a) …… b) ……”这类结构,别想着用两个并列
<ol></ol>硬拼。正确方式是外层<ol start="34"></ol>的某一个<li>里完整嵌入子<ol type="a"></ol>。这时要注意:- 子
<ol></ol>必须100%写在父<li>的起始与结束标签之间,不能悬空 -
type只改外观,不改语义;如果子项本身有执行顺序(比如“先A后B”),就该用<ol></ol>,而不是退化成<ul></ul> - 屏幕阅读器会把嵌套结构读作“第3项,包含2个子项”,所以嵌套层级不宜超过2层,否则可访问性急剧下降
最易被忽略的一点:当你用CSS把
<ol></ol>的编号隐藏(list-style: none),又用伪元素::before模拟编号时,你已经主动放弃了语义和可访问性——此时它本质上只是视觉上像有序列表,但对辅助技术来说,就是一堆普通段落。 -



















