跳转到内容

Markdown 语法速查

Markdown 最初没有严格的规范,不同渲染器对同一段文本的处理常常不一致。现在通用的基础是 CommonMark 规范,GitHub 在它之上扩展出 GFM(GitHub Flavored Markdown),增加了表格、任务列表、删除线、自动链接等语法。这篇按这两份规范整理常用语法,并标出容易写错的细节,方便写文档时查阅。

每一项先给出源码,必要时给出渲染效果。标注“GFM”的语法不属于 CommonMark,在只支持 CommonMark 的渲染器里可能不生效。

ATX 风格:行首 1–6 个 #,后面必须跟一个空格。

# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

另一种 Setext 风格只支持一、二级标题,在文字下一行写 = 或 -:

一级标题
========
二级标题
--------

注意事项:

  • #标题(没有空格)在 CommonMark 中不会被识别为标题,会原样输出。
  • 一篇文档通常只有一个一级标题。很多文档站点(包括本站)用页面元数据里的标题渲染一级标题,正文从二级标题开始。
  • 标题层级不要跳级,比如从 ## 直接跳到 ####,会影响目录生成和可访问性。

段落之间用空行分隔。段落内部的单个换行在渲染时会变成空格,不会换行:

这是第一行
这一行会和上一行连在一起显示。
空一行之后是新段落。

需要在段落内强制换行(生成 <br>),有两种写法:

行尾加两个空格··
下一行(·代表空格)
行尾加反斜杠\
下一行

行尾空格肉眼看不见,也容易被编辑器的“删除行尾空格”功能清掉,推荐用反斜杠。

*斜体* 或 _斜体_
**粗体** 或 __粗体__
***粗斜体***
~~删除线~~(GFM)

效果:斜体、粗体、粗斜体、删除线。

注意事项:

  • 下划线在单词内部不会触发强调,snake_case_name 会原样显示;星号可以,un*frigging*believable 中间部分会变成斜体。所以给单词中间的一部分加强调时用星号。
  • 强调标记与内容之间不能有空格,** 粗体 ** 不会生效。
  • 中文与强调标记相邻时,部分渲染器对 ** 两侧紧贴标点的情况处理不一致,遇到不生效时,可以在标记外侧加空格,或调整标点位置。

用 -、* 或 + 开头,后面跟空格。同一个列表里保持使用同一种符号,混用会被拆成多个列表。

- 苹果
- 香蕉
- 嵌套项要缩进到父项内容的起始位置
- 这里是两个空格
- 橙子

数字加 . 或 ),后面跟空格。渲染结果只取第一个数字作为起始编号,后面的数字会被忽略:

1. 第一步
1. 第二步
1. 第三步
3. 从 3 开始编号
4. 接着是 4

全部写成 1. 的好处是插入、删除条目时不用重新编号。

列表项内的段落、代码块要缩进到与该项内容起始位置对齐。1. 占三个字符,所以后续内容缩进三个空格:

1. 安装依赖:
```bash
npm install
```
2. 启动开发服务器。

缩进不够时,代码块会跑出列表,后面的编号也会重新从 1 开始。

- [x] 完成需求评审
- [ ] 编写单元测试
- [ ] 提交合并请求

效果:

  • 完成需求评审
  • 编写单元测试
  • 提交合并请求

方括号里是一个空格(未完成)或 x(已完成)。在 GitHub 的 issue 和合并请求描述中可以直接点击勾选;在普通网页中只是静态显示。

