行內連結:九成場合都用它
最基本的寫法是:方括號包住要顯示的文字,緊接著用小括號包住目的地網址:
建議先讀 [Markdown 指南](https://mdeditor.tw/zh/markdown-guide)。
- 方括號放文字、小括號放網址,兩者之間不能有空格。
- 參考式連結能把又長又重複的網址集中到檔案底部。
- 錨點 ID 是把標題轉小寫、移除標點、再把空格換成連字號得到的。
- 中文輸入法打出的全形括號看起來沒問題,實際上完全不會渲染。
為什麼一個空格就會壞掉
] 和 ( 之間不能有空格。那一個空格是 Markdown 連結最常見的失敗原因,而且它不會報錯,只會在正文中間留下裸露的括號。
加上 title 屬性
網址後面加一段用引號包住的文字,會變成 HTML 的 title 屬性,滑鼠停留時顯示成提示泡泡:
[Markdown 指南](https://mdeditor.tw/zh/markdown-guide "每個元素都有說明")
單引號和小括號也能當分隔符號,但雙引號是慣例。title 請節制使用:觸控裝置上看不到提示泡泡,螢幕閱讀器也不保證會朗讀,所以它不能承載連結文字沒交代的資訊。
連結文字裡的格式
連結文字接受行內 Markdown,可以只強調其中一部分,規則就是粗體與斜體參考裡那一套:
請參考[**必填**的 `--force` 參數](https://example.com/docs/flags)。
但連結不能巢狀包在另一個連結裡。解析器會在第一個能配對的 ] 收尾,畫面上留下一個斷掉的半截連結。
參考式連結,以及它什麼時候真的有用
參考式連結把標籤和目的地分開。你在正文寫 [文字][識別碼],再在文件其他地方定義 [識別碼]: 網址:
[樣式指南][style]與[API 參考][api]都由同一份原始碼產生,
而[樣式指南][style]每一季都會重新審視。
[style]: https://example.com/handbook/style-guide
[api]: https://example.com/developers/reference/v3/endpoints
定義本身不會出現在輸出結果裡,位置也很自由,慣例是放在檔案最後,而且識別碼不分大小寫。
兩種簡寫,其中一種有風險
- 收合式寫法
[Markdown 指南][],直接拿連結文字當識別碼。 - 捷徑式寫法
[Markdown 指南],連第二組方括號都省略,只要有同名定義就能生效。
捷徑式很優雅,但風險也在這裡:一旦有人加了同名定義,任何被方括號包住的詞都會突然變成連結。
什麼時候值得用
參考式連結在三種情況下最划算:
- 同一個網址重複出現,你希望只在一個地方更新。
- 網址長到會毀掉整行版面,原始碼變得難讀。
- 文件會以 diff 形式審閱,改網址只動到檔案底部一行,而不是動到正文。
至於一次性的連結,行內寫法更簡單。Markdown 完整指南裡的範例也是這個原則:網址不重複就用行內。
自動連結與裸網址
如果你希望顯示的文字就是網址本身,用角括號把它包起來:
文件在 <https://mdeditor.tw/zh/markdown-guide>。
這是 CommonMark 的自動連結(autolink)。它要求完整的協定前綴,例如 https:、mailto: 或 ftp:,所以 <example.com> 不會生效,甚至可能被當成不認識的 HTML 標籤整段吞掉。
裸網址是 GitHub 的延伸功能
GitHub 風格 Markdown(GFM)多了一條更寬鬆的規則:正文裡的裸網址會自動變成連結,連括號都不用打。
文件在 https://mdeditor.tw/zh/markdown-guide,每週更新。
注意:純 CommonMark、Markdown.pl 與若干極簡渲染器會把裸網址留成純文字。文件必須到哪都長一樣時,請用角括號或完整的行內連結。哪些工具會自動連結、哪些不會,平台比較有整理。
GFM 的自動連結對標點也很死板:結尾的逗號或句號會被排除在連結之外,結尾的右小括號卻常常不會。
相對路徑與絕對網址
絕對網址包含協定與網域,從任何地方指過去意義都相同,例如 https://example.com/docs/setup。相對網址則相對於「目前這份文件所在的位置」解析,這既是它的優點也是它的問題。
[貢獻指南](CONTRIBUTING.md)
[安裝說明](docs/setup.md)
[回到根目錄的 readme](../README.md)
儲存庫畫面與發佈後的網站
在 GitHub 儲存庫裡,上面的寫法完全正確,因為 GitHub 以該檔案所在目錄為基準解析路徑。
麻煩出現在同一批檔案被靜態網站產生器發佈之後。多數產生器會把 docs/setup.md 改寫成 /docs/setup/ 這種乾淨網址,於是你手寫的 setup.md 連結在正式站上可能變成 404。MkDocs 與 Docusaurus 會替你自動改寫 .md 目標,所以它們的文件才叫你保留副檔名;其他組合就不一定了。
三條值得背下來的路徑規則
- 儲存庫內不要加開頭斜線。在瀏覽器裡
/docs/setup指的是網域根目錄,在儲存庫畫面裡卻可能被解析成儲存庫根目錄。 - 會出現在兩個地方的內容就用絕對網址,例如同時顯示在 npmjs.com 上的 README。
- 大小寫要完全一致。託管靜態網站的伺服器多半區分大小寫,即使你的筆電不是;
Setup.md與setup.md在本機是同一個檔案,在正式環境卻是兩個網址。
跳到標題的錨點連結
錨點連結是跳到頁面內的某個標題,而不是載入新頁面。目的地是一個 # 加上該標題自動產生的 ID:
可直接跳到[安裝](#installation)或[疑難排解](#troubleshooting)。
這些 ID 不需要你自己建立:GitHub 與多數渲染器會替每個標題產生一個,規則簡單到你可以手動推導。同一套規則從標題那一側的說明,請見標題參考。
標題 ID 是怎麼產生的:實例推導
以這個標題為例:
## Setting Up Your API Key (v2)
渲染器依序做四件事:
- 去掉標題符號,剩下
Setting Up Your API Key (v2) - 全部轉成小寫:
setting up your api key (v2) - 移除標點,只留字母、數字、空格、連字號與底線:
setting up your api key v2 - 把空格換成連字號:
setting-up-your-api-key-v2
所以連結要這樣寫:
[設定你的金鑰](#setting-up-your-api-key-v2)
重複標題、中文標題與其他渲染器
- 文字相同的第二個標題會加上
-1,第三個加-2。 - 中日韓文字在 GitHub 上會被保留,所以
## 安裝步驟的 ID 就是#安裝步驟。 - 表情符號與大多數符號會被整個移除。
- 各渲染器的 slug 規則略有差異,用猜的並不可靠。
小提醒:跳轉連結沒反應時,別再猜 slug 了。打開渲染後的頁面,把滑鼠移到標題上,直接從旁邊的連結圖示複製錨點。五秒鐘的事,而且不會錯。
連到另一份文件裡的標題
把路徑和片段組合起來即可。前一節的路徑規則依然適用,片段則由那份文件的標題產生:
[安裝 CLI](docs/setup.md#installing-dependencies)
[流量限制](https://example.com/api/reference#rate-limits)
這是多檔案文件導覽的骨幹。連到章節比連到整份檔案更有用,因為讀者會被直接送到正確的段落。
圖片連結、電子郵件、電話與全表整理
圖片也可以當成連結的可點擊區域:把圖片語法放在原本擺連結文字的位置。GitHub 上的建置狀態徽章都是這樣做的。
[](https://ci.example.com/builds/latest)
由內往外讀: 是內容,外面的 [...](目的地) 把它包起來。替代文字與尺寸控制請見圖片參考。
電子郵件與電話連結
兩者用的都是一般的 URL 協定:
<[email protected]>
[寫信給我們](mailto:[email protected]?subject=Docs%20feedback)
[02-1234-5678](tel:+886212345678)
角括號寫法會自動連結該信箱,GitHub 還會在 HTML 輸出中做混淆處理,當作簡易的防垃圾信措施。tel: 連結在手機上可撥號、在桌機上沒有作用,所以請把好讀的號碼放在連結文字,純數字的國際格式放在網址裡。
所有連結型態一次看完
下表整理十二種寫法、各自的適用時機,以及一定要記得的渲染器脾氣。
| 連結類型 | 語法 | 適用時機 | 渲染器注意事項 |
|---|---|---|---|
| 行內連結 | [文字](網址) | 幾乎所有情況 | 全平台通用 |
| 行內連結加 title | [文字](網址 "標題") | 額外的滑鼠提示 | 通用;觸控裝置看不到 |
| 參考式 | [文字][識別碼] 加 [識別碼]: 網址 | 重複或超長的網址 | 通用;識別碼不分大小寫 |
| 收合式參考 | [文字][] | 文字本身就是識別碼 | 全平台通用 |
| 捷徑式參考 | [文字] | 詞彙表型文件 | 通用,但任何方括號詞都可能被觸發 |
| 自動連結 | <https://example.com> | 要顯示網址本身 | 必須有完整協定前綴 |
| 裸網址 | https://example.com | 聊天與留言 | 僅 GFM;CommonMark 視為純文字 |
| 錨點 | [文字](#heading-id) | 同頁導覽 | ID 規則依渲染器而異 |
| 跨檔錨點 | [文字](docs/setup.md#install) | 多檔案文件 | 網站產生器可能改寫路徑 |
| 電子郵件 | <[email protected]> | 聯絡資訊 | GitHub 會混淆信箱 |
| 電話 | [0912-345-678](tel:+886912345678) | 行動裝置優先的頁面 | 手機可撥號,桌機無作用 |
| 圖片連結 | [](網址) | 徽章與橫幅 | 全平台通用 |
刁鑽網址、跳脫,以及在新分頁開啟
網址裡有空格
空格會終止目的地,所以 [報告](my report.pdf) 會壞掉。解法有兩個:把空格做百分比編碼(可攜性最好),或用角括號把目的地包起來(CommonMark 與 GitHub 都支援):
[第三季報告](my%20report.pdf)
[第三季報告](<my report.pdf>)
網址裡有小括號
右小括號可能讓連結提前結束。CommonMark 允許成對的括號,所以結尾是 _(disambiguation) 的維基百科網址在 GitHub 上通常沒事;不成對的括號一定會壞,較舊的渲染器則兩種都會壞。用反斜線跳脫,或編碼成 %28 與 %29:
[Markdown](https://en.wikipedia.org/wiki/Markdown_%28disambiguation%29)
[更新日誌](https://example.com/notes\(final\))
同樣的跳脫也適用於連結文字裡真正要顯示的方括號:寫 \[ 就能印出一個不會啟動連結的方括號。
在新分頁開啟連結
Markdown 刻意沒有這個語法,因為這個格式描述的是結構而不是行為。如果真的需要,就退回原生 HTML:
<a href="https://example.com" target="_blank" rel="noopener noreferrer">開啟儀表板</a>
使用 target="_blank" 時務必一起加上 rel="noopener noreferrer",否則目的地頁面會拿到一個可以用腳本操作你頁面的把柄。另外,許多平台會直接過濾掉 Markdown 裡的原生 HTML,多數網站產生器則提供設定或外掛,自動替外部連結加上該屬性。兩種格式的分界線在哪,Markdown 與 HTML 比較有深入討論。
常見錯誤與修正寫法
幾乎所有渲染不出來的連結,都逃不出這五個錯誤:
- 括號放反了,文字被放進小括號。
]與(之間多了空格,括號直接印在畫面上。- 中文或日文輸入法打出的全形括號。
- 錨點直接照抄標題文字,大寫和標點都留著。
- 網址裡有沒編碼的空格,目的地被截斷。
括號順序與多餘的空格
文字放方括號,網址放小括號。錯誤寫法與正確寫法:
(Markdown 指南)[https://mdeditor.tw/zh/markdown-guide]
[Markdown 指南](https://mdeditor.tw/zh/markdown-guide)
多餘空格則是刪掉一個字元就好。錯誤寫法與正確寫法:
[Markdown 指南] (https://mdeditor.tw/zh/markdown-guide)
[Markdown 指南](https://mdeditor.tw/zh/markdown-guide)
中文輸入法打出的全形括號
這是中日韓寫作者最浪費時間的失敗原因。輸入法設定成全形標點時,打括號會得到 [] 或 (),而不是半形的 [] 與 ()。兩者在畫面上幾乎一模一樣,但解析器只看到普通文字,什麼都不會渲染。錯誤寫法,以及改用半形標點的正確寫法:
[Markdown 指南](https://mdeditor.tw/zh/markdown-guide)
[Markdown 指南](https://mdeditor.tw/zh/markdown-guide)
小提醒:這個問題要從源頭解決。寫 Markdown 前先把輸入法切到半形標點,macOS 與 Windows 的中文、日文輸入法都有這個切換。同樣的陷阱也會出現在標題的全形 # 與行內程式碼的全形 `,一次設定好,等於省下三次除錯。
錨點與沒編碼的空格
大寫與標點在產生 slug 時不會保留。錯誤寫法與正確寫法:
[Setup](#Setup Guide!)
[Setup](#setup-guide)
最後一個是沒編碼的空格:空格之後的內容會被當成 title 或直接丟掉,連結因此指向一個被截斷的網址,請照前面說的做百分比編碼。
連結出狀況時怎麼除錯
把那一行貼進編輯器看預覽,原因幾乎都是上述五種之一。
Markdown 完整指南會把連結放進所有元素之中一起說明,語法速查表讓語法一眼可查,姊妹頁面清單、表格與程式碼區塊則涵蓋連結最常被放進去的元素。
相容性資料驗證日期
常見問題
怎麼讓 Markdown 連結在新分頁開啟?
Markdown 沒有這個語法,只能改寫原生 HTML:<a href="https://example.com" target="_blank" rel="noopener noreferrer">文字</a>。會過濾 HTML 的平台會把整個標籤丟掉;多數靜態網站產生器則有設定或外掛,能自動替外部連結加上該屬性。
為什麼我的錨點連結跳不到標題?
片段與自動產生的 ID 不一致。ID 會全部轉小寫、移除標點、把空格換成連字號,所以 ## API Key (v2) 的 ID 是 #api-key-v2,重複的標題還會加上 -1 後綴。最可靠的做法是打開渲染後的頁面,從標題旁的連結圖示直接複製錨點。
什麼時候該用參考式連結?
網址重複出現時、網址長到讓原始碼那一行難以閱讀時,或文件會以 diff 形式審閱、你希望網址變動集中在檔案底部時。若只是留言或短筆記裡的單一連結,行內連結更簡單好讀。
裸網址會自動變成可點擊的連結嗎?
只有在 GitHub 風格 Markdown 與類似方言裡才會。純 CommonMark 與較舊的渲染器會留成純文字。可攜的做法是用角括號 <https://example.com>,或寫成有描述性文字的完整行內連結。
為什麼用中文輸入時連結都壞掉?
因為輸入法插入的是全形括號 [](),而不是半形的 []()。兩者外觀非常接近,但解析器認不得。寫 Markdown 語法前先把輸入法切到半形或英文標點,標題與行內程式碼的同類問題也會一併解決。
延伸閱讀
立即使用編輯器
立即使用編輯器