的合法子元素仅有 ,混入 或文本会导致编号失效、语义丢失;嵌套需在 内置 ;start/type 属性功能有限且兼容性差,推荐用 css counters 实现多级编号。

直接用 <ol></ol> 包裹 <li>,别往里面塞 <p></p>、文本或其它非 <li> 元素——这是绝大多数“编号不显示”“样式错乱”“语义失效”的根源。
为什么 <ol></ol> 里不能放 <p></p> 或纯文本
浏览器和屏幕阅读器只认 <ol></ol> 的直接子元素是 <li>。一旦你写成这样:
<ol> <p>第一步:准备材料</p> <p>第二步:开始操作</p> </ol>
那它就不是列表,只是个空容器套了两个段落——编号不会出现,CSS 的 list-style-type 失效,可访问性信息丢失。
-
<ol></ol>的合法子元素只有<li>(以及可选的脚注类元素如<script></script>,但业务中几乎不用) - 所有内容(包括换行、缩进、甚至空格)都必须包裹在
<li>里 - 想加强调?在
<li>内部用<strong></strong>、<em></em>,别拆出来
start 和 type 属性的实际作用与限制
start="5" 确实能让编号从 5 开始,type="a" 能切到小写字母,但这些 HTML 属性有硬伤:只作用于当前层级,不继承,不支持嵌套自动递进(比如 “2.1” 这种),且现代项目中更推荐用 CSS 控制。
-
start是整数,不接受字母或罗马数字;type="i"和type="I"在部分旧浏览器中兼容性差 -
type属性已被 W3C 标记为“过时但未弃用”,官方建议优先使用list-style-typeCSS 属性 - 如果需要多级编号(如 1 → 1.1 → 1.1.1),必须用 CSS
counter-reset/counter-increment,HTML 属性做不到
嵌套有序列表的唯一合法结构
子规则必须放在父 <li> 内部,再套一层 <ol></ol> ——不是套在外部,也不是用 <ul></ul> 混用。
<ol>
<li>主规则一</li>
<li>主规则二</li>
<li>主规则三
<ol type="a">
<li>子规则 a</li>
<li>子规则 b</li>
</ol>
</li>
</ol>
- 外层
<ol></ol>和内层<ol></ol>之间不能插任何其它标签(比如<div>、<code><p></p>、<br>) - 内层
<ol></ol>必须完整闭合,且只能出现在某个<li>的起始与结束标签之间 - 嵌套超过三层会显著增加可访问性负担,屏幕阅读器播报容易混乱,建议控制在两层以内
-
list-style是简写属性,设成none会同时清掉类型、位置和图片,但不会动padding - 默认
<ol></ol>有约 40px 左侧 padding,清除符号后若不手动设padding-left: 0,视觉上仍有空白 - 如果给
<li>设了float或display: flex,list-style可能完全不渲染——此时得改用 CSS counters 手动编号
CSS 样式覆盖时最容易忽略的坑
设了 list-style-type: none 却发现编号还在?大概率是没重置 padding-left,或者用了 display: inline-block 导致 list-style-position: outside 失效。
真正麻烦的从来不是怎么编号,而是让编号在各种嵌套、样式覆盖、屏幕阅读器播报、打印媒体查询下都保持一致——这要求你从第一层 <li> 就严格守规矩,而不是靠后期 CSS 强行打补丁。











