Markdown 縮排完全指南:首行縮排、段落縮排、列表嵌套一篇搞定

Markdown 本身沒有專門的「縮排」語法。這個設計是故意的——John Gruber 在設計 Markdown 時,排版佈局的工作就交給了 CSS,Markdown 只管內容結構。但現實是,寫技術文件、部落格文章、README 的時候,縮排需求又確實存在。特別是中文排版,「首行縮排兩個漢字」幾乎是剛需。
這篇文章把 Markdown 中所有跟縮排相關的場景和方法都梳理一遍,看完之後不管你是想在 GitHub 上做嵌套列表,還是在部落格裡實現首行縮排,都能找到對應方案。
先搞清楚:Markdown 中的縮排規則
在講具體方法之前,得先理解 Markdown 對縮排的處理邏輯。簡單來說,Markdown 解析器看到行首的空格和 Tab,會根據數量決定它是什麼:
| 行首空格/Tab 數量 | Markdown 的理解 | 效果 |
|---|---|---|
| 0 個 | 普通段落文字 | 正常顯示 |
| 1-3 個空格 | 普通段落文字(空格被忽略) | 看不出縮排 |
| 4 個空格或 1 個 Tab | 程式碼區塊 | 等寬字體顯示 |
| 列表項前的 2-4 個空格 | 嵌套列表項 | 下一級列表 |
> 符號 | 引用區塊(blockquote) | 左側帶豎線 |
這個規則來自 CommonMark 規範和 Gruber 的原始文件。所以你直接在段落前面敲空格,大概率看不到任何縮排效果——解析器直接忽略了。
方法一:HTML 空格實體(最常用)
這是用得最廣泛的方案,原理是在 Markdown 中直接插入 HTML 空格實體字元。解析器不會忽略 HTML 實體,所以縮排能生效。
四種 HTML 空格實體對照
| 實體 | 名稱 | 寬度 | 適用場景 |
|---|---|---|---|
| 不間斷空格 | 約 1 個字元寬度 | 英文排版,微調間距 |
  | 半形空格 | 約 0.5 個中文字元寬度 | 較少使用 |
  | 全形空格 | 約 1 個中文字元寬度 | 中文首行縮排首選 |
  | 窄空格 | 約 0.2 個字元寬度 | 細微間距調整 |
中文首行縮排寫法
中文文章習慣首行縮排兩個漢字,用兩個   剛好:
  這是一段中文文字,首行會縮排兩個漢字的寬度。這個方法在 GitHub、Typora、VS Code 預覽中都能正常顯示。
  每個段落開頭都加上這兩個實體就行。雖然有點麻煩,但相容性最好。英文縮排寫法
