<li>必须嵌套在<ol>或<ul>内才能生效,单独置于<body>中会导致浏览器自动修复、语义丢失、屏幕阅读器无法识别;start控制起始编号,type定义样式,二者可共存,CSS的list-style-type会覆盖HTML的type属性。

直接用 <ol> 包裹 <li> 就能生成语义正确、可访问的有序列表,不需要手动写数字,也不依赖 CSS 才能编号。
为什么不能把 <li> 直接丢在 <body> 里
浏览器只认嵌套结构:<li> 必须是 <ol> 或 <ul> 的直接子元素。单独放 <li> 会导致解析错误,开发者工具里可能看到 DOM 被自动修正(比如补上 <ol>),但行为不可靠,且破坏语义和屏幕阅读器体验。
-
<li>不是独立标签,它没有默认样式或语义含义,离开父容器就“失效” - 某些旧版 IE 或严格模式下会完全忽略孤立的
<li> - SEO 和辅助技术依赖正确的父子关系识别列表逻辑
start 和 type 属性的实际效果差异
这两个属性都作用于 <ol> 标签本身,但影响维度不同:start 控制编号起点,type 控制编号样式;它们可以共存,但要注意浏览器兼容性边界。
-
start="5"→ 第一个<li>显示为 “5.”,后续按序递增(6.、7.) -
type="A"→ 使用大写字母(A.、B.、C.);type="i"是小写罗马数字(i.、ii.、iii.) -
type="1"是默认值,显式写出来没坏处,但没必要;type="I"在 Safari 旧版本中可能回退为数字 -
start对type="a"或type="i"也生效,但计算逻辑是字母表/罗马数序位,不是十进制加法
CSS list-style-type 覆盖 HTML 属性时的优先级规则
当 HTML 的 type 属性和 CSS 的 list-style-type 同时存在,CSS 会覆盖 HTML 属性 —— 但仅限于同类型列表。这个覆盖不是无条件的。
立即学习“前端免费学习笔记(深入)”;
- 对
<ol>,CSS 中list-style-type: upper-alpha会覆盖type="1",但不会让start="3"失效 - 对
<ul>设置list-style-type: decimal无效,因为该值不适用于无序列表 - 若用
list-style: none,它会同时干掉编号/符号和默认缩进,必须手动补padding-left否则内容贴边 - 注意:IE8 及更早版本不支持
list-style-type的部分值(如lower-roman),需降级处理
最容易被忽略的是嵌套时的编号继承问题:子 <ol> 默认从 1 开始,不会延续父级计数;如果需要连续编号(比如“2.1、2.2”),必须用 CSS counters 手动实现,HTML 原生属性做不到。



















