html有序列表必须用包裹,因规范限定子元素仅能为等少数元素;直接写文本或块级元素会导致浏览器错误修复结构,影响语义、可访问性及渲染。

HTML有序列表由<ol></ol>和<li>两个必需元素构成,缺一不可;浏览器会自动计算编号,不依赖value或手动写数字。
为什么<ol></ol>必须包裹<li>?
HTML规范强制要求<ol></ol>的直接子元素只能是<li>(或脚本支持的<script></script>等少数例外)。如果在<ol></ol>里直接写文本、<p></p>或<div>,浏览器会尝试“修复”结构,但结果不可控——可能把内容移出列表,或生成空<code><li>占位。
- 错误写法:
<ol>第一步<p>第二步</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill7761" title="Article To Html"><img src="https://img.php.cn/upload/skill/000/000/081/179168408018805.jpg" alt="Article To Html" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill7761" title="Article To Html" class="overflowclass">Article To Html</a> <p class="overflowclass">文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。</p> </div> <a rel="nofollow" href="/xiazai/skill7761" title="Article To Html" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> </ol> - 正确写法:
<ol> <li>第一步</li> <li>第二步</li> </ol> - 嵌套合法:一个
<li>内部可以再放<ol></ol>或<ul></ul>,形成多级步骤
value属性只对单个<li>生效,且不改变后续编号逻辑
value是<li>的局部属性,仅用于覆盖当前项的编号值。它不会重置后续<li>的计数起点,后续项仍按前一项+1递增(除非又被另一个value覆盖)。
- 示例:
<ol> <li value="10">苹果</li> <li>香蕉</li> <li value="50">橙子</li> </ol>→ 显示为 10、11、50 - 注意:
value只影响视觉编号,不影响语义顺序或屏幕阅读器播报的序号逻辑(多数读屏仍按位置报“第1项、第2项”) - 不要用
value模拟跳号或乱序;真有复杂编号需求,应改用CSScounter-reset/counter-increment
type、start、reversed都作用于<ol></ol>,不是<li>
这三个属性控制整个列表的编号行为,必须写在<ol></ol>开始标签上。写在<li>上会被忽略。
-
type="A":大写字母(A、B、C…),非<li type="A"> -
start="5":从5开始编号(5、6、7…),不是<li start="5"> -
reversed:倒序逻辑(如3项→显示为3、2、1),不是视觉翻转;它不改变DOM顺序,只改编号方向 - 兼容性提醒:
reversed在IE中完全不支持,旧版Edge也存在渲染异常,生产环境慎用
容易被忽略的语义与可访问性约束
<ol></ol>的核心价值不在数字样式,而在明确传达“顺序不可变”的语义。一旦用错,会影响屏幕阅读器播报、SEO结构化数据提取,甚至破坏自动化测试中的步骤定位。
- 别用
<ol></ol>只为了显示数字——如果条目无先后依赖(比如“功能亮点”罗列),该用<ul></ul> - 别在
<ol></ol>里混入<ul></ul>作为同级兄弟(如<ol><li>…</li></ol> <ul>…</ul>),这违反嵌套规则,会导致解析失败 - 所有
<li>必须有结束标签;自闭合写法<li>在HTML中无效,会被视为未闭合










