跳转至

列表

列表是 HTML 中组织内容的基础结构,能让信息层次分明、易于阅读。HTML 提供了三种列表类型:无序列表、有序列表和描述列表,分别适用于不同的场景。

本文你会学到:

  • 🎯 掌握三种 HTML 列表类型的语法与语义
  • 🔧 了解 olreversedstarttype 等实用属性
  • 🧱 学会列表的嵌套写法与注意事项
  • 📊 根据内容特点选择最合适的列表类型

📋 列表类型概览

三种列表各有分工,下表帮助你快速建立整体认知:

类型 标签 默认样式 适用场景 类比
无序列表 ul + li 圆点标记 项目之间没有先后顺序 购物清单
有序列表 ol + li 数字编号 项目之间存在明确的顺序 菜谱步骤
描述列表 dl + dt + dd 无标记,缩进排列 术语解释、键值对 词典词条

核心原则:列表的语义比样式更重要。不要因为「想要圆点」就用 ul——如果内容有明确的先后顺序,应该用 ol

🔘 无序列表

无序列表(Unordered List)表示各项内容之间没有先后顺序,浏览器默认在每个 li 前显示一个圆点()。

ul 与 li

ul(Unordered List)是列表容器,li(List Item)是列表中的每一项。一个 ul 中可以包含任意数量的 li

无序列表基本结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>无序列表基本结构</title>
</head>
<body>
<!-- 无序列表基本结构:ul 容器 + li 列表项 -->
<ul>
  <li>HTML</li>
  <li>CSS</li>
  <li>JavaScript</li>
</ul>
</body>
</html>

💡 ul 的子元素只能是 li(或脚本/模板元素)。不要在 ul 内直接放 divp 等其他标签——如果需要更复杂的结构,把内容放在 li 内部。

li 内部可以包含其他元素
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>li 内部可以包含其他元素</title>
</head>
<body>
<!-- li 内部可以包含其他元素:strong、span 等行内标签 -->
<ul>
  <li>
    <strong>HTML</strong> — 定义网页的结构和内容
  </li>
  <li>
    <strong>CSS</strong> — 控制网页的样式和布局
  </li>
</ul>
</body>
</html>

🔢 有序列表

有序列表(Ordered List)表示各项内容之间存在明确的顺序关系,浏览器默认在每个 li 前显示数字编号。

ol 与 li

ol(Ordered List)的用法与 ul 类似,只是容器标签不同:

有序列表基本结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>有序列表基本结构</title>
</head>
<body>
<!-- 有序列表基本结构:ol 容器 + li 列表项 -->
<ol>
  <li>打开编辑器</li>
  <li>编写 HTML 文件</li>
  <li>在浏览器中打开预览</li>
</ol>
</body>
</html>

⚠️ 有序列表的编号是由浏览器自动生成的。如果用 CSS 去掉了默认样式,但内容本身有顺序语义,ol 仍然是正确的选择——语义不会因为样式的改变而消失。

有序列表的额外属性

MDN

ol 元素支持以下属性来控制编号行为,这些属性让有序列表更加灵活。

属性 说明 示例
reversed 倒序编号(布尔属性,无需赋值) <ol reversed>
start 指定起始编号 <ol start="5">
type 指定编号类型 <ol type="A">

type 属性支持的编号类型:

编号样式 示例
1(默认) 阿拉伯数字 1, 2, 3
A 大写字母 A, B, C
a 小写字母 a, b, c
I 大写罗马数字 I, II, III
i 小写罗马数字 i, ii, iii
从第 5 步开始的有序列表
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>从第 5 步开始的有序列表</title>
</head>
<body>
<!-- 从第 5 步开始的有序列表:使用 start 属性 -->
<p>接续上文的操作步骤:</p>
<ol start="5">
  <li>部署到测试环境</li>
  <li>执行自动化测试</li>
  <li>发布上线</li>
</ol>
</body>
</html>
使用 type 指定大写字母编号
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>使用 type 指定大写字母编号</title>
</head>
<body>
<!-- 使用 type 指定大写字母编号 -->
<ol type="A">
  <li>方案一:自研框架</li>
  <li>方案二:采用开源方案</li>
  <li>方案三:混合方案</li>
</ol>
</body>
</html>
倒序列表
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>倒序列表</title>
</head>
<body>
<!-- 倒序列表:使用 reversed 属性 -->
<p>最新发布的版本:</p>
<ol reversed>
  <li>v3.2.0</li>
  <li>v3.1.0</li>
  <li>v3.0.0</li>
