Markdown: Markdown 嵌入 HTML 的方法

Markdown 不是万能的——当语法不够用时,直接写 HTML 就好。

1. 你将学到


2. 一个前端开发者的真实故事

(1) 痛点:Markdown 的限制卡住了需求

Lisa 在为公司写技术文档,需要在一个表格单元格中展示带颜色的状态标签(如红色"失败"、绿色"通过")。Markdown 表格不支持背景色和文字颜色。她尝试用各种 Markdown 技巧绕过,浪费了 2 小时,最终不得不截了一张图片贴上,但图片无法被搜索到。

(2) 解法:在 Markdown 中直接写 HTML

老员工 Tom 告诉她:"Markdown 里可以写 HTML 啊。"Lisa 用 <span> 标签加 style 属性实现了彩色标签。既不用截图、文字也能被搜索到,而且代码只多了几行 HTML。

MARKDOWN
| 测试用例 | 状态 |
|:---------|:-----|
| 用户登录 | <span style="color: green;">✅ 通过</span> |
| 支付接口 | <span style="color: red;">❌ 失败</span> |

3. Markdown 中的 HTML 规则

Markdown 的设计哲学是"可以作为 HTML 的简化写法"。因此,它天然支持在文档中嵌入 HTML:

100%
graph TB
    A[Markdown 文档] --> B[Markdown 语法]
    A --> C[HTML 语法]
    B --> D[标题/列表/表格等]
    C --> E[块级 HTML]
    C --> F[内联 HTML]
    E --> G[div/table/pre]
    F --> G[span/img/br]
HTML 类型 特点 示例
内联 HTML 在 Markdown 段落内直接写 <span style="color:red">文字</span>
块级 HTML 独立成块,前后空行 <div>内容</div>
块级内的 Markdown 块级 HTML 内 Markdown 语法可能不生效 <div>**加粗** 可能无效</div>

(1) 内联 HTML

HTML
这是一段文字,里面有 <span style="color: red;">红色文字</span> 和
<strong>加粗文字</strong>(用 HTML 标签实现)。

按 Ctrl + <br> 换行(<br> 是 HTML 标签)。

▶ 示例:用 HTML 实现 Markdown 做不到的效果

HTML
这是普通 Markdown 里的文字。

<kbd>Ctrl</kbd> + <kbd>S</kbd> 保存文件。

升级到 <abbr title="Version 3.0">v3.0</abbr> 版本。
▶ 试一试
⚠️ 注意: 在块级 HTML 标签内,标准 Markdown 语法(如 **加粗**)通常不会解析。你需要直接用 HTML 标签:<strong>加粗</strong>

(3) 常见块级 HTML 用法

HTML
<!-- 自定义容器 -->
<div style="border: 1px solid #ddd; padding: 16px; border-radius: 8px;">
  <h3>重要更新</h3>
  <p>系统将于本周末进行维护。</p>
</div>

<!-- 多列布局 -->
<div style="display: flex; gap: 16px;">
  <div style="flex: 1;">左列内容</div>
  <div style="flex: 1;">右列内容</div>
</div>

<!-- 带样式的表格 -->
<table>
  <tr>
    <th style="background: #4CAF50; color: white;">名称</th>
    <th>价格</th>
  </tr>
  <tr>
    <td>商品 A</td>
    <td>$29</td>
  </tr>
</table>

5. 常见的 HTML 补充场景

场景 Markdown 限制 HTML 解决方式
文字颜色 ❌ 不支持 <span style="color:red">文字</span>
图片尺寸 ❌ 不支持 <img src="url" width="200">
新标签页打开链接 ❌ 不支持 <a href="url" target="_blank">文字</a>
单元格合并 ❌ 不支持 <td colspan="2">合并</td>
自定义样式 ❌ 不支持 <div style="...">内容</div>
表格内换行 ❌ 不支持 <br> 标签

▶ 示例:HTML 实现 Markdown 做不到的排版

HTML
<!-- 新标签页打开 -->
<a href="https://example.com" target="_blank">在新窗口打开</a>

<!-- 自定义尺寸图片 -->
<img src="logo.png" width="150" alt="Logo" style="border-radius: 8px;">

<!-- 按键效果 -->
<kbd>Enter</kbd> 或 <kbd>Ctrl</kbd> + <kbd>V</kbd>

<!-- 带背景色的提示 -->
<blockquote style="background: #fff3cd; border-left-color: #ffc107;">
  这是一个自定义样式的提示框。
</blockquote>
▶ 试一试
💡 提示: 这些都是 Markdown 本身不支持的场景。合理使用 HTML 可以让你的文档更专业。但不要过度——80% 的内容用标准 Markdown 就够了。


