start属性仅设定有序列表首个的阿拉伯数字起始值,后续自动递增;值必须为整数,非整数将被截断或退化为1,且与type配合使用以保证语义正确。

start 属性决定的是第一个 <li> 显示几,不是“跳过前 N 项”,也不是“从第 N 个字母开始”——它只管阿拉伯数字计数的起点,后续自动 +1。
start 值必须是整数,小数或字符串会静默失效
浏览器只认整数,其他类型会被强制转换或退化为默认值 1:
-
start="5"→ 正常显示 “5.”、“6.”、“7.” -
start="5.8"→ 截断为5,效果同start="5" -
start="abc"或start=""→ 退化为1,无报错但编号从 1 开始 -
start="-2"→ 合法,显示 “-2.”、“-1.”、“0.” -
start="c"或start="iii"→ 不合法,被当作无效值处理(回退到 1)
type 和 start 必须配合,否则语义错位
type 控制样式,start 控制该样式序列中的位置索引。例如:
-
<ol type="a" start="3"></ol>→ 显示 “c.”、“d.”、“e.”(a=1, b=2, c=3) -
<ol type="I" start="4"></ol>→ 显示 “IV.”、“V.”、“VI.”(I=1, II=2, III=3, IV=4) -
<ol type="A" start="0"></ol>→ 第一项显示 “A.”,因为start="0"对应大写字母序列第 0 位(部分浏览器映射为 A,非标准行为,建议避免) - 别写
type="a" start="c"——start只接受数字,不解析字符
和 value、reversed 共存时,谁优先?
start 是整个列表的基准,但会被更局部的属性覆盖或干扰:
立即学习“前端免费学习笔记(深入)”;
-
value在某个<li>上出现,就中断后续自动递增逻辑:<ol start="10"><li value="20">B</li></ol>→ 显示 “20.”,第三项若存在会是 “21.” -
reversed不改变start的含义,只倒着减:<ol start="5" reversed>A B C</ol>→ 显示 “5. A”、“4. B”、“3. C”,DOM 顺序仍是 A→B→C - CSS
counter-reset会覆盖start(如果作用域正确),且counter-reset: list-item 20表示“下一个将用的值是 20”,所以第一项显示 “20.”
动态设置或框架中使用要注意类型和时机
JS 或 JSX 中传值看似自由,但隐含陷阱:
- React/Vue 模板里直接写
start="{number}",但若传字符串如"5.2",浏览器仍会截断;建议显式转Number(currentStart) - JS 修改
ol.start = 100会立即重绘编号,但新增<li>不会自动按新start重算——它仍基于已有项数量推导(比如原 3 项、start="10",新增后是 “14.”) - 服务端渲染(SSR)下
start照常生效,不依赖 JS,但若在 hydration 后突变(如从 3 跳到 100),视觉跳变更明显,屏幕阅读器可能误读
最易被忽略的一点:start 不是样式控制开关,它参与语义计数。一旦混用 value 或 CSS counter-reset,编号逻辑就脱离 HTML 原意,可访问性风险陡增——尤其当 value="100" 后紧跟 value="2" 这类明显脱节的写法。真要复杂编号,不如用 CSS counter,把语义层留给 start。



















