无序列表
无序列表是文档里使用频率最高的语法:几个并列的要点、几步操作、一串文件清单,读者需要一眼看出「它们是并列的」。语法本身只有一行——一个符号加一个空格——但正因为简单,它和强调、和水平分割线、和斜体共享着同一批符号,边界条件比看上去多。这一页要把「符号后面必须有空格」这条硬规则讲清楚,顺带说清紧贴列表和松散列表的区别。
行首写一个短横线、一个星号或一个加号,后面跟一个空格,然后是内容:
- 项目 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」属于子项,需要缩进到父项的内容起始列之后——- 占两列,所以子项缩进两个空格即可。
详细步骤:
- 每一行要点前面写
-加一个空格:- 安装依赖。符号后那个空格是硬性要求,漏了整行就退化成普通文字。 - 「先执行 pnpm install」是「安装依赖」的子项,缩进两个空格再写
- 先执行 pnpm install。父项-的内容从第三列开始,子项必须对齐到这一列或更右,才会被认作子项。 - 「配置环境变量」及其子项回到顶层缩进,「启动开发服务器」同理。三条要点保持在同一个列表里,符号统一用短横线。
- 检验:渲染后是一个三行的无序列表,第一项下面挂着一个子项,其余两项是平级。
最终答案:
- 安装依赖
- 先执行 `pnpm install`
- 配置环境变量
- 复制 `.env.example` 为 `.env.local`
- 启动开发服务器读完这一页,你应当能写出用三种符号之一的无序列表,能解释符号后那个空格为什么不能省,能区分紧贴列表和松散列表,也能在「列表变成两段」时想到是符号换掉了。接下来列要点时,你会下意识地统一符号、把子项对齐到正确的列,而不是随手敲几个空格。
