start属性值必须为整数,否则静默退化为1;浏览器截断小数、忽略非数字字符串,服务端或JS中需显式转换类型;type仅控制显示映射,不改变start的计数逻辑;序号不可见常因CSS隐藏而非start失效;跨列表连续编号应使用CSS计数器而非依赖start。

start属性值必须是整数,否则静默退化为1
浏览器只认 start 的整数值,传 "5.8" 会被截断成 5,传 "abc" 或空字符串 "" 就直接当 1 处理——不报错、不警告,但编号就“看起来没变”。
常见翻车点:
- 服务端模板里变量未转数字:
<ol start="{{item.start}}">→ 若item.start是字符串"7"还行,但如果是null或undefined,输出就是start="",等效于没写 - JS 动态赋值时漏了类型转换:
ol.start = someValue中someValue是字符串"12",虽然多数浏览器会隐式转,但严格起见应写ol.start = Number(someValue) - 用
start="-0"期望显示0.?不行,-0被规范转为0,但显示仍是0.;而start="0"是合法且明确的写法
type和start必须配合,否则语义错位
start 不管你显示的是数字还是字母,它只决定“序列里的第几个”,真正映射成什么字符,得看 type。比如 start="3" 配 type="a" 才出 c.,单写 start="3" 但没设 type,就还是 3.。
容易踩的坑:
立即学习“前端免费学习笔记(深入)”;
-
<ol type="A" start="3">显示C.,不是3.;别指望start="c"能生效——start只接受整数 -
type="i"和type="I"效果一样,但建议统一用小写,部分旧校验工具或 SSR 框架对大小写敏感 - 用了 CSS
list-style-type: lower-roman后,type属性会被忽略,此时start仍参与计数,但显示样式由 CSS 控制,容易造成“编号逻辑对不上视觉”的困惑
序号看不见 ≠ start 没生效
写了 start="10" 却还看到 1.,大概率不是 start 失效,而是序号被隐藏了:
- CSS 里写了
list-style: none或ol { display: flex }——start还在算,只是没渲染出来 -
<ol>被aria-hidden="true"、visibility: hidden或opacity: 0包裹,屏幕阅读器和视觉都不可见 - 自定义字体或图标覆盖了默认序号,但没重置
list-style-position,导致编号溢出容器外,肉眼找不到
验证方法:临时加一句 ol { list-style: decimal !important; },再看是否从预期数字开始。
跨列表连续编号不能只靠start
start 是单个 <ol> 的起点控制,它不感知前一个列表有多少项。想让第二段 <ol> 紧接第一段末尾(比如第一段到 8.,第二段从 9. 开始),就得手动算好填 start="9" ——一旦第一段动态增删,第二段就脱节。
这时该切到 CSS 计数器:
ol {
counter-reset: section;
}
ol.continuous {
counter-reset: section 8; /* 接续上一段末尾 */
}
ol.continuous li::before {
content: counter(section) ". ";
counter-increment: section;
}注意:counter-reset 支持表达式和变量,但无法穿透 Shadow DOM;若用 Web Components,需在组件内显式继承或重置计数器。
最易被忽略的一点:当你需要章节前缀(如 2.3.1)、嵌套跳号、或响应式重编号时,start 本质上是“单次偏移”,不是“状态管理”——它不保存上下文,也不触发重排。这时候硬塞 value 打补丁,只会让语义越来越脆。



















