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> 有几个控制编号的属性:
| 属性 | 示例 | 结果 |
|---|---|---|
type | type="a" | a、b、c(A、i、I 和 1 也可以) |
start | start="5" | 从 5 开始计数 |
reversed | reversed | 倒数 |
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> 元素之间的列表是无效的。