无序列表

无序列表是文档里使用频率最高的语法:几个并列的要点、几步操作、一串文件清单,读者需要一眼看出「它们是并列的」。语法本身只有一行——一个符号加一个空格——但正因为简单,它和强调、和水平分割线、和斜体共享着同一批符号,边界条件比看上去多。这一页要把「符号后面必须有空格」这条硬规则讲清楚,顺带说清紧贴列表和松散列表的区别。

语法

行首写一个短横线、一个星号或一个加号,后面跟一个空格,然后是内容:

- 项目 1
- 项目 2
- 项目 3
<ul>
<li>项目 1</li>
<li>项目 2</li>
<li>项目 3</li>
</ul>

三个符号完全等价,渲染出来都是同一种 <ul>。选哪个都行,但一篇文档里最好只用一种——这不是规范要求,而是可读性要求:混用符号会让读者以为不同符号代表不同含义,比如以为 * 那一组是「次要要点」。

空格不能省

符号后面必须至少有一个空格,否则这一行就不是列表项,而是普通文字:

-有空格的是列表
-没有空格的不是列表
<p>-有空格的是列表
-没有空格的不是列表</p>

这条规则是硬性的,也是列表和强调的分水岭。行首的 * 会被读成列表,而 *文字* 才是强调——区别只在那一个空格。

紧贴列表与松散列表

列表项之间加空行,渲染出来的每个列表项会被 <p> 包起来,条目之间也会留出间距;不加空行则是紧贴的紧凑列表:

- 第一项
- 第二项
<ul>
<li>第一项</li>
<li>第二项</li>
</ul>

两种写法在视觉上差别不大,但语义上略有分别:紧凑列表像一个整体清单,松散列表像几个各自独立的条目。写「几个并列的要点」用紧凑的,写「每一点下面要展开说明」用松散的。

常见坑

写法实际渲染原因
- 项目列表项基本用法
-项目普通文字符号后必须有空格
- 项目 混用 * 项目两个独立的列表换符号等于另起一个列表
- 项目 后跟普通文字行并入上一项列表项支持懒延续
列表项内再缩进六格变成代码块超过内容起始列四格即为代码块

练习

把下面这段内容改写成 Markdown,要求:三个要点用一个无序列表表示,符号后面要有空格;第一个要点下面要展开一条子项;子项用缩进体现层级。

安装依赖
  先执行 pnpm install
配置环境变量
  复制 .env.example 为 .env.local
启动开发服务器
嵌套缩进

解题思路: 三个并列要点用一个无序列表表示,符号后必须有一个空格,否则整行会被当成普通文字。第一个要点下面的「先执行 pnpm install」属于子项,需要缩进到父项的内容起始列之后——- 占两列,所以子项缩进两个空格即可。

详细步骤:

  1. 每一行要点前面写 - 加一个空格:- 安装依赖。符号后那个空格是硬性要求,漏了整行就退化成普通文字。
  2. 「先执行 pnpm install」是「安装依赖」的子项,缩进两个空格再写 - 先执行 pnpm install。父项 - 的内容从第三列开始,子项必须对齐到这一列或更右,才会被认作子项。
  3. 「配置环境变量」及其子项回到顶层缩进,「启动开发服务器」同理。三条要点保持在同一个列表里,符号统一用短横线。
  4. 检验:渲染后是一个三行的无序列表,第一项下面挂着一个子项,其余两项是平级。

最终答案:

- 安装依赖
  - 先执行 `pnpm install`
- 配置环境变量
  - 复制 `.env.example` 为 `.env.local`
- 启动开发服务器

小结

读完这一页,你应当能写出用三种符号之一的无序列表,能解释符号后那个空格为什么不能省,能区分紧贴列表和松散列表,也能在「列表变成两段」时想到是符号换掉了。接下来列要点时,你会下意识地统一符号、把子项对齐到正确的列,而不是随手敲几个空格。

发现内容有问题?

告诉我们哪里需要改进。