start="0" 无法让 <ol> 从 0 开始编号,因 HTML 规范强制将 start 值与 1 取最大值,故 start="0" 实际起始编号为 1;唯一可靠方案是 CSS counter-reset: list-item -1 或自定义计数器。

不能用 start="0" 让 <ol> 真正从 0 开始编号 —— 浏览器会把它强制修正为 1,视觉和语义上都不可靠。
为什么 start="0" 渲染出来还是 “1.”
HTML 规范(WHATWG)明确要求:列表项编号必须是正整数。start 属性的处理逻辑是“先转整数,再与 1 取最大值”。所以:
-
start="0"→ 解析为0→max(0, 1)→ 实际起始编号为1 -
start="-5"→ 同样被修正为1 -
start="abc"或空字符串 → 忽略,退化为默认1
这不是浏览器 bug,而是所有主流引擎(Chrome、Firefox、Safari、Edge)一致执行的标准行为。即使你看到页面上显示 “1.”,也不能认为 start="0" “生效了”——它只是没报错,也没改变结果。
start 和 type 配合时,“0” 更不可能出现
type 控制的是显示样式(如 a、i),不改变计数本质;start 始终表示“这是第几个列表项”。所以:
立即学习“前端免费学习笔记(深入)”;
-
<ol type="a" start="0">→ 第一项仍显示为A.(因为字母表没有第 0 个) -
<ol type="i" start="0">→ 显示I.,不是 “0.” 或空 -
start的值只参与阿拉伯数字计数,再查表映射;它不支持“从第 0 个罗马数字开始”这种概念
想让第一项显示 “0.”,唯一能走通的路径是视觉模拟,而非语义编号。
真要显示 “0.”,只能绕开 start
原生 <ol> 不提供从 0 编号的语义能力。可行替代方案有且仅有:
- 用
<ol>+ CSScounter-reset: list-item -1(注意:IE 不支持该语法作用于list-item) - 改用
<ul>+ 自定义::marker和counter-increment,手动控制计数器(例如counter-reset: my-counter -1) - 纯视觉硬编码:
<li><span>0.</span> 内容</li>—— 但完全丧失语义和可访问性,屏幕阅读器不会读出序号
其中,counter-reset: list-item -1 是最接近原生体验的方案,但它依赖 CSS,禁用样式时会退化为无编号列表。
容易被忽略的关键点
很多人动态插入 <li> 后发现序号错乱,问题常出在:start 不感知已有项数量,JS 修改 ol.start = 0 也不会触发重排或更新屏幕阅读器播报。真正可控的方式是统一用 CSS 计数器管理跨列表、跳号、条件重置等复杂场景 —— start 只适合单个列表的简单偏移,比如接续上一节的 start="6"。



















