start属性可设置有序列表起始编号,仅影响视觉显示;需用CSS计数器实现复杂编号逻辑,并注意可访问性与浏览器兼容性。

用 start 属性设置起始序号
HTML 有序列表(<ol>)默认从 1 开始编号,但可以直接通过 start 属性指定任意整数作为起始值。它只影响视觉序号,不改变 DOM 结构或语义。
常见错误是误以为 start="0" 能生成 “0. item”,实际多数浏览器会自动修正为 1(W3C 规范允许负值,但渲染行为不一致)。
-
start值必须是整数,支持负数(如start="-2"),但部分旧浏览器可能显示异常 - 若列表嵌套,子
<ol>的start独立计算,不会继承父级计数 - 配合 CSS
counter-reset可实现更灵活控制,但需额外样式,start是最轻量的原生方案
用 CSS counter-reset 和 counter-increment 完全接管编号
当需要跳号、非连续编号、带前缀(如 “Step 1”)、或与内容联动时,start 就不够用了,得用 CSS 计数器。
关键点:必须显式重置计数器(counter-reset),再在每个 <li> 上递增(counter-increment),最后用 ::before 插入编号。
立即学习“前端免费学习笔记(深入)”;
- 默认计数器名是
list-item,但建议自定义名(如counter-reset: step 5)避免冲突 -
counter-increment可设步长,例如counter-increment: step 2实现隔 2 编号 - 注意:若
<li>内含多个块级元素,确保::before的content插入位置合理,否则可能换行错位
ol.steps {
counter-reset: step 10;
}
ol.steps li {
counter-increment: step;
}
ol.steps li::before {
content: "Step " counter(step) ": ";
font-weight: bold;
}
动态修改序号时,优先操作 DOM 属性而非重写 HTML
JavaScript 修改序号,应直接改 ol.start 属性或 ol.setAttribute('start', n),而不是删掉整个 <ol> 重新生成。
原因:重写 HTML 会丢失事件监听、焦点状态、表单数据等;而修改 start 是纯呈现层变更,开销小且安全。
- 修改后浏览器会自动重绘序号,无需手动触发
force reflow - 若用 CSS 计数器,需同步更新
counter-reset的值(通过style.setProperty或切换 class) - React/Vue 等框架中,避免把
start当作响应式 prop 直接绑定到<ol start={n}>,某些版本对数字类型处理不一致,建议转成字符串:start={String(n)}
IE 兼容性与无障碍注意事项
IE9+ 支持 start,CSS 计数器 IE8+ 支持(但 counter() 不支持多参数)。不过真正容易被忽略的是屏幕阅读器行为:
- 所有主流读屏软件(NVDA、VoiceOver)都识别
<ol>语义和start值,会正确朗读“第 5 项” - 但若用 CSS
::before伪造编号(比如没配counter-increment),读屏器可能完全忽略该编号,只读文本内容 - 不要为了“看起来整齐”而用
list-style: none+ 手动加数字——这等于主动放弃语义和可访问性
序号不是装饰,是结构信息。能用 start 解决的,就别绕到 CSS;需要复杂逻辑的,务必验证读屏器输出。



















