start 属性是 原生支持的起始编号控制方式,必须直接写在 标签上且值为整数(如 start="7"),负数和零合法,非整数会被强制转换或退化为 1;start 控制列表初始值,value 仅覆盖单个 编号并中断后续自动递增;常见失效原因是样式隐藏序号、type 与 start 未配合(如 type="a" 时 start="5" 表示第 5 个字母)、start 为空字符串或动态传入未转数字;语义化编号应优先用 start,装饰性需求改用 css counter-reset。

start 属性是 <ol></ol> 原生支持的起始编号控制方式,不用 JS、不靠 CSS counter,纯 HTML 就能生效——但写错位置、配错属性、或误判行为边界,它就“看起来没用”。
怎么正确设置 start 值
直接在 <ol></ol> 标签上写 start="N",N 必须是整数(正、负、零都行),浏览器会把它当作第一个 <li> 的显示编号。
-
start="7"→ 渲染为 “7.”、“8.”、“9.”,不是跳过前6项 -
start="-1"→ 显示 “-1.”、“0.”、“1.”,合法且兼容所有现代浏览器 -
start="5.8"或start="abc"→ 被强制转成整数或退化为 1,无报错但失效 - 不要写
start="a"或start="iii"—— 它只管数字逻辑,字母/罗马数字起始靠type+start组合,比如<ol type="a" start="3"></ol>才显示 “c.”
start 和 value 到底谁管谁
start 控制整个列表的初始值;value 只覆盖单个 <li> 的显示编号,并中断后续自动递增逻辑——但不会重置 start 的语义起点。
-
<ol start="10"> <li>A</li> <li value="20">B</li> </ol>→ 显示 “10.”、“20.”,第三项若存在会是 “21.” - 多个
value连续出现时,后一个不继承前一个的“意图”,只按数值硬设:<li value="5"> <li value="1">就真显示 “5.”、“1.” - 想让整个列表从某数开始且线性递增,只用
start;只有局部跳号(如法律条文“第十二条”后接“第十七条”)才动value
为什么写了 start 却还是从 1 开始
常见原因不是属性写错,而是渲染被其他样式或结构干扰:
-
list-style: none或display: flex等布局方式隐藏了序号本身,start仍在计算,只是你看不见 - 用了
type="a"却期望start="5"显示 “5.” —— 不成立,start在字母序列里表示“第几个字母”,得配合type才有意义 -
<ol></ol>外层被aria-hidden="true"或visibility: hidden包裹,序号不可见也不可访问 - 服务端渲染时
start值为空、null或未传入,HTML 输出成了start="",浏览器按默认 1 处理
动态改 start 的注意事项
JS 直接操作 ol.start = 100 是安全且即时的,但有三个实际约束点:
- 修改后新增的
<li>会按新start和当前项数推导编号,不是从 1 重启 - 如果列表已含
value的项,新start不会覆盖那些显式值,只影响无value的项 - 在 React/Vue 中传入
start值,建议用Number()显式转换,避免字符串截断(如"05"→5,但"08"在某些解析下可能变0)
最常被忽略的是:编号是否具备语义——如果只是为了视觉对齐或装饰效果而硬塞 start 或 value,不如换用 CSS list-style-type + counter-reset,把语义层和表现层分开。HTML 的 start 是为真实序号逻辑服务的,不是样式补丁。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











