Menu

HTML 列表:无序列表、有序列表与嵌套列表

如何在 HTML 中创建列表:用 <ul> 做项目符号列表,用 <ol> 做编号列表(start、reversed、字母和罗马数字),嵌套列表,描述列表,以及用 CSS 设置或去掉项目符号。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

HTML 列表:ul、ol 和 li

HTML 有两种主要的列表。<ul>(无序列表)显示圆点,<ol>(有序列表)显示数字。每一项都是一个 <li>(列表项)。

当顺序有意义时(步骤、排名、目录)用 <ol>,没有意义时用 <ul>。屏幕阅读器会把两者都读作列表并报出项数,比如“列表,3 项”,所以真正的列表要比手动输入“•”或“1.”开头的文字行更好。

列表只能直接包含 <li> 元素。其他任何内容,包括标题、段落和其他列表,都要放在 <li> 里面。

项目符号样式

在 <ul> 上设置 list-style-type 可以改变项目符号。::marker 伪元素可以单独为项目符号或编号本身设置样式,与文字分开:

字符串值会把这段文字用作项目符号。"\2713 " 是一个对勾加一个空格:第一个空格只是用来结束 \2713 转义。::marker 只接受少数几个属性,主要是 color、font-size 和其他字体属性,不用额外的标记就能满足常见的“彩色圆点”需求。

有序列表:数字、字母和罗马数字

<ol> 有几个控制编号的属性:

属性示例结果
typetype="a"a、b、c(A、i、I 和 1 也可以)
startstart="5"从 5 开始计数
reversedreversed倒数
value(写在 <li> 上)<li value="10">这一项为 10,后面的项从这里继续

在 HTML 中使用 type 没有问题,因为字母可能带有含义(“选择选项 B”)。如果只是视觉上的改变,CSS 的 list-style-type: upper-alpha 或 lower-roman 也能做到同样的效果。

嵌套列表

子列表放在它所属的 <li> 里面,写在该项的文字之后。浏览器会在每一层换一种项目符号:实心圆、空心圆,然后是方块。

注意 </li> 的位置:“Frontend”这一项要到它的子列表之后才结束。如果在 <ul> 之前就结束它,子列表就会直接位于外层 <ul> 中,尽管看起来几乎一样,却是无效的。

有序列表的嵌套方式相同,每个子列表的编号都会从 1 重新开始。要得到 1.1、1.2 这样的编号,需要用到 CSS 计数器。

描述列表:dl、dt 和 dd

描述列表把术语和它们的描述配成对:术语表、订单详情、类似 FAQ 的问答。<dt> 是术语,<dd> 是描述:

一个术语可以有多个 <dd>,多个 <dt> 也可以共用一个 <dd>。浏览器默认会缩进 <dd>;上面的 margin 规则去掉了这个缩进。对于有多列的数据,表格更合适。

没有项目符号的列表:菜单和横向列表

导航菜单就是由链接组成的列表。用 list-style: none 去掉项目符号,用 padding: 0 去掉缩进,再用 flexbox 把各项排成一行:

对屏幕阅读器来说,它仍然是一个列表(“导航,列表,3 项”)。有一个例外:在 Safari 中使用 VoiceOver 时,去掉项目符号后列表的语义可能会丢失。如果项数对你的用户很重要,就给 <ul> 加上 role="list"。

默认间距

浏览器会给列表设置 1em 的上下外边距,并用 padding-inline-start: 40px 缩进,项目符号就位于这段缩进中。这个内边距在起始一侧,所以在从右到左的语言中,项目符号和缩进会自动移到另一侧。去掉内边距后,项目符号会移到列表盒子之外,可能会被截掉;要么保留一些内边距,要么使用 list-style-position: inside。

常见错误

  • <li> 没有父列表。 它必须位于 <ul>、<ol> 或 <menu> 之中。
  • 嵌套列表放在了它的 <li> 之外。 把子列表放进它所属的项目里。
  • 文字或其他标签直接放在 <ul> 中,比如 <ul><p>Note</p><li>...</li></ul>。把它们移到 <li> 中,或者移出列表。
  • 用 • 和 <br> 手动输入项目符号或编号。 屏幕阅读器听到的是一个段落,而不是列表。
  • 写了 list-style: none 却没有写 padding: 0,留下一段莫名其妙的 40 像素缩进。
  • 只为了外观而使用 <ol>。 如果顺序无关紧要,就用 <ul> 再加样式。

常见问题

如何在 HTML 中创建项目符号列表?

使用无序列表:<ul> 中每个项目一个 <li>,例如 <ul><li>Milk</li><li>Eggs</li></ul>。浏览器会在每一项前面画一个圆点,并让列表缩进。

ul 和 ol 有什么区别?

<ul> 是无序列表,用圆点显示,适合顺序无关紧要的项目。<ol> 是有序列表,用数字显示,适合顺序很重要的步骤和排名。两者都包含 <li> 项目。

如何去掉 HTML 列表前面的圆点?

在 CSS 中给 <ul> 设置 list-style: none。同时设置 padding-inline-start: 0(或 padding: 0),去掉浏览器为圆点留出的缩进。

如何让有序列表从其他数字开始编号?

使用 start 属性:<ol start="5"> 会让第一项编号为 5。reversed 会改为倒数,<li> 上的 value 则设置该项及其后各项的编号。

如何在 HTML 中创建嵌套列表?

把内层的 <ul> 或 <ol> 放在外层列表的某个 <li> 中,写在该项的文字之后。直接放在另一个 <ul> 中、夹在 <li> 元素之间的列表是无效的。

Coddy 编程语言插图

和 Coddy 一起学编程

开始