start属性必须直接写在<ol>标签上且为整数,定义首个<li>的编号;type非"1"时,start表示序列位置而非显示字符;常见失效原因为CSS隐藏、value干扰或嵌套未单独设置。

直接写在<ol>标签上,值必须是整数
start 属性不能写在 <li> 里,也不能用 CSS 或 JS 模拟——它只属于 <ol> 元素本身,且必须是整数(正、负、零都行)。浏览器会按这个数作为第一个 <li> 的显示编号,后续自动 +1。
常见错误写法:
-
start="5.8"→ 被截断为5 -
start="abc"或start=""→ 退化为默认1,无报错但失效 -
start="c"或start="III"→ 完全不识别,等同于没写
正确写法示例:<ol start="7"><li>A</li><li>B</li></ol> 渲染为 “7. A”、“8. B”。
type 和 start 必须配合理解,否则显示结果反直觉
当 type 不是 "1"(即非阿拉伯数字)时,start 表示的是“序列中的第几个”,不是最终显示的字符。浏览器内部始终用阿拉伯数字计数,再查表映射。
立即学习“前端免费学习笔记(深入)”;
-
<ol type="a" start="3"><li>c</li></ol>→ 显示 “c.”(a=1, b=2, c=3) -
<ol type="I" start="4"><li>IV</li></ol>→ 显示 “IV.”(I=1, II=2, III=3, IV=4) -
<ol type="A" start="0"><li>A</li></ol>→ 第一项仍是 “A.”,因为字母表索引从 1 开始,0 被当作 1 处理(部分浏览器行为略有差异,但规范未定义 0 在字母序列中的含义)
别指望 start="5" 在 type="a" 下显示 “5.”——它根本不会出现数字。
为什么写了 start 却还是从 1 开始?大概率不是属性没生效
绝大多数“看起来没用”的情况,其实是渲染被遮蔽或干扰了:
- CSS 中写了
list-style: none或display: flex等布局方式,序号被隐藏,start仍在计算,只是你看不见 -
<ol>被aria-hidden="true"、visibility: hidden或opacity: 0包裹,序号不可见也不可访问 - 误用了
value:比如<ol start="10"><li value="1">...</li></ol>,第一项强行变成 “1.”,直接覆盖并中断了start的逻辑 - 嵌套
<ol>时,外层start对内层无效,内层需单独设
调试建议:先移除所有相关 CSS,检查 DOM 是否有 value 属性干扰,再确认 type 是否与预期显示一致。
动态设置 start 时,注意类型和可访问性
JS 设置可以走 DOM API 或框架绑定,但类型处理稍有差异:
-
olElement.start = 12(number 类型)→ 最稳妥,无转换风险 -
olElement.setAttribute('start', '12')(string 类型)→ 可用,但传'12.5'会被截断 - React/Vue 中用
start={currentStart}(推荐 number)比start="12"更可靠,避免字符串意外截断
值突变时(如从 3 改成 100),视觉序号会跳变,但 DOM 不重绘,部分屏幕阅读器可能缓存旧编号;尤其在列表项数量不稳定时,频繁切换 start 值容易导致语义错乱。
跨多个 <ol> 连续编号、加章节前缀(如 “2.3”)、混排罗马与字母编号——这些场景下 start 就力不从心了,得切到 CSS counter-reset,而不是硬塞一堆 value 打补丁。



















