ol的start属性仅控制序号起始值,无法实现非连续跳号;真正支持跳号的是CSS counter,通过counter-increment设置递增值,value属性则仅强制单个li编号且打断后续自动递增。

ol 的 start 属性不能实现“跳跃编号”,它只控制起始显示值
很多人以为 start="5" 是跳过前 4 项、只渲染第 5 项开始的内容,其实完全不是—— 渲染出来是 “5. A” 和 “6. B”,DOM 里仍是全部项,序号只是视觉偏移。想靠
start 实现 “1. 2. 5. 8.” 这类非连续编号,行不通。
常见错误现象:
- 写
,结果看到 “3. 第一步”、“4. 第三步”,误以为“第三步”就该对应数字 3- 第一步
- 第三步
- 在分页场景中用
start模拟“从第 10 条继续”,但后端数据实际只返回 2 条,序号却变成 “10. … 11.”,语义错位
真正能跳号的只有 CSS counter + counter-increment 控制递增值
CSS 计数器允许你手动指定每次递增多少,从而实现跳号(比如每次 +3)、倒跳(-2)、甚至条件性跳过某项。核心是把 counter-increment 的值设为非 1 的整数。
实操建议:
- 要实现 “1. 4. 7. 10.”:给
li设counter-increment: step 3;,并在ol上设counter-reset: step 0; - 想让某一项不参与编号(比如说明性条目),对该
li设counter-increment: step 0;,而不是用display: none(隐藏仍会递增) - 注意
counter-reset的初始值是“递增前的值”,所以counter-reset: step -1;+counter-increment: step 3;第一项显示为 2,不是 1
示例片段:
ol { counter-reset: step -1; }
li { counter-increment: step 3; }
li::before { content: counter(step) ". "; }
value 属性可强制单个 li 编号,但会打断后续自动递增
value 是唯一能在 HTML 层面“硬设某一项编号”的属性,但它不是“跳号”,而是“重置链”。一旦用了 ,后面所有 li 都会从 8 开始继续,不管前面是什么。
使用限制很明确:
- 只对当前
li生效,不影响父/子列表 - 后续项编号严格按 “value + 1” 接续,无法恢复原序列节奏
- 和
start混用时,value优先级更高;但频繁插value容易让逻辑混乱,尤其配合 JS 动态渲染时 - 别在嵌套
ol里滥用value,子列表不会继承父级的 value 偏移
混合使用时最容易被忽略的兼容性细节
start 和 CSS 计数器可以共存,但浏览器按不同机制解析:前者是 HTML 原生语义层行为,后者是样式层覆盖。这意味着:
- 当同时设置
和counter-reset: item 9;,两者效果一致(都从 10 开始),但若后续有 JS 修改ol.start,CSS 计数器不会同步更新 - 在打印预览或高对比度模式下,部分屏幕阅读器可能只读取原生
start值,而忽略 CSS 生成的::before内容 -
reversed与 CSS 计数器不联动:显示 “5. 4. 3.”,但如果你用计数器实现同样效果,得手动算好counter-reset初始值并反向递减
复杂编号逻辑(如“附录B-3”“第2章第5节”)基本绕不开 CSS 计数器,start 只适合线性、整数、无跳变的简单偏移。别指望一个属性解决所有编号问题。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











