HTML的type属性仅支持"1""a""A""i""I"五个合法值,且会被CSS的list-style-type完全覆盖,仅在禁用CSS时生效;真需控制序号样式应优先使用list-style-type或CSS计数器。

直接改 type 属性只能在极简场景下起效,且极易被 CSS 覆盖或忽略;真要控制序号样式,应优先用 list-style-type,type 仅适合纯语义、无样式的降级环境。
哪些 type 值是合法的
HTML 规范只允许以下 5 个字符串:"1"、"a"、"A"、"i"、"I"。其他任何写法(如 "lower-alpha"、"decimal-leading-zero"、"roman")浏览器会静默忽略,退化为默认 "1"。
-
type="a"渲染为 a b c,type="A"是 A B C —— 大小写不互通,也不能混写成"lower-a" -
type="i"输出 i ii iii,不是 “Step i” 或带前缀的罗马数字 - 写成
<ol type="c">或<ol type="3">都无效:前者被当非法值忽略,后者转成整数后仍不匹配合法枚举
type 和 list-style-type 冲突时谁生效
CSS 的 list-style-type 永远覆盖 HTML 的 type 属性。哪怕你写了 <ol type="A">,只要 CSS 中存在 ol { list-style-type: lower-greek; },最终显示的就是 α β γ。
- 这意味着:一旦项目里用了 CSS 控制列表样式,
type就完全失效;删掉更干净,避免误导 - 只有在禁用 CSS 的环境(如某些邮件客户端、终端浏览器、无障碍阅读器降级模式)中,
type才会“露脸”,但此时无法控制字体、颜色、间距等基础表现 - 开发时看到的效果 ≠ 用户实际看到的效果,尤其跨设备、跨 UA 时,混用两者却不检查覆盖关系,容易引发回退行为
什么时候该用 start 而不是 type
start 控制计数起始值,和编号类型无关;它只决定“从几开始数”,不决定“显示成什么”。例如:
-
<ol type="a" start="3">→ 显示 c d e(因为 a=1, b=2, c=3) -
<ol type="i" start="5">→ 显示 v vi vii(不是 “第 5 个罗马数字”,而是阿拉伯数字 5 查表得 v) -
start只接受整数;start="5.8"会被截断为 5,start="abc"则回退到 1 -
value属性只影响单个<li>,后续项仍按原逻辑递增 —— 它不是重设整个列表起点
真正需要自定义序号时,type 完全没用
比如你要 “Section 1”、“Chapter-02”、“2.1.3”,或者跳过某项、嵌套多级自动递进,type 连边都沾不上。必须用 CSS 计数器:
ol.section { counter-reset: section; }
ol.section li { counter-increment: section; }
ol.section li::before { content: "Section " counter(section) " "; }
-
counter-reset和counter-increment是强制前提,type对它们零影响 - 嵌套编号(如 1 → 1.1 → 1.1.1)得靠
counters()函数,type不参与层级解析 - 别试图用
type="1"配合计数器 —— 冗余,还可能在旧版 Safari 或 IE 兼容模式中引发渲染错位
很多人改完 type 看不到效果,第一反应是“是不是写错了”,其实真正该查的是:有没有 CSS 覆盖、是否在禁用样式的上下文中运行、以及是否误把语义当样式用了 —— ol 的本质是表达“有序”,不是“怎么画序号”。

















