从表格排版混乱到层次清晰 手把手教你用Markdown制作无序列表有序列表含嵌套多级列表及常见问题解决方案
说实话,我第一次看到别人写的Markdown文档时,整个人都是懵的。左边是密密麻麻的字符,右边却呈现出那种让人眼前一亮的层次感,就好像魔术一样——*、-、1. 这些符号怎么就变成了漂亮的列表呢?
今天咱们就坐下来,泡杯茶,慢慢聊清楚这件事。我敢说,学完这篇东西,你以后再也不用在Excel或者Word里跟那些歪七扭八的表格较劲了。
先说说,为什么你需要知道这个?
你想想,以前你写文档是什么感觉?
打开Word,开始手动缩进。发现缩进不对?选中,调整。想加个编号?再选,右键,”项目符号和编号”。想嵌套?天呐,那简直是噩梦。有时候写着写着,整个文档的格式就乱了,后面想改都改不动。
然后有人跟你说:”试试Markdown吧,超简单。”
你试了,然后发现——确实简单。但是!当你想要做嵌套列表的时候,问题来了:
- 第一层
-- 第二层 ← 为什么这是错的?
- 第一层
- 第二层
你发现第二层要么缩进不对,要么编号就乱了,要么渲染出来的结果跟你想的不一样。那一刻,你是不是特别想摔键盘?
别急,我就是从那个状态过来的。这篇文章就是我想写给自己当年看的东西。
无序列表:从一根小短线开始
最基础的写法
无序列表是Markdown里最简单的东西,没有之一。
你只需要在每行开头放一个 - 或者 *,后面的空格,然后是文字。就这么简单:
- 苹果
- 香蕉
- 橙子
渲染出来的效果就是:
- 苹果
- 香蕉
- 橙子
对,就这?就这么简单。
但是! 请注意那个空格。-苹果 和 - 苹果 是完全不同的。没有空格的话,Markdown解析器可能认不出来这是个列表项。这个坑我踩过,你不用踩。
用星号也可以
有些人的习惯是用 *,效果完全一样:
* 苹果
* 香蕉
* 橙子
渲染结果跟上面一样。你可以选自己喜欢的符号,不影响效果。我个人偏爱短横线,因为视觉上更干净。
无序列表的常见用法
无序列表最适合用来列举”同类”的东西,没有先后顺序的那种。
比如你的购物清单:
- 牛奶
- 面包
- 鸡蛋
- 黄油
比如你的一次旅行要带的东西:
- 身份证
- 手机
- 充电宝
- 转换插头
- 防晒霜
你看,这些东西之间没有”第一、第二、第三”的关系,只是”我需要带这些东西”,所以用无序列表最合适。
有序列表:当顺序很重要时
最基础的写法
有序列表和无序列表的区别就在于——它有序。
在Markdown里,你只需要在行首写 数字.(数字加点加空格):
1. 起床
2. 刷牙
3. 洗脸
4. 吃早餐
渲染出来的效果是:
- 起床
- 刷牙
- 洗脸
- 吃早餐
一个你可能不知道的小技巧
你不需要从1开始连续写。事实上,很多Markdown解析器会自动帮你编号,不管你写什么数字:
1. 第一步
5. 第二步 ← 虽然写的是5,但渲染出来是2
10. 第三步 ← 虽然写的是10,但渲染出来是3
渲染效果:
- 第一步
- 第二步
- 第三步
这有什么用处呢?假设你在写文档的时候,中途插入了一个新步骤,你不需要把后面所有的编号都改一遍。你只需要写 1. 就行,解析器会自动处理。这个功能在写教程的时候特别好用。
有序列表的常见用法
有序列表适合用来表达”有先后顺序”的内容。
比如一个食谱:
1. 把锅放在火上,倒油
2. 油热后打入鸡蛋
3. 煎至两面金黄
4. 盛出装盘
比如一个操作指南:
1. 打开电脑
2. 双击桌面的浏览器图标
3. 在地址栏输入网址
4. 按下回车键
注意:顺序很重要。食谱里你不可能先盛出装盘再煎鸡蛋,对吧?
嵌套多级列表:这才是真正的重头戏
好了,前两部分你学完可能觉得——就这?太简单了吧?
那咱们进入正题。很多人学Markdown,到这一步就卡住了。
嵌套的基本原理
嵌套列表的本质就是:在一个列表项里面,再放一个列表。
关键是什么?缩进。
在Markdown里,你用空格来表示层级关系。每一层多两个或四个空格,都行。我习惯用四个空格,因为视觉上更清晰。
来看一个嵌套的无序列表示例:
- 水果
- 苹果
- 香蕉
- 橙子
- 蔬菜
- 胡萝卜
- 西兰花
- 菠菜
- 肉类
- 猪肉
- 牛肉
- 鸡肉
渲染出来就是:
- 水果
- 苹果
- 香蕉
- 橙子
- 蔬菜
- 胡萝卜
- 西兰花
- 菠菜
- 肉类
- 猪肉
- 牛肉
- 鸡肉
看到了吗?缩进的部分就是子列表。每个子列表都属于它上面那个父列表项。
混合嵌套:有序和无序混着用
这才是最实用的技能。你可以根据内容需要,在嵌套的时候切换列表类型。
比如你写一个项目计划:
1. 第一阶段:需求分析
- 和用户沟通
- 收集需求文档
- 确认项目范围
2. 第二阶段:设计开发
- 技术方案设计
1. 数据库设计
2. 接口设计
3. 前端架构
- 编写代码
1. 后端开发
2. 前端开发
- 代码审查
3. 第三阶段:测试上线
- 单元测试
- 集成测试
- 部署上线
渲染效果:
- 第一阶段:需求分析
- 和用户沟通
- 收集需求文档
- 确认项目范围
- 第二阶段:设计开发
- 技术方案设计
- 数据库设计
- 接口设计
- 前端架构
- 编写代码
- 后端开发
- 前端开发
- 代码审查
- 技术方案设计
- 第三阶段:测试上线
- 单元测试
- 集成测试
- 部署上线
哇,是不是层次感一下子就有了?这种嵌套方式非常适合用来写有层级关系的内容,比如组织结构、目录大纲、项目规划等等。
嵌套层数没有限制
理论上你可以无限嵌套。比如:
- 根节点
- 第一层
- 第二层
- 第三层
- 第四层
- 第五层
渲染出来:
- 根节点
- 第一层
- 第二层
- 第三层
- 第四层
- 第五层
- 第二层
- 第一层
不过说实话,超过三四层嵌套,阅读体验就开始变差了。如果你需要那么多层,大概率是内容本身组织得不够好,值得重新梳理一下逻辑。
代码块里的列表:一个小陷阱
说到代码块,很多人不知道这里有个小坑。
Markdown的代码块(用三个反引号 ` 括起来的部分)会原样显示里面的内容,不会进行任何解析。
所以如果你想展示”如何写嵌套列表”的示例,你得这样做:
```
- 水果
- 苹果
- 香蕉
```
渲染出来就是:
- 水果
- 苹果
- 香蕉
注意看,这里面的缩进是真实保留的。如果你想在代码块里展示Markdown源码,记得每行的缩进也要对齐,否则看着会很乱。
常见问题及解决方案
这部分我觉得是最重要的。因为你在实际写文档的时候,十有八九会碰到这些问题。
问题一:嵌套不生效,所有内容都变成了一级列表
这是新手最常遇到的问题。
错误写法:
- 水果
- 苹果
- 香蕉
- 蔬菜
- 胡萝卜
这样渲染出来,”苹果”、”香蕉”这些就跟”水果”、”蔬菜”平级了,没有嵌套效果。
正确写法:
- 水果
- 苹果
- 香蕉
- 蔬菜
- 胡萝卜
关键在于:子列表的 - 前面必须有空格缩进。几个空格都行,但至少要有一两个。
问题二:缩进用了Tab,结果渲染不出来
有些人习惯用Tab键来缩进。在Markdown里,Tab有时候不生效。不同的编辑器对Tab的处理不一样,有的会保留Tab,有的会展开成空格,有的会直接忽略。
解决方案: 永远用空格缩进,不要用Tab。
你可以在编辑器里把”插入时替换为空格”打开(大多数现代编辑器都有这个功能),这样就再也不用担心了。
问题三:列表中间加了空行,列表断了
这是一个很隐蔽的问题。
错误写法:
- 第一项
- 第二项
- 第三项
你看,第二项和第三项之间有个空行。渲染出来的效果是:
第一项
第二项
第三项
列表在这里被断开了,变成了两个独立的列表。
解决方案: 列表项之间不要加空行。如果你需要段落分隔,用 <br> 或者在列表外面加段落:
- 第一项
- 第二项
这是第二段的内容,不在列表里。
- 第三项
问题四:有序列表编号乱了
有时候你写了有序列表,但渲染出来的编号不对。
可能的原因:
- 你混用了无序和有序列表但没有正确缩进
1. 第一步
- 子步骤 ← 这里没有缩进,可能被当成新的有序列表开始
2. 第二步
解决方案: 确保子列表正确缩进:
1. 第一步
- 子步骤
2. 第二步
- 你在不同行用了不同起点的数字
虽然前面说了自动编号的特性,但有些Markdown解析器对数字的处理不一样。如果你希望编号严格按顺序,就老老实实从1开始写,让解析器自动处理。
问题五:列表项里有代码,渲染错位
这是一个比较高级的问题。假设你的列表项里要包含代码:
- 运行命令
- 打开终端
- 输入 `npm install`
- 等待安装完成
渲染结果可能看起来有点怪,因为代码的反引号和列表的缩进混在一起。
解决方案: 在代码前后各加一个空格:
- 运行命令
- 打开终端
- 输入 ` npm install `
- 等待安装完成
或者用代码块:
- 运行命令
- 打开终端
- 输入以下命令:
npm install
- 等待安装完成
问题六:列表后面紧跟段落,内容接在了列表里
有时候你写完列表,想接着写一段话,结果发现这段话被当成了列表项:
- 第一项
- 第二项
这是第二段。
渲染结果可能是:
- 第一项
- 第二项
- 这是第二段。
解决方案: 在列表和段落之间加一个空行:
- 第一项
- 第二项
这是第二段。
这样”这是第二段”就不会被当成列表项了。
问题七:在列表里写链接和标题,格式混乱
这个情况比较多见。比如你想在列表里放一个带链接的项:
- 去[GitHub](https://github.com)看看
这个写法是对的,渲染出来就是一个带链接的列表项。
但如果你想嵌套,就会有点麻烦:
- 资源
- 去[GitHub](https://github.com)看看
- 去[GitLab](https://gitlab.com)看看
这里链接里的方括号 [] 和圆括号 () 有时候会让解析器困惑,特别是在嵌套层级比较深的时候。
解决方案: 给链接加上转义,或者调整写法:
- 资源
- 去 [GitHub](https://github.com) 看看
- 去 [GitLab](https://gitlab.com) 看看
注意链接文字和圆括号之间加了空格,这样更清晰,也不容易出错。
一些进阶小技巧
任务列表(Task List)
这是Markdown的一个扩展功能,很多平台(比如GitHub、语雀、Notion)都支持。
写法就是在列表项前面加 [ ] 或 [x]:
- [ ] 完成任务A
- [x] 完成任务B
- [ ] 完成任务C
渲染出来就是带checkbox的效果:
- [ ] 完成任务A
- [x] 完成任务B
- [ ] 完成任务C
这对于写TODO清单、项目进度表特别方便。
在列表里写多行内容
有时候一个列表项的内容很长,需要换行。Markdown里有个技巧:在行尾加两个空格再换行:
- 这是一个很长的列表项
它有两行内容,注意第一行末尾有两个空格
- 另一个列表项
不过这个方法在不同编辑器里行为可能不一致。如果你需要列表项里有大段内容,更稳妥的做法是:
- 这是一个列表项
这里可以写多段内容,只要保持缩进就行。
第二段内容也要缩进哦。
- 下一个列表项
列表和引用混用
> - 这是引用块里的列表项
> - 第二个列表项
- 这是普通的列表项
这个功能在写技术文档的时候特别有用,比如你可以在引用块里放一段需要特别注意的列表说明。
总结一下
好了,说了这么多,咱们来做个快速回顾:
无序列表用 - 或 * 加空格开头,适合列举没有顺序关系的项目。
有序列表用 数字. 加空格开头,适合有先后顺序的步骤。
嵌套列表的关键是空格缩进,子列表要比父列表多缩进两个或四个空格。
常见坑主要有:缩进用Tab、列表中间有空行断了、嵌套层级不对、代码和链接混用导致格式混乱。
我写这篇文章的时候,想起了自己当年第一次学Markdown的日子。那时候网上教程到处都是,但要么太简略,要么太啰嗦。我想写的就是那种——你刚好需要看的东西,不多不少,而且讲得清楚。
希望这篇文章能帮你少踩几个坑。如果你在实践中遇到了什么奇怪的问题,别慌,先把代码贴出来,大概率是缩进或者空行的问题。回头再看这篇文章,你大概会笑——”就这?”
但这就是学习的过程,对吧?
