第 11 章:HTML 混合排版
Markdown 语法刻意保持简洁,但总有些排版需求超出其能力范围。好在 Markdown 与 HTML 可以无缝混用——需要什么,直接写 HTML。
学习目标
- 理解 Markdown 中嵌入 HTML 的规则
- 掌握常用 HTML 标签在 Markdown 中的应用
- 了解 HTML 与 Markdown 混用的兼容性边界
11.1 基本规则
Markdown 的核心设计原则之一是:在 Markdown 文档中可以直接写 HTML。这意味着一篇 Markdown 文档完全可以用 HTML 实现任何排版需求。
markdown
# Markdown 标题
这是 Markdown 段落。
<div style="color: red; font-size: 20px;">
这是 HTML 红色大字。
</div>
这是另一段 Markdown。1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
HTML 与 Markdown 的边界
| 规则 | 说明 |
|---|---|
| 块级 HTML 内 | Markdown 语法不解析 |
| 行内 HTML 内 | Markdown 语法不解析 |
| HTML 标签外 | 正常的 Markdown 语法 |
| HTML 属性 | 直接写在标签上 |
块级 HTML 内:
<div>
**这不是粗体** ← Markdown 不解析
</div>
块级 HTML 外:
**这是粗体** ← Markdown 正常解析
行内 HTML 内:
<span style="color:red">**这不是粗体**</span>
但如果你想在 HTML 内用 Markdown:
<div markdown="1">
**这是粗体** ← 部分平台支持 markdown="1"
</div>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
⚠️
markdown="1"属性不是通用标准。GitHub 不支持此属性。需要兼容 GitHub 时,HTML 内的内容只能写纯 HTML。
11.2 常用 HTML 标签
文本样式
html
这是<u>下划线</u>文字。 <!-- Markdown 原生无下划线 -->
这是<mark>高亮</mark>文字。 <!-- GitHub 兼容 -->
这是<ins>插入</ins>文字。 <!-- 语义相当于新增内容 -->
这是<sub>下标</sub>文字。 <!-- H₂O -->
这是<sup>上标</sup>文字。 <!-- E=mc² -->
这是<small>小字</small>文字。 <!-- 注释、免责声明 -->1
2
3
4
5
6
7
2
3
4
5
6
7
渲染:这是下划线文字。这是高亮文字。这是插入文字。这是下标文字。这是上标文字。这是小字文字。
折叠面板(Details/Summary)
这是 GitHub 上非常实用的功能,可以创建可折叠的内容区:
html
<details>
<summary>点击展开更多信息</summary>
这里是被折叠的内容,可以包含 Markdown 格式的文字、代码块等。
```python
print("在折叠面板里也能放代码")
```
- 甚至可以有列表
- 和其他 Markdown 元素
</details>1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
⚠️ 注意:在 GitHub 上,
<details>内的 Markdown 语法需要与 HTML 标签之间留一个空行才能正确解析。
图片尺寸与对齐
html
<!-- 设置宽度 -->
<img src="https://example.com/photo.png" width="400" alt="示例图片">
<!-- 居中 -->
<p align="center">
<img src="https://example.com/photo.png" width="300" alt="居中图片">
</p>1
2
3
4
5
6
7
2
3
4
5
6
7
键盘按键
html
按下 <kbd>Ctrl</kbd> + <kbd>C</kbd> 复制内容。1
渲染:按下 Ctrl + C 复制内容。
视频嵌入
html
<video width="100%" controls>
<source src="demo.mp4" type="video/mp4">
您的浏览器不支持 video 标签。
</video>1
2
3
4
2
3
4
音频嵌入
html
<audio controls>
<source src="audio.mp3" type="audio/mpeg">
您的浏览器不支持 audio 标签。
</audio>1
2
3
4
2
3
4
11.3 复杂表格
当 Markdown 表格不够用时,HTML <table> 是完美的替代方案:
html
<table>
<thead>
<tr>
<th>功能</th>
<th colspan="2">兼容性</th>
</tr>
<tr>
<th></th>
<th>桌面端</th>
<th>移动端</th>
</tr>
</thead>
<tbody>
<tr>
<td>导航栏</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>图表渲染</td>
<td>✅</td>
<td>⚠️ 部分支持</td>
</tr>
<tr>
<td rowspan="2">表单</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>✅</td>
<td>⚠️</td>
</tr>
</tbody>
</table>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
这实现了 Markdown 表格无法做到的:
colspan:跨列合并(表头 "兼容性" 占两列)rowspan:跨行合并("表单" 占两行)
11.4 安全考虑
在 GitHub 等平台渲染用户提交的 Markdown 时,出于安全考虑,平台会过滤掉危险的 HTML:
| 标签/属性 | GitHub | 说明 |
|---|---|---|
<script> | ❌ 过滤 | 防止 XSS 攻击 |
<iframe> | ❌ 过滤 | 防止嵌入恶意页面 |
<style> | ❌ 过滤 | 防止样式注入 |
onclick 等事件属性 | ❌ 过滤 | 防止执行脚本 |
class / id | ❌ 过滤 | GitHub 不允许自定义 CSS |
<div> / <span> | ✅ 允许 | 基础容器标签 |
<img> | ✅ 允许 | 图片标签 |
<table> | ✅ 允许 | 复杂表格 |
<details> | ✅ 允许 | 折叠面板 |
<kbd> | ✅ 允许 | 键盘按键 |
<sub> / <sup> | ✅ 允许 | 上下标 |
<mark> / <ins> / <del> | ✅ 允许 | 语义化文本 |
11.5 实践建议
什么时候用 HTML
| 需求 | Markdown | HTML 替代 |
|---|---|---|
| 调整图片尺寸 | ❌ | <img width="..."> |
| 图片居中/对齐 | ❌ | <p align="center"><img></p> |
| 合并单元格 | ❌ | <table> + colspan/rowspan |
| 折叠内容 | ❌ | <details><summary> |
| 下划线 | ❌ | <u> |
| 上下标 | ❌ | <sub> / <sup> |
| 视频/音频嵌入 | ❌ | <video> / <audio> |
什么时候不用 HTML
- 能用 Markdown 原生语法实现的,就用 Markdown——源码更简洁
- 追求简洁可读的场景——Markdown 的设计初衷
- 面向纯文本阅读的场景——HTML 标签在纯文本环境不友好
11.6 语法速查
| 需求 | HTML 写法 | 平台兼容 |
|---|---|---|
| 下划线 | <u>文字</u> | ✅ |
| 高亮 | <mark>文字</mark> | ✅ |
| 上标 | <sup>文字</sup> | ✅ |
| 下标 | <sub>文字</sub> | ✅ |
| 键盘按键 | <kbd>Ctrl</kbd> | ✅ |
| 图片居中 | <p align="center"><img></p> | ✅ |
| 折叠面板 | <details><summary> | GitHub ✅ |
| 视频 | <video src="file.mp4" controls> | ✅ |
| 复杂表格 | <table> + colspan/rowspan | ✅ |
本章小结
| 要点 | 说明 |
|---|---|
| 混用规则 | Markdown 中可以任意写 HTML |
| 块级 HTML | 内部的 Markdown 语法不会解析 |
| GitHub 安全 | 过滤 <script>、<style>、<iframe> 和事件属性 |
| 实用标签 | <details>、<kbd>、<mark>、<table> |
| 使用原则 | Markdown 能做的用 Markdown,不能的再用 HTML |
下一章预告
语法学完了,接下来选一把趁手的兵器——市面上有哪些好用的 Markdown 编辑器?如何把 Markdown 转成 PDF、Word、HTML?