Markdown 快速入门指南
目录 28 节
Markdown 是一种看似简单、但在今天依然高度重要的写作格式。它以极低的学习成本,解决了结构化写作、跨平台兼容和长期可维护性的问题,并逐渐成为技术文档与工具协作中在事实上的通用语言。
在这篇文章中,你将快速了解 Markdown 是什么、为什么值得使用,以及最核心、最通用的一组基础语法。内容以“能立即上手”为目标,只覆盖几乎所有平台都支持的写法,避免不必要的复杂性。无论你是第一次接触 Markdown,还是希望系统梳理已有认知,都可以将这篇文章作为一份可靠的起点。
什么是 Markdown?
Markdown 是一种轻量级标记语言,用于以“纯文本”的方式编写结构化内容。它通过少量、直观的符号来表达标题、段落、列表、引用、代码等常见文档结构,使内容在“可读性”和“可渲染性”之间取得平衡。
Markdown 最早由 John Gruber 于 2004 年提出,其核心目标非常明确:让人类更容易写,让机器更容易转。在未渲染的状态下,Markdown 文件依然是清晰、易读的纯文本;而在需要展示时,又可以被快速转换为 HTML、PDF、Word 等多种格式。
从技术文档、博客、README,到笔记、邮件草稿甚至书籍写作,Markdown 已成为事实上的通用写作格式之一。GitHub、Notion、Ulysses、Obsidian、Typora 等大量平台和工具都原生支持 Markdown,这也是它能够长期流行的关键原因。
Markdown 并不是为了排版炫技,而是为了专注内容本身。
为什么要使用 Markdown?
在当下 Markdown 已经成为一种事实上的通用内容格式。到了 AI 快速发展的今天,无论是 ChatGPT、Gemini、Claude 这类通用模型,还是各类自动化工具、AI agents 与 skills,几乎都能够稳定地接受和输出 Markdown。
由于 Markdown 本质上就是“纯文本”,机器能够方便地接收和处理所有内容;而相比于“纯”文本,Markdown 能明确表达更多附加含义。标题、列表、代码、引用等各项层级结构在文本中是清晰可见的,这不仅让人更容易阅读,也让工具和模型更容易理解内容的意图与结构。在内容生成、整理、转换和再利用的过程中,这种结构化表达能显著减少歧义和信息损耗。
随着自动化和 agent 的快速发展,越来越多的流程不再只处理“文字”,而是处理“有结构的内容”。Markdown 正好处在一个理想的位置:它足够简单,仍然是纯文本;同时又足够规范,能够承载清晰的语义和层级关系。这也是为什么大量工具都选择 Markdown 作为中间格式或默认输出。
对普通用户来说,掌握 Markdown 意味着你写下的内容不仅是给人看的,也是给工具和系统用的。同一份内容,可以被阅读、被搜索、被版本管理,也可以被模型理解和自动处理,而不需要额外的转换成本。这正是 Markdown 在今天仍然重要、并且越来越重要的原因。
如何使用 Markdown?
最基础的使用方式如下:
- 创建一个以
.md或.markdown结尾的文件; - 使用“任意”文本编辑器进行书写;
- 如果想要其变为富文本格式,则通过支持 Markdown 的工具或平台进行预览或发布。
学习 Markdown 的成本极低。你不需要记住复杂的语法规则,只需掌握少量常用标记,就可以覆盖绝大多数写作需求。随着使用频率的增加,其语法会逐渐内化为肌肉记忆,几乎不再需要刻意思考。
需要注意的是,当一个网站或工具声称自己“支持 Markdown”时,实际支持的语法范围并不一定完全一致。Markdown 在诞生之初并没有一个严格统一的官方标准,随着使用场景的扩展,逐渐出现了不同实现和变体,在基础语法之上叠加了各自的扩展语法。这也导致了同一段 Markdown 内容,在不同平台上的渲染结果可能存在细微差异。
不过,大多数差异都集中在扩展能力上,例如表格、任务列表、脚注或更复杂的排版形式。以下将以最通用、最稳定的基础语法为核心,只介绍几乎所有 Markdown 实现都支持的写法。这些内容已经可以覆盖日常写作中 99% 的使用场景,足以应对文档、笔记和大多数工具协作需求。
速查表 (基本语法)
这些是 John Gruber 原始设计文档中所描述的元素,所有 Markdown 处理器都支持这些元素。以下表格中仅列出了各元素最常用的书写方式,如果要了解所有详细的语法和使用方式,请参考下文关于 Markdown 的基本语法的介绍。
Element
Markdown Syntax
# Heading 1## Heading 2### Heading 3#### Heading 4##### Heading 5###### Heading 6
_Emphasized or italic text_
**Strong or bold text**
[Link text](https://example.com "optional title")

- First item- Second item- Third item
1. First item2. Second item3. Third item
> This is a blockquote.
`Inline code`
---
[!NOTE] 还有一些元素是由不同的解析器通过添加额外扩展来实现的,例如表格、脚注以及更复杂的代码块等,但并非所有 Markdown 处理器都支持这些元素。如果要了解所有详细的语法和使用方式,请参考这篇关于 Markdown 的扩展语法的介绍。
Markdown 的基本语法
Markdown 的基本语法指的是最早由 John Gruber 在原始设计中定义、并被几乎所有 Markdown 解析器所支持的一组写法。这些语法构成了 Markdown 最稳定、最通用的核心能力,也是不同实现之间交集最大的一部分。
它们的共同特点是:规则简单、语义明确、跨平台一致性高。无论在什么样的平台或工具中,这些写法几乎都可以被正确识别和渲染,很少出现兼容性问题。
这一部分将围绕这些基础语法展开说明,展示它们如何书写、如何表现,以及在实际写作中各自适合解决什么问题。掌握这一部分内容,已经足以覆盖绝大多数日常写作、文档整理和工具协作等场景。后续即使遇到不同平台的语法差异,也能始终有一个可靠的通用基线。
段落与换行 (paragraphs and line breaks)
在 Markdown 中,段落只需直接输入普通文本,不需要额外格式,不同段落之间保留一个空行即可分隔。
这是第一段文本,在行尾使用反斜线换行;\
这是同一个段落中的第二行,在行尾使用两个空格换行(比如这里);
保持在同一个段落中换行,只需要在行尾增加“\”或两个空格“ ”,并且行与行之间不要出现空行;\
\
想要保持在同一个段落内增加换行,也需要书写反斜线或两个空格。这还是属于第一个段落。
这才是另一个段落。
一般我个人更习惯于使用 \ 而不是两个空格,因为这样可以更显式地表明我希望在这里添加一个换行符 <br>,使用两个空格就不易直观地看到。
当渲染为 HTML 时,其效果类似于下面这样:
这是第一段文本,在行尾使用反斜线换行;
这是同一个段落中的第二行,在行尾使用两个空格换行(比如这里);
保持在同一个段落中换行,只需要在行尾增加“\”或两个空格“ ”,并且行与行之间不要出现空行;
想要保持在同一个段落内增加换行,也需要书写反斜线或两个空格。这还是属于第一个段落。
这才是另一个段落。
标题 (headings)
标题用 # 表示层级,# 越多层级越小。通常用于文档结构组织。
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
在 HTML 中的渲染效果相当于 <h1> 到 <h6> 结构,有利于阅读和自动生成目录。
一级标题
二级标题
三级标题
四级标题
五级标题
六级标题
特别地,对于一级和二级标题,也可以使用 Setext 风格来书写,即使用 = 和 - 来表示标题级别:
Heading 1
=========
Heading 2
---------
从语法来讲,在标题文本下方使用至少一个 = 或 - 即可,但一般为了便于识别和阅读,会使用多个 = 或 - 来表示标题级别。而从 heading 3–6 开始,则必须使用 # 来表示标题级别。
强调文本 (emphasized text)
Markdown 将星号 * 和下划线 _ 视为用于强调的符号。
- 用一个
*或_包裹的文本将在 HTML 中渲染为使用<em>标签包裹; - 用两个
*或_包裹的文本将在 HTML 中渲染为使用<strong>标签包裹; - 用三个
*或_包裹的文本将在 HTML 中渲染为使用<strong>中嵌套<em>标签包裹,相当于上述两种强调方式的叠加。
例如,这个输入:
// 强调文本,被 HTML 渲染为 <em>,通常其显示效果类似于 <i>
_emphasized text_ // Recommended
*emphasized text*
// 重要文本,被 HTML 渲染为 <strong>,通常其显示效果类似于 <b>
**strong important text** // Recommended
__strong important text__
// 强调且重要的文本,等同于 <strong> 中嵌套 <em>
**_text with emphasis and strong importance_** // Recommended
___text with emphasis and strong importance___
***text with emphasis and strong importance***
将产生这样的效果:
emphasized text
important text
text with emphasis and strong importance
可以看到,* 和 _ 所表示的含义是相同的,只是符号不同。因而每个人可能用不同的书写习惯。对我个人而言,更倾向于使用 _ 专门表示 <em> 即产生斜体效果的含义,使用 ** 专门表示 <strong> 即产生粗体效果的含义,这样在阅读起来更加直观,不用刻意在意符号的数量。
链接 (links)
Markdown 支持两种链接风格:内联和引用参考。
一般地,链接显示文本和 URL 以 [link text](https://example.com "optional title") 这样的形式来内联书写,其中 optional title 是可选的。它在 HTML 中被渲染为 <a href="https://example.com" title="optional title">link text</a>。
使用频率不高但也支持的写法是通过引用参考的方式来书写链接,这通常用于需要重复使用同一个链接的场景,例如:
[link text][id] // 其中 id 不区分大小写,建议使用小写
[id]: https://example.com "optional title"
// 或者使用更简略的写法:
[link text][]
[link text]: https://example.com "optional title"
例如,这个输入:
通常使用内联的方式使 [Apple](https://www.apple.com "Apple") 成为链接,这更加方便。
但如果需要重复使用同一个链接,比如在 [Google][google-link] 和 [Google Search][google-link] 中都使用同一个链接,则可以使用引用参考的方式。
[google-link]: https://www.google.com "Google"
将产生这样的效果:
通常使用内联的方式使 Apple 成为链接,这更加方便。
但如果需要重复使用同一个链接,比如在 Google 和 Google Search 中都使用同一个链接,则可以使用引用参考的方式。
图片 (images)
图片语法与链接类似,在前面加 ! 表示嵌入图片,而不是链接,它在 HTML 中被渲染为 <img src="https://example.com/image.png" alt="alt text" title="optional title" />。其中,alt text 和 "optional title" 都是可选的。例如:
 // 最简单的形式,不包含 alt text 和 optional title

// 如果需要重复使用同一张图片,则可以使用类似于链接的引用参考的方式:
![alt text][id]
[id]: https://example.com/image.png "optional title"
上述属于在被解析为 HTML 代码时相当于:
<p><img src="https://example.com/image.png" alt /></p>
<p><img src="https://example.com/image.png" alt="alt text" title="optional title" /></p>
<p><img src="https://example.com/image.png" alt="alt text" title="optional title" /></p>
特别地,如果需要在图片上添加链接,则可以通过嵌套实现,例如:
[](https://example.com "optional link title")
列表 (lists)
列表用于表达并列关系或顺序关系,是文档中非常常见的结构。Markdown 支持无序列表和有序列表,两者都可以通过 4 个空格或 1 个 tab 制表符缩进形成嵌套层级。
无序列表 (unordered lists)
无序列表使用 -、+ 或 * 作为列表标记,这三种符号在语义和渲染结果上完全等价。但通常建议在同一份文档中保持统一风格,以提高可读性。
- Red
- Green
- Blue
相当于:
+ Red
+ Green
+ Blue
或:
* Red
* Green
* Blue
它们均可以渲染为这样的效果:
- Red
- Green
- Blue
有序列表 (ordered lists)
有序列表使用数字序号加英文句号 . 和空格表示,即由“数字–英文句号–空格”这样的结构开头的一行将被识别为一个有序列表的列表项。例如:
1. John
2. Davic
3. Susan
需要注意的是,用于标记列表的实际数字对 Markdown 生成的 HTML 输出没有影响。即使是写成完全相同的数字或使用乱序序号,渲染结果依然会自动递增。
这意味着,无论是:
1. John
1. David
1. Susan
还是:
3. John
1. David
2. Susan
上述这几种有序列表所渲染得到的 HTML 结果都是相同的:
- John
- David
- Susan
复杂列表的嵌套 (nested lists)
无论是无序列表还是有序列表,都可以通过缩进的方式形成嵌套层级,甚至可以混合嵌套使用多种列表类型。例如:
- Fruits
1. Apple
2. Banana
- Vegetables
1. Carrot
2. Potato
3. Tomato
- Drinks
- Coffee
- Juice
- Tea
将得到这样的效果:
- Fruits
- Vegetables
- Drinks
- Coffee
- Juice
- Tea
列表项目 <li> 也可以由多个段落组成,或嵌套引用文本块或代码块等。列表项中的每个后续段落必须用 4 个空格或 1 个制表符缩进:
* 这是一个只有一个段落的列表项。\
这里只是进行了换行,并没有增加新的段落。相当于使用了 <br> 标签。
* 这是一个带有两个段落的列表项。
这是列表项中的第二个段落。在列表中缩进,可以保持在同一个列表项中增加多个段落。也就是在同一对 <li> 中嵌套多个 <p> 标签。
* 这是一个带有引用文本块的列表项:
> 这是一个引用文本块,位于列表项中。
* 这是一个带有代码块的列表项:
console.log("Hello, world!");
在 HTML 中将渲染为:
-
这是一个只有一个段落的列表项。
这里只是进行了换行,并没有增加新的段落。相当于使用了 <br> 标签。
-
这是一个带有两个段落的列表项。
这是列表项中的第二个段落。在列表中缩进,可以保持在同一个列表项中增加多个段落。也就是在同一对 <li> 中嵌套多个 <p> 标签。
-
这是一个带有引用文本块的列表项。
这是一个引用文本块,位于列表项中。
-
这是一个带有代码块的列表项。
console.log("Hello, world!");
事实上,如果在两个列表项之间增加一个空行,则会被解析为每个列表项中都嵌套有一个独立的段落。例如:
这是一个有空行的列表:
- 这是第一个列表项,其中包含有一个段落。
- 这是第二个列表项,其中包含有另一个段落。
相比较而言,这是一个没有空行的列表,其中是没有段落的:
- 这是第一个列表项
- 这是第二个列表项
在 HTML 中将被解析为这样的结构:
<p>这是一个有空行的列表:</p>
<ul>
<li><p>这是第一个列表项,其中包含有一个段落。</p></li>
<li><p>这是第二个列表项,其中包含有另一个段落。</p></li>
</ul>
<p>相比较而言,这是一个没有空行的列表,其中是没有段落的:</p>
<ul>
<li>这是第一个列表项</li>
<li>这是第二个列表项</li>
</ul>
引用文本块 (blockquote)
受到电子邮件引用格式的启发,Markdown 使用相同的符号 > 来表示引用文本块(blockquote)。例如:
> 这是一段引用文本。
> 如果你需要在引用块内换行,则需要在新行开头添加 `>`。
> 否则,渲染时会将其视为一个新的段落或新的引用块。
>
> 因而,想要在引用块内增加空行,也需要在新行开头添加 `>`。
如果想要增加引用层级,用以表示“引用中的引用”,则可以通过增加 > 来实现,例如:
> 这是一段引用文本。
>
> > 这是嵌套的引用文本。
> >
> > 会通过增加缩进量来表示增加一个引用层级。
>
> 继续回到上一级引用。
将产生这样的效果:
这是一段引用文本。
这是嵌套的引用文本。
会通过增加缩进量来表示增加一个引用层级。
继续回到上一级引用。
在引用文本块中也可以包含其他 Markdown 元素,包括标题、列表和代码块等。例如:
可以在 blockquote 中插入其他类型的 Markdown 元素。
> ## 这是一个标题
>
> 1. 这是列表中的第一个项目
> 2. 这是列表中的第二个项目
>
> 这是一段示例代码:
>
> console.log("Hello, world!");
将产生这样的效果:
可以在 blockquote 中插入其他类型的 Markdown 元素。
这是一个标题
- 这是有序列表中的第一个项目
- 这是有序列表中的第二个项目
也可以在 blockquote 中插入代码块:
console.log("Hello, world!");
代码 (code)
行内代码 (inline code)
要在文本中间内联引用一段代码,需要使用反引号 `` 包裹,它将作为 HTML 中的 <code>` 标签包裹其中的内容,例如:
使用 `console.log("Hello, world!")` 输出一行日志。
使用 console.log("Hello, world!") 输出一行日志。
代码块 (code block)
如果要以代码块的形式引用一段代码,Markdown 的基本语法支持使用 4 个空格或 1 个制表符进行缩进,例如:
使用 4 个空格或 1 个制表符缩进的方式引用代码块:
{
"firstName": "John",
"lastName": "Smith",
"age": 25
}
回到上一级段落。
将得到这样的效果:
使用 4 个空格或 1 个制表符缩进的方式引用代码块:
{ "firstName": "John", "lastName": "Smith", "age": 25}
回到上一级段落。
内联 HTML
在渲染为 HTML 时将显示为:
HTML 标签也可以在 Markdown 中直接使用。
例如 <span>、<cite> 或 <del> 等类似的行级(inline-level)HTML 元素,可以在 Markdown 中的段落、列表项或标题的任何地方使用。也可以直接 <a> 或 <img> 标签替换 Markdown 格式。
而例如 <div>、<table>、<pre>、<p> 等类似的块级(block-level)元素则存在一定的限制,必须将其用空行与其他内容分开,并且块的开始和结束标签不可以使用制表符或空格缩进,以避免被解析为代码块。
这是一个段落。
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Gender</th>
</tr>
</thead>
<tbody>
<tr>
<td>John</td>
<td>25</td>
<td>Male</td>
</tr>
<tr>
<td>David</td>
<td>26</td>
<td>Male</td>
</tr>
<tr>
<td>Susan</td>
<td>27</td>
<td>Female</td>
</tr>
</tbody>
</table>
这是另一个段落。
在渲染为 HTML 时将显示为:
这是一个段落。
Name
Age
Gender
John
25
Male
David
26
Male
Susan
27
Female
这是另一个段落。
[!TIP] Markdown 格式语法通常不会在块级 HTML 标签中处理。换言之,不可以在任何 HTML 块级元素中使用 Markdown 风格的
_emphasized text_或以 Markdown 语法添加[链接](https://example.com)或图片等。(但有些现代解析器也对这种情况增加了扩展支持,但为了保持通用性,仍然不建议在 HTML 块中插入 Markdown。)
水平分隔线
可以通过在一行中书写至少 3 个连字符 -、星号 * 或下划线 _ 来插入分隔线,在 HTML 中将渲染为 <hr> 标签。例如以下方式都可以生成分隔线:
--- // Recommended
* * *
______
如果需要了解更多…
到这里,本文已经覆盖了 Markdown 中最通用、最稳定的一组语法规则。这些基础语法几乎在所有平台和工具中都能可靠工作,足以应对日常写作、文档整理以及大多数协作场景。
但在实际使用中,很多人很快会接触到更丰富的表达需求,例如表格、任务列表、脚注、更复杂的代码展示,或针对特定平台的增强能力。这些内容通常依赖于不同的扩展语法实现,也正是 Markdown 在不同“口味”(flavor)之间产生差异的地方。
为了保持本文作为“快速入门”能够帮你以简明的方式理解 Markdown,这里不继续展开这些高级用法。在下一篇文章中,将专门围绕常见的扩展语法展开,结合 GFM、CommonMark 扩展等主流实现,系统说明它们各自的用途、支持情况以及在实际使用中需要注意的边界问题。
如果你已经熟悉本文中的基础内容,不妨从这里继续。
原文:https://cherysunzhang.com/2026/01/markdown-quick-start-guide/
还没有评论,来抢第一条。