HTML原生支持ol的start="0"实现从0开始编号,显示“0.”、“1.”等,但仅适用于type="1";type="a"或"i"时因无第0个字母或罗马数字而失效,需用CSS计数器配合aria-label保障无障碍。

ol 的 start 属性直接设为 0 就行
HTML 原生支持从 0 开始编号,不需要 JS 或 CSS counter。只要写 start="0",浏览器就会把第一个 li 显示为 “0.”,第二个是 “1.”,依此类推——它不是“跳过第 0 项”,而是“第一项就显示 0”。
这个行为完全合法,且所有现代浏览器(Chrome、Firefox、Safari、Edge)都支持 start="-1"、start="0"、start="5" 这类整数。
-
start="0"+type="1"→ 显示 “0.”、“1.”、“2.” -
start="0"+type="a"→ 显示空白或异常(字母表无第 0 个),应避免 -
start="0"+type="i"→ 显示 “0” 对应的罗马数字?实际会 fallback 到 “0.” 或空,不推荐
为什么 type="a" 或 type="i" 下 start="0" 不生效
start 的值始终参与阿拉伯数字计数逻辑,type 只是把那个数字查表转成对应字符。字母表从 a=1 开始,没有第 0 个字母;罗马数字也没有 “0” 的标准表示。所以:
-
start="0"在type="a"下多数浏览器显示为空白或回退到数字 “0.” -
start="1"才是type="a"下安全的最小起始值(显示 “a.”) - 若真要“第 0 条”带字母前缀(如 “0a”),必须用 CSS
counter-reset+::before手动拼接
常见失效原因:序号被样式吃掉了
写了 start="0" 却还是看到 “1.”,大概率不是属性没生效,而是序号根本没渲染出来:
立即学习“前端免费学习笔记(深入)”;
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- CSS 中写了
list-style: none,隐藏了整个编号区域 - 用了
display: flex或grid布局,导致li脱离了默认列表流,序号丢失 -
li不是ol的直接子元素(比如中间嵌了div),浏览器不识别为列表项 - 全局重置样式里有
ol { counter-reset: none; }类干扰(少见但存在)
想显示 “0-1”“0-2” 这类带前缀的编号怎么办
原生 ol 的 start 和 type 都不支持文字前缀。此时必须用 CSS 计数器:
ol {
counter-reset: zeroed;
}
ol li {
counter-increment: zeroed;
}
ol li::before {
content: "0-" counter(zeroed) " ";
font-weight: bold;
}
注意:counter-reset: zeroed 默认从 0 开始计数;如果想让第一项是 “0-1”,就得写 counter-reset: zeroed -1(因为它是“重置为该值+1 后开始递增”)。
这种写法绕过了 start 的整数限制,也避开了 type 的字符映射缺陷,但代价是失去纯 HTML 的语义简洁性——一旦禁用 CSS,序号就完全消失。
真正容易被忽略的是:序号是否需要被屏幕阅读器正确读出。纯 start="0" 是无障碍友好的;而 ::before 插入的内容默认不进可访问树,需额外加 aria-label 或 role="listitem" 修复。


