英文縮排一般用 4 個 或 2 個  :
This paragraph has an indent at the beginning. It works across most Markdown renderers.說實話,這個方法最大的缺點就是手動敲實體太累。不過如果你用的是 Typora 或 VS Code,可以設定程式碼片段(snippet)來快速輸入。我之前寫一篇長文章,每個段落都要手動加   ,後來直接在 VS Code 裡設了一個 snippet,輸入 ;2em 就自動展開,效率提升不少。
方法二:全形空格(中文排版的隱藏技巧)
這個方法很多英文教學不會提,但對中文使用者來說可能是最簡單的方案。
操作步驟:把輸入法切換到全形模式,然後直接敲兩個空格。
這段文字前面是兩個全形空格,在中文排版中等同於首行縮排兩個字。全形空格(Unicode U+3000)在絕大多數 Markdown 渲染器中不會被忽略,所以能實現視覺縮排。相比   實體,全形空格在原始碼中看起來更直觀。
不過有個小坑:有些編輯器的自動格式化工具會把全形空格替換成普通空格,導致縮排消失。如果你發現縮排突然消失了,檢查一下編輯器的格式化設定。我有一次用 Prettier 格式化 Markdown 檔案,格式化完所有全形空格全沒了,之後就不敢在有使用 Prettier 的專案裡用這個方案了。
方法三:引用區塊實現視覺縮排
如果你的目的不是首行縮排,而是想把一整段文字往右挪——比如在文章中引用別人的話、突出顯示某個段落——用引用區塊(blockquote)最合適:
> 這段文字會向右縮排,左側出現一條豎線。
> 可以寫多行內容,視覺效果等同於整體縮排。
>
> 甚至可以分段,中間空一行加 `>` 就行。引用區塊可以嵌套使用,實現多層縮排:
> 第一層縮排
>
> > 第二層縮排
> >
> > > 第三層縮排引用區塊嚴格來說不算「縮排語法」,但它是 Markdown 原生支援的功能,在所有渲染器中都相容,而且語義上表示「引用內容」,對於文章中引用別人觀點的場景非常合適。
方法四:HTML 標籤控制縮排
當你需要精確控制縮排距離,或者想讓整段文字都縮排(不只是首行),可以用 HTML 的 div 或 p 標籤配合 margin-left 樣式:
<div style="margin-left: 2em;">
這段文字整體向右縮排了 2em。
適用於需要大面積縮排的場景。
</div>或者用 padding-left:
<p style="padding-left: 40px;">
這段文字左側有 40px 的內邊距。
可以精確到像素級控制縮排距離。
</p>注意:這個方法依賴於 Markdown 渲染器支援 HTML 標籤和行內樣式。GitHub 和大部分靜態部落格產生器(Jekyll、Hugo、Hexo)都支援,但有些平台(比如部分論壇、Discord)會過濾掉 HTML 標籤。
方法五:列表嵌套縮排
列表嵌套是 Markdown 中縮排最有「官方支援」的場景。在列表項前加 2-4 個空格,就能建立子列表:
- 第一項
- 嵌套子項(2 個空格)
- 更深的嵌套(4 個空格)
- 第二項
- 子項
- 深層子項
- 還能更深有序列表和無序列表可以混用:
1. 安裝步驟
- 下載安裝包
- 執行安裝程式
2. 設定步驟
1. 開啟設定檔
2. 修改連接埠號
- 預設連接埠:8080
- 自訂連接埠範圍:1024-65535關於列表縮排,有一個經常被問到的問題:到底縮排 2 個空格還是 4 個空格?
CommonMark 規範的定義是:列表項的延續內容需要縮排到列表標記之後的文字起始位置。對於無序列表(-),標記佔 2 個字元,所以子項縮排 2 個空格就夠了。對於有序列表(1.),標記佔 3 個字元,子項需要縮排 3 個空格。
實際操作中,大多數渲染器對 2-4 個空格的縮排都能正確識別,但如果你在 GitHub 上發現嵌套列表渲染異常,試試調整縮排空格數。
方法六:CSS 全域縮排(一勞永逸)
如果你有自己的部落格或網站,用 CSS 設定全域首行縮排是最優雅的方案。一次設定,所有段落自動縮排,不用在每個段落前手動加任何東西:
/* 所有段落首行縮排 2em */
p {
text-indent: 2em;
}
/* 注意:避免圖片也被縮排 */
p img {
margin-left: -2em;
}這個方案適合 Jekyll、Hugo、Hexo 等靜態部落格,也適合 WordPress。在 GitHub README 或他人平台上就用不了了,因為你控制不了 CSS。
順便提一句,用了 CSS 縮排之後,記得清理舊文章裡手動加的   和全形空格,否則會出現雙重縮排。之前幫一個朋友從 WordPress 遷移到 Hugo,他之前每篇文章都手動加了   ,切到 CSS 方案後全變成了「雙倍縮排」,最後寫了個腳本批次清理。
不同場景該用哪種方案?
| 場景 | 推薦方案 | 原因 |
|---|---|---|
| GitHub README 中的嵌套列表 | 列表縮排(2-4 空格) | 原生支援,無需 hack |
| GitHub README 中的段落縮排 |   或 | GitHub 支援但會過濾部分 HTML |
| Typora 寫中文部落格 | 全形空格或   | 直觀、相容性好 |
| 自建部落格網站 | CSS text-indent | 一勞永逸,內容與樣式分離 |
| 需要精確控制縮排距離 | HTML margin-left | 像素級精確 |
| 引用別人的內容 | 引用區塊 > | 語義正確,原生支援 |
| Pandoc / R Markdown | Line block \| 語法 | 原生保留前導空格 |
渲染器相容性參考
不同平台對縮排方案的支援程度不同,這裡整理了一張對照表:
| 方案 | GitHub | Typora | VS Code | Obsidian | Jekyll/Hugo |
|---|---|---|---|---|---|
/   | ✅ | ✅ | ✅ | ✅ | ✅ |
| 全形空格 | ✅ | ✅ | ✅ | ✅ | ✅ |
引用區塊 > | ✅ | ✅ | ✅ | ✅ | ✅ |
HTML margin-left | ⚠️ 部分過濾 | ✅ | ✅ | ⚠️ 有限支援 | ✅ |
CSS text-indent | ❌ | ❌ | ❌ | ❌ | ✅ |
Pandoc line block \| | ❌ | ❌ | ❌ | ❌ | ⚠️ 需 Pandoc |
表格中「⚠️ 部分過濾」是指 GitHub 會保留部分 HTML 標籤但過濾掉 style 屬性中的某些屬性值,實際效果需要測試。
關於 Tab 鍵
在 Markdown 編輯器中按 Tab 鍵,行為取決於編輯器:
- Typora:在列表中按 Tab 會縮排當前項;在普通段落中按 Tab 可能插入 4 個空格或跳到下一個焦點
- VS Code:預設插入 4 個空格(可在設定中改為 2 個);在列表中按 Tab 會縮排
- Obsidian:在列表中按 Tab 縮排;在普通文字中不回應
- GitHub 線上編輯器:Tab 鍵主要用於列表縮排
總之,Tab 鍵在 Markdown 編輯器中主要用於列表縮排,不適合用來做段落首行縮排。
常見問題
為什麼我在段落前加空格沒有效果?
Markdown 規範規定,1-3 個前導空格會被忽略。4 個及以上的空格會把內容變成程式碼區塊。所以直接敲空格做段落縮排是行不通的。
  和 有什麼區別?
  的寬度等於一個中文字元(也叫「全形空格」), 的寬度約等於一個英文字元。中文首行縮排用   更精確,2 個   剛好是兩個漢字的寬度。
GitHub 上能用 HTML 樣式做縮排嗎?
GitHub 的 Markdown 渲染器(GFM)支援部分 HTML 標籤,但會過濾掉 style 屬性。所以 <div style="margin-left: 2em;"> 這種寫法在 GitHub 上大概率不生效。在 GitHub 上推薦用   或引用區塊。
怎麼在 VS Code 裡快速輸入  ?
可以在 VS Code 的 snippets 中新增自訂程式碼片段。開啟命令面板搜尋「Configure User Snippets」,選擇 markdown.json,新增:
{
"Chinese indent": {
"prefix": ";2em",
"body": ["  $0"],
"description": "插入中文首行縮排"
}
}之後在 Markdown 檔案中輸入 ;2em 按 Tab 就能快速插入。
Markdown 縮排這個話題說大不大,說小不小。語法層面確實沒有原生支援,但透過 HTML 實體、全形空格、引用區塊、HTML 標籤、CSS 這幾種方式,基本上能覆蓋所有縮排需求。選哪種方案,主要看你用的平台和場景——在 GitHub 上寫 README,用   和列表縮排就夠了;自己架部落格的話,直接上 CSS text-indent,乾淨俐落。