[链接文字](https://example.com)
[带标题的链接](https://example.com "鼠标悬停时显示")
[站内相对链接](./other-page.md)
[跳转到本页的某个标题](#表格)

锚点链接中的 # 后面是标题生成的 id。不同平台生成 id 的规则不同(大小写、空格、中文的处理),写之前最好在渲染结果中确认一下。

链接多、地址长时,可以把地址集中写在文末,正文更易读:

详细说明见 [官方文档][docs] 和 [规范][spec]。
[docs]: https://example.com/docs
[spec]: https://spec.commonmark.org/
<https://example.com>
<user@example.com>
https://example.com(GFM:不加尖括号也会自动识别为链接)

在链接语法前加 !:

![图片的替代文字](./images/architecture.png "可选的标题")
![远程图片](https://example.com/logo.png)

方括号里的替代文字(alt)在图片加载失败时显示,也会被读屏软件读出,应当写清图片内容。

Markdown 语法本身不能指定图片尺寸,需要控制宽高时使用 HTML:

<img src="./images/architecture.png" alt="系统架构图" width="480" />

给图片加链接(点击图片跳转):

[![项目 Logo](./logo.png)](https://example.com)
> 这是一段引用。
> 同一段引用的第二行。
>
> 引用中的第二个段落。
>
> > 嵌套引用,再加一个 `>`。

效果:

这是一段引用。 同一段引用的第二行。

引用中的第二个段落。

嵌套引用,再加一个 >。

引用内部可以使用列表、代码块等其他语法。两段引用之间如果没有空行隔开,会被合并成同一段引用。

运行 `npm install` 安装依赖。

代码本身包含反引号时,用更多的反引号包裹,并在内侧加空格:

`` 用 `code` 表示行内代码 ``

用三个反引号(或三个波浪线 ~~~)包裹,开头写上语言名称以启用语法高亮:

```js
const sum = (a, b) => a + b;
```

注意事项:

  • 语言名称不属于规范强制的内容,具体支持哪些语言取决于渲染器使用的高亮库。常用的有 js、ts、jsx、json、css、html、bash、markdown、diff。
  • 要在代码块中展示包含三个反引号的内容,外层改用四个反引号,或者改用 ~~~。本文中展示代码块写法的例子都是这样做的。
  • CommonMark 也支持用 4 个空格缩进表示代码块,但它无法标注语言,并且容易和列表缩进混淆,建议统一使用反引号围栏。
| 名称 | 类型 | 说明 |
| :--- | :---: | ---: |
| id | number | 左对齐、居中、右对齐 |
| name | string | 由分隔行的冒号决定 |

效果:

名称 类型 说明
id number 左对齐、居中、右对齐
name string 由分隔行的冒号决定

规则:

  • 第二行是分隔行,每列至少一个 -。冒号控制对齐::--- 左对齐(默认),:---: 居中,---: 右对齐。
  • 首尾的 | 可以省略,但写上更清楚。各列不需要对齐,对齐只是为了源码好看。
  • 单元格内容里有 | 时要写成 \|。
  • 单元格内不能直接换行,也不能放列表、代码块等块级内容;需要换行时可以写 <br>(前提是渲染器允许内嵌 HTML)。

单独一行写三个或以上的 -、* 或 _:

---
***
___

注意:--- 如果紧跟在一行文字下面,会把那行文字变成二级标题(Setext 风格)。分隔线上方应留一个空行。

在有特殊含义的字符前加反斜杠 \,让它按普通字符显示:

\*不是斜体\*
1986\. 这不是有序列表
\# 这不是标题

可以转义的字符都是 ASCII 标点,常用的有:

\ ` * _ { } [ ] < > ( ) # + - . ! |

代码(行内代码和代码块)内部的内容不需要转义,会原样显示。

Markdown 中可以直接写 HTML,用来实现 Markdown 本身不支持的效果,例如折叠内容:

<details>
<summary>点击展开</summary>
这里的内容默认折叠。HTML 块与 Markdown 内容之间要留空行,
否则其中的 Markdown 语法可能不会被解析。
</details>

其他常见用途:<kbd>Ctrl</kbd> 表示按键,<sup> / <sub> 表示上下标,<img> 控制图片尺寸。

注意事项:

  • 是否允许内嵌 HTML 由渲染器和平台决定。出于安全考虑,很多平台会过滤 HTML:GFM 规范会禁用 <script>、<style>、<iframe>、<textarea>、<title> 等标签,GitHub 还会去掉 style 属性和事件属性。
  • 在 HTML 块内部,Markdown 语法通常不会被解析,除非 HTML 标签与 Markdown 内容之间隔着空行(如上例)。
Markdown 由 John Gruber 设计[^1],CommonMark 对它做了规范化[^spec]。
[^1]: 发布于 2004 年。
[^spec]: 详见 https://spec.commonmark.org/

渲染后,正文中的 [^1] 显示为上标编号,脚注内容统一列在文档末尾,并带有返回正文的链接。脚注的标识可以是数字或单词,最终显示的编号按出现顺序自动生成。

同一份 Markdown 在不同地方显示效果不同,通常是因为:

  • 规范不同:只支持 CommonMark 的渲染器不认识表格、任务列表、删除线。
  • 扩展不同:数学公式($...$)、流程图(如 Mermaid 代码块)、提示块(如 > [!NOTE])、目录标记([TOC])都是各平台的扩展,没有统一标准。例如 GitHub 支持在 mermaid 代码块中画图,但在其他平台上它可能只显示为普通代码块。
  • HTML 过滤策略不同:见上一节。

写需要在多个平台显示的文档时,尽量只用 CommonMark 加 GFM 的语法;用到扩展语法时,确认目标平台支持。

  • 以 CommonMark 为基础,GFM 增加了表格、任务列表、删除线和自动链接;脚注、数学公式、流程图属于平台扩展。
  • 标题的 # 后要有空格;段落用空行分隔,段内强制换行推荐用行尾反斜杠。
  • 列表嵌套和列表中的代码块要缩进到父项内容的起始位置;有序列表只有第一个数字决定起始编号。
  • 代码块标注语言;展示含三个反引号的内容时外层用四个反引号。
  • 表格靠分隔行的冒号控制对齐,单元格中的 | 要转义。
  • 内嵌 HTML 能补足 Markdown 的不足,但是否生效取决于平台的过滤策略。