Markdown 删除线
Markdown 删除线是什么
删除线(strikethrough)就是在文字中间画一条横线,表示这段文字"已废弃"或"不再有效"。你在编辑文档、写 README、记笔记的时候经常会用到它——比如标注旧价格、标记已完成的任务、或者纠正之前写错的内容。
在 Markdown 里,删除线不算是"基础语法"。原始的 Markdown 规范(John Gruber 在 2004 年设计的那个版本)并没有定义删除线的写法。后来 GitHub Flavored Markdown(简称 GFM)把它加了进来,用的符号是两个波浪线 ~~。由于 GFM 的影响力实在太大,现在绝大多数 Markdown 编辑器和平台都支持这个写法了。
基本语法:用 ~~ 包裹文字
写法很简单,在要划掉的文字前后各加两个波浪线:
~~这段文字会被加上删除线~~渲染效果:这段文字会被加上删除线
你可以把它用在一个词、一句话、甚至一整段上:
原价 ~~999元~~,现在只要 499 元!
~~这个方案已经被否决了,不要参考。~~ 新方案见下方。
会议时间 ~~周二下午3点~~ 改为周三上午10点。几个需要注意的细节:
- 波浪线和文字之间不要加空格。
~~ 文字 ~~在某些解析器里会失效,直接变成普通文字。 - 一个波浪线
~是 subscript(下标)语法,不是删除线,必须是两个。 - 删除线可以跨行使用,但建议保持在一行内,这样兼容性最好。
HTML 替代方案
如果你的编辑器或平台不支持 ~~ 语法(这种情况现在比较少见了),可以用 HTML 标签来实现:
<del>这段文字也有删除线效果</del>
<s>这个也能划掉</s>
<strike>这是最旧的写法,但很多地方还能用</strike>这三个标签的视觉效果差不多,但语义上有区别:
| 标签 | 语义 | 适用场景 |
|---|---|---|
<del> | 表示"已被删除的内容" | 文档修订、价格变更 |
<s> | 表示"不再准确/不再相关的内容" | 标注过期信息 |
<strike> | HTML5 已废弃,纯视觉效果 | 不推荐使用 |
说实话,实际使用中 <del> 和 <s> 的区别对大多数人来说无所谓。但如果你在意语义化(比如 SEO 或者屏幕阅读器),<del> 是更规范的选择,它还能配合 datetime 属性标注删除时间:
<del datetime="2026-05-01">旧版本描述</del>另外,CSS 的 text-decoration: line-through 也能实现同样的效果,但这需要你控制页面的样式,在纯 Markdown 文件里用得不多。
不同平台的兼容性
这一块是很多人踩坑的地方。~~ 虽然是事实标准,但不同平台的支持程度确实有差异。我分别在几个常用平台上测试过,整理了一个对照表:
| 平台/编辑器 | ~~ 语法 | <del> 标签 | 备注 |
|---|---|---|---|
| GitHub(README、Issue、PR) | ✅ | ✅ | GFM 原生支持 |
| GitLab | ✅ | ✅ | GitLab Flavored Markdown |
| Discord | ✅ | ❌ | 只支持 ~~ |
| Typora | ✅ | ✅ | 实时预览编辑器,支持最好 |
| VS Code(内置预览) | ✅ | ✅ | 需要启用 GFM 解析 |
| Obsidian | ✅ | ✅ | |
| 简书 | ✅ | ⚠️ | ~~ 正常,HTML 标签可能被过滤 |
| CSDN | ✅ | ⚠️ | 类似简书,HTML 标签有时不生效 |
| Stack Exchange 问答 | ❌ | ✅ | 问答区用 HTML,聊天区用 ---text--- |
| ✅ | ❌ | 2023 年后支持 | |
| Slack | ❌ | ❌ | 不支持删除线 |
| 飞书文档 | ✅ | ✅ |
有一次我在一个老版本的静态站点生成器里用 ~~,怎么都不生效,排查了半天才发现它用的是 CommonMark 解析器,默认不包含 GFM 扩展。遇到这种情况,换 <del> 标签就行。
嵌套格式:删除线 + 加粗 / 斜体
Markdown 的删除线可以和其他格式组合使用,这在实际场景中还挺常见的。
删除线 + 加粗:
**~~重要但已过时的信息~~**
~~**重要但已过时的信息**~~两种写法效果一样:加粗的删除线文字
删除线 + 斜体:
*~~斜体删除线~~*
~~*斜体删除线*~~效果:~~斜体删除线~
删除线 + 加粗 + 斜体:
***~~全部格式组合~~***
~~***全部格式组合***~~效果:~~全部格式组合~
组合使用的时候,注意让符号正确嵌套配对。~~**text**~~ 和 **~~text~~** 都可以,但 ~~**text~~** 这种交叉写法会导致渲染异常。
删除线的实际应用场景
了解了语法之后,来看看在哪些场景下删除线特别好使。
价格对比:电商、SaaS 产品页面最常见
| 套餐 | 原价 | 优惠价 |
|------|------|--------|
| 基础版 | ~~¥99/月~~ | ¥49/月 |
| 专业版 | ~~¥199/月~~ | ¥99/月 |文档修订:标注哪些内容已更新
配置项 `max_connections` 默认值 ~~100~~ 200(v2.0 起变更)。TODO 管理:在纯文本待办事项中标记已完成
- ~~完成需求分析~~
- ~~编写技术方案~~
- 开发核心功能
- 测试与上线这种写法在 GitHub Issue 和 Obsidian 笔记里特别好用,比 checkbox 更适合"已完成但想保留记录"的场景。
纠错标注:在文章或讨论中纠正错误信息
地球是 ~~平的~~ 球形的。常见问题
为什么我的删除线不生效?
最常见的原因有三个:
- 只写了一个波浪线。删除线是
~~(两个),不是~(一个)。 - 波浪线和文字之间有空格。
~~ 文字 ~~在部分解析器里不生效。 - 你用的编辑器不支持 GFM 扩展。换用
<del>标签试试。
代码块里能用删除线吗?
不能直接用。Markdown 的格式化语法(包括删除线)在代码块(` 或 ``` )内是不生效的,这是设计如此。
如果一定要在代码相关内容中表示"删除",可以用 diff 语法块来模拟:
```diff
- 旧的代码行(红色)
+ 新的代码行(绿色)
这在 GitHub 上特别常用,虽然视觉效果不是删除线,但语义上更准确——清楚地展示了"删了什么、加了什么"。
### 删除线和高亮标记有什么区别?
删除线(`~~text~~`)是在文字中间画横线,表示"已废弃"。高亮标记(`==text==`)是用背景色标记文字,表示"重点注意"。两者用途完全不同,别搞混了。
### 表格里能用删除线吗?
能用。在 Markdown 表格的单元格中正常使用 `~~` 即可:
```markdown
| 功能 | 状态 |
|------|------|
| ~~用户注册~~ | 已迁移到新系统 |
| 数据导出 | 正常 |不过要注意,少数 Markdown 解析器在表格内对 ~~ 的支持不太好。如果遇到这种情况,用 <del> 标签替代。
速查表
| 写法 | 效果 | 备注 |
|---|---|---|
~~文字~~ | GFM 标准写法 | |
<del>文字</del> | HTML 语义化方案 | |
<s>文字</s> | HTML 非准确信息 | |
~~**文字**~~ | 删除线 + 加粗 |
说实话语法本身没几行,但要踩的坑都在平台兼容性里。记住两点就够:用 ~~ 时不加空格,不行就换 <del>,基本能覆盖所有场景。
参考来源
- GitHub Flavored Markdown Spec — Strikethrough:GFM 官方规范中删除线扩展的正式定义
- GitHub Docs — Basic Writing and Formatting Syntax:GitHub 官方文档对删除线语法的说明
- Markdown Guide — Extended Syntax:Markdown Guide 对删除线作为扩展语法的介绍
- CommonMark Spec:CommonMark 规范(说明基础 Markdown 不包含删除线)
- Wikipedia — Strikethrough:删除线的历史背景、HTML 标签演进和 Unicode 实现方案