6. HTML 与 Markdown 的边界

(1) 块级 HTML 内的 Markdown 通常不解析

HTML
<div>
  **这段文字不会加粗**(在 div 内 Markdown 语法失效)
  <strong>这段文字用 HTML 加粗</strong>
</div>

例外:某些解析器(如 Pandoc)支持在 HTML 标签内继续解析 Markdown,但 GFM(GitHub)不支持。为安全起见,HTML 标签内全程使用 HTML 语法。

(2) 内联 HTML 中的 Markdown

HTML
<span style="color: red;">**这段文字在部分解析器中会加粗**</span>
⚠️ 注意: 各解析器行为不一致,建议在 HTML 标签内统一用 HTML 语法,不要混用 Markdown。

▶ 示例:安全 vs 不安全混用

MARKDOWN
✅ 安全:
- 正文写 Markdown:**加粗**
- 需要自定义时写 HTML:<span style="color: red;">红色</span>

❌ 不安全:
<div style="padding: 8px;">
  **这段加粗在 GitHub 上不会生效**
</div>

7. 安全性与兼容性

(1) 不要做

HTML
❌ 不安全:<script>alert('XSS')</script>
❌ 不安全:<img src="x" onerror="alert('攻击')">
❌ 不安全:<iframe src="https://恶意网站.com"></iframe>
⚠️ 注意: GitHub 等平台会自动过滤 XSS 攻击代码,不会执行 <script> 和事件处理器。但从 Markdown 源文件导出到其他平台时,应避免嵌入不安全 HTML。

(2) HTML 兼容性检查

HTML
<!-- ✅ 跨平台兼容 -->
<strong>加粗</strong>
<em>斜体</em>
<kbd>按键</kbd>
<br>
<hr>

<!-- ⚠️ 部分平台不兼容 -->
<details><summary>折叠内容</summary>隐藏文字</details>
<mark>高亮文字</mark>
💡 提示: 如果你的 Markdown 需要在不同平台(GitHub、GitLab、本地预览、博客)之间迁移,尽量少用 HTML。HTML 越多,兼容性风险越大。


8. 完整示例:HTML 增强的 Markdown 文档

TEXT 📖 仅展示
HTML 增强后的 Markdown 文档效果:

产品更新日志 v3.2:
- 绿色背景提示框:显示更新概要
- HTML 表格:模块/状态/负责人(状态带颜色)
- 按键标签:F5 刷新
- Bash 代码块:安装命令 npm install my-app@latest
- 邮箱链接:support@example.com(mailto 协议)

预期效果:一份结合了 Markdown 和 HTML 的产品日志——Markdown 处理标准结构,HTML 处理颜色、按键样式和自定义容器。


❓ 常见问题

Q 在 Markdown 中用 HTML 是好习惯吗?
A 适度使用。80% 的内容用标准 Markdown,只有 Markdown 不支持的功能(颜色、尺寸、新标签页)时才用 HTML。HTML 越多,文档的可移植性越差。
Q GitHub 支持哪些 HTML 标签?
A GitHub 支持大部分安全的内联和块级 HTML 标签,但会过滤 <script><iframe> 等不安全标签和事件处理器(如 onclick)。
Q HTML 标签内的 Markdown 语法为什么不生效?
A 因为 Markdown 解析器在处理 HTML 块时,会跳过内部的 Markdown 解析。这是规范行为。解决方式是在 HTML 块内全部使用 HTML 语法。
Q 块级 HTML 前后必须空行吗?
A 必须。没有空行的块级 HTML 可能导致渲染异常——Markdown 解析器可能无法正确识别 HTML 块的边界。
Q 在 HTML 中可以使用 CSS 类名吗?
A 可以,但类名只在你的目标平台有对应 CSS 规则时生效。在 GitHub 上,自定义类名无效。在自定义网站中,你可以定义自己的 CSS 样式。

📖 小节


📝 作业

  1. 基础题:写一段 Markdown,用 <span> 标签将一句话中的某个词改为红色,并用 <kbd> 标签显示 "Ctrl+S" 快捷键。

  2. 进阶题:创建一个自定义样式的提示框(用 <div> 加背景色和边框),里面包含一段文字和一个链接。验证在 VS Code 和 GitHub 上的效果差异。

  3. 挑战题:用 HTML 表格(含 <thead><tbody>)替代 Markdown 表格,实现表头有背景色、首行合并单元格的效果。然后将这个 HTML 表格和 Markdown 表格放在同一文档中,对比渲染效果。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