</ol>
</body>
</html>

💡 reversed + start 可以组合使用,例如 <ol reversed start="10"> 会从 10 倒数到 1。

📖 描述列表

描述列表(Description List)用于展示术语与描述的配对关系。它由三部分组成:

  • dl(Description List)— 列表容器
  • dt(Description Term)— 术语 / 标题
  • dd(Description Details)— 描述 / 内容

dl / dt / dd

描述列表基本结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>描述列表基本结构</title>
</head>
<body>
<!-- 描述列表基本结构:dl 容器 + dt 术语 + dd 描述 -->
<dl>
  <dt>HTML</dt>
  <dd>超文本标记语言,用于定义网页的结构和内容。</dd>

  <dt>CSS</dt>
  <dd>层叠样式表,用于控制网页的视觉表现。</dd>

  <dt>JavaScript</dt>
  <dd>脚本语言,用于实现网页的交互行为。</dd>
</dl>
</body>
</html>

💡 一个 dt 可以对应多个 dd(一个术语有多个描述),多个 dt 也可以共用一个 dd(多个术语指向同一描述)。

一对多和多对一的描述列表
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>一对多和多对一的描述列表</title>
</head>
<body>
<!-- 一对多和多对一的描述列表 -->
<dl>
  <!-- 一个术语,多个描述 -->
  <dt>cookie</dt>
  <dd>一种小型文本文件,由服务器发送并存储在浏览器中。</dd>
  <dd>也指一种 Unix 中的网络请求工具。</dd>

  <!-- 多个术语,一个描述 -->
  <dt>JavaScript</dt>
  <dt>JS</dt>
  <dd>一种动态脚本语言,广泛用于 Web 前端开发。</dd>
</dl>
</body>
</html>

⚠️ dl 的直接子元素只能是 dtdd(以及脚本/模板元素)。不要在 dl 内直接嵌套其他标签。

🔗 列表嵌套

列表可以嵌套使用,即在 li 内部再放入一个完整的列表。嵌套时内层列表必须放在 li 标签内部,而不是 li 之间。

正确的嵌套写法
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>正确的嵌套写法</title>
</head>
<body>
<!-- 正确的嵌套写法:内层列表放在 li 内部 -->
<ul>
  <li>前端
    <ul>
      <li>HTML</li>
      <li>CSS</li>
      <li>JavaScript</li>
    </ul>
  </li>
  <li>后端
    <ul>
      <li>Java</li>
      <li>Python</li>
      <li>Go</li>
    </ul>
  </li>
</ul>
</body>
</html>

❌ 以下写法是错误的——内层 ul 放在了 li 的外面:

错误的嵌套写法——内层列表不在 li 内部
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>错误的嵌套写法</title>
</head>
<body>
<!-- 错误的嵌套写法:内层列表不在 li 内部 -->
<ul>
  <li>前端</li>
  <ul> <!-- ❌ ul 不能作为 ul 的直接子元素 -->
    <li>HTML</li>
  </ul>
</ul>
</body>
</html>

💡 不同类型的列表也可以互相嵌套,例如在 ol 中嵌套 ul 来展示步骤的细节:

有序列表中嵌套无序列表
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>有序列表中嵌套无序列表</title>
</head>
<body>
<!-- 有序列表中嵌套无序列表 -->
<ol>
  <li>安装依赖
    <ul>
      <li>npm install react</li>
      <li>npm install react-dom</li>
    </ul>
  </li>
  <li>创建组件</li>
  <li>启动开发服务器</li>
</ol>
</body>
</html>

⚠️ 嵌套层级建议不超过 3 层。过深的嵌套不仅影响可读性,也会给屏幕阅读器用户带来导航困难。

📊 列表使用场景对比

MDN

选择列表类型时,关注的是内容的语义关系,而非视觉呈现。如果需要更改列表的标记样式,应通过 CSS 实现,而不是更换列表类型。

场景 推荐列表 原因
功能特性清单 ul 各功能之间没有顺序关系
操作步骤 / 排行榜 ol 顺序本身就是关键信息
术语表 / FAQ dl 术语和描述是一对一的映射关系
导航菜单 ul(嵌套) 菜单项无先后顺序,嵌套表示层级
食谱步骤(含子步骤) ol(嵌套 ul 外层有序,内层补充细节无序

📝 小结:三种列表的分工可以用一句话概括——无序看项目、有序看顺序、描述看配对。在编写页面时,先问自己「这些内容之间是什么关系」,答案自然会指向合适的列表类型。