這篇文章是對我所知道的常用、兼容性較好的Markdown語法的一個簡單的總結(jié),文中所有的語法在Typora編輯器和簡書上都可以正確顯示,如有錯漏之處,煩請指正。
什么是Markdown?
我覺得對HTML比較熟悉的同學(xué)可能會很容易地回答出這個問題——Markdown其實就是一個輕量級、用來編寫文檔的更易用的HTML。
當(dāng)然,對于沒有基礎(chǔ)的同學(xué),可以暫時這么認為:Markdown是一門標(biāo)記語言,可以算是簡化版的Word,但是你不需要為了設(shè)置各種格式而用鼠標(biāo)點來點去了,一切格式的控制都像HTML一樣,用代碼就可以完成。
Markdown文件的擴展名是.md,建文件的時候不要建錯了。
注意:Markdown的各種符號都是英文符,尤其要注意圓括號也是英文的圓括號。
Markdown編輯器推薦
在開始學(xué)習(xí)之前,肯定需要一份趁手的工具。
Markdown最好用專門編輯Markdown的編輯器來寫。這里推薦幾個我比較喜歡的Markdown編輯器,在學(xué)習(xí)Markdown語法之前可以先了解一下它們:
Typora
說到Markdown編輯器,肯定首推Typora了,用過的人都知道它有多好用,而且還支持寫HTML,而且顏值非常高,還支持換主題。我這篇教程就是使用Typora寫出來的。
Typora跟絕大多數(shù)左邊編輯右邊預(yù)覽的Markdown編輯器都不同,是實時全屏預(yù)覽的——你打完之后,立馬就可以看到效果,看起來跟Word一樣,卻比Word簡潔的多。如果不滿意,也可以進源代碼模式再去改,當(dāng)然有些格式也是可以直接改的。
Typora還帶大綱功能,真的是十分方便,我用過的Markdown編輯器里除了帶目錄插件的VSCode和語雀之外還沒見過有哪個可以實時生成大綱的。
最重要的是:Typora是跨平臺的!跨平臺!跨平臺!跨平臺!重要的事情說三遍!帶Linux玩的都是好朋友!
Visual Studio Code
沒錯,大名鼎鼎的VSCode也是可以寫Markdown的(好像沒有VSCode做不到的事情),而且語法高亮還挺完備的,相關(guān)插件也有很多。個人感覺使用體驗僅次于Typora。
推薦裝一個Markdown Preview Enhanced插件,這樣就可以實時預(yù)覽了,還有個神器Markdown All in One也很好用,但是需要額外記一些快捷鍵。強烈建議裝一個markdownlint做語法規(guī)范檢查,畢竟Markdown的編碼規(guī)范還是挺重要的。
使用體驗上,除了不是實時全屏預(yù)覽以外,使用體驗跟Typora幾乎沒什么差別,就是VSCode的使用體驗。
最重要的是:VSCode也是跨平臺的!跨平臺!跨平臺!跨平臺!重要的事情說三遍!帶Linux玩的都是好朋友!
簡書
了解我的人應(yīng)該都知道我在簡書上寫了多少東西??陀^來說,作為在線的編輯器,雖然沒有語法高亮,但是簡書還是挺不錯的,容錯能力很強(比如標(biāo)題的#號后面不打空格、段內(nèi)換行不打空格這種不規(guī)范的寫法都能正確識別),實時預(yù)覽也做得很不錯。很多時候有些比較短的文章我不想在本地開Typora寫,就直接在簡書上寫了,還是挺舒服的。
最主要的還是簡書自帶圖床,不用為把圖片保存在哪里而發(fā)愁。
另外,簡書的廣告比CSDN少多了,界面也是我喜歡的風(fēng)格,這也是我推薦它而不是CSDN的原因。
簡書也支持富文本。
當(dāng)然,簡書也是跨平臺的!畢竟Web應(yīng)用從來都不會受平臺限制,只要有瀏覽器就能訪問。
Md2All
官網(wǎng):http://md.aclickall.com/
這個東西比較冷門,本來的作用是將Markdown格式轉(zhuǎn)換為富文本,但是單純用來編輯Markdown也是挺不錯的,如果你對CSS比較熟悉的話,你還可以把它生成的富文本變得非常漂亮。
不支持云同步,寫完之后記得保存到本地。
最大的缺點就是不帶語法高亮了。坦白來說,寫Markdown沒語法高亮是真的難受。
印象筆記/為知筆記
說到有云同步功能的,除了本來就是Web應(yīng)用、自帶云同步的簡書就是這兩個了吧。這兩個作為筆記類的軟件,也是很出名的。
雖然印象筆記是最近才有的Markdown功能,但是語法高亮還是挺不錯的,比為知筆記舒服一些,也可以實時預(yù)覽,我發(fā)在簡書上那篇Maven學(xué)習(xí)筆記就是用印象筆記寫的。為知筆記不是很推薦,沒高亮也沒實時預(yù)覽。
但是印象筆記那個Markdown。。。也是有夠難受的,支持很有限,而且……真的太丑了,比不上Typora不說,畢竟人家太無敵了,但是連VSCode甚至Markdown Pad都比不上,就有點說不過去了……
總之這倆不建議用,想要云同步的話直接用簡書就行了,還順便開通了個個人博客。當(dāng)然你也可以“曲線救國”,用堅果云、iCloud、OneDrive做云同步。比較邪門的玩法還可以在GitHub上建一個倉庫存你的筆記(論GitHub的錯誤正確用法)。
想看正經(jīng)推薦的到這里就可以往下翻去看教程了,以下幾個都是不正經(jīng)推薦。
Markdown Pad
Windows獨享。
我18年入門Markdown的時候使用的第一個編輯器,可以說是麻雀雖小五臟俱全吧,比較簡陋,但是功能還是比較完善的。
一個很大的亮點就是自帶圖床了,對圖片很友好,畢竟Markdown最大的短板應(yīng)該就是圖片了。
可以試試,但是不推薦日常使用。
Xcode
macOS獨享。
這是你沒見過的船新玩法。
一開始我以為這么玩的都是大佬,但是macOS默認打開Markdown文件的方式居然真的是Xcode,真是無力吐槽了。。。
不過客觀上來講,除了沒實時預(yù)覽,Xcode寫Markdown感覺還是挺不錯的,畢竟語法高亮比較完備,顏值也是真的高。雖然本身是個跟Visual Studio一樣的超重量級的IDE,但是平常使用的話還是感覺不大到。
真的會有人日常用這玩意寫Markdown嗎……
Vim
macOS/Linux獨享,Windows有移植版本不過巨難用。
這是你沒見過的船新玩法*2。
嗯,不用多說,玩Vim的都是大佬。
反正我玩不動,各種命令和快捷鍵都快記瘋了,也就寫代碼的時候開個Vim模擬器玩玩了。
但是有一說一,Vim帶語法高亮,確實可以寫Markdown。
標(biāo)題
Markdown一共支持六級標(biāo)題,與HTML的<h1>到<h6>作用相同。
寫法:是第幾級標(biāo)題就在前面寫幾個#,#后面打一個空格,然后再跟上標(biāo)題內(nèi)容。
一級標(biāo)題還有一種比較冷門的寫法,就是在標(biāo)題行的下一行打-,幾個都可以。Typora需要進入源代碼模式才能打出。因為實在太麻煩了,所以這種寫法不建議大家用,用剛才說的#就可以了。
不打空格的話大多數(shù)編輯器識別不了,但也有能識別的,比如簡書和Markdown Pad,Typora老版本好像也可以。但是出于標(biāo)準(zhǔn)、規(guī)范而言,大家還是應(yīng)該打一個空格。
注意:標(biāo)題前后都應(yīng)該有一個空行。
例如:
# 一級標(biāo)題
## 二級標(biāo)題
### 三級標(biāo)題
#### 四級標(biāo)題
##### 五級標(biāo)題
###### 六級標(biāo)題
效果:
一級標(biāo)題
二級標(biāo)題
三級標(biāo)題
四級標(biāo)題
五級標(biāo)題
六級標(biāo)題
注意:有的編輯器只支持四級標(biāo)題(例如語雀),所以建議大家最好不要使用超過四級標(biāo)題。
注意2:嚴格意義上,一篇Markdown只可以有一個一級標(biāo)題,但是看了許多人的Markdown,遵守這個規(guī)定的人實在是不多啊~(反正我也不遵守)
正文
Markdown的正文與HTML的<p>標(biāo)簽類似。但是在Markdown里不用任何標(biāo)識符,直接寫就是一個段落。
注意:嚴格意義上講,Markdown直接打一個回車并不是換行。它的換行方式有兩種:
換段落
兩個段落之間空出一行,就相當(dāng)于另起一段。
Markdown:
this is a paragraph
this is another paragraph
相當(dāng)于HTML:
<p>
this is a paragraph
</p>
<p>
this is another paragraph
</p>
效果:
this is a paragraph
this is another paragraph
注意:有的Markdown編輯器按回車默認換段落,例如Typora,有的就不會,例如簡書(一個回車默認識別為段內(nèi)換行)。
注意2:Markdown里打多少個回車都只識別為一個,所以打一個就夠了。
換行
段落內(nèi)換行的方式是一行后接兩個(有的編輯器好像需要四個)空格,再接一個回車。
這兩個空格加一個回車的作用相當(dāng)于HTML的<br>標(biāo)簽。
但是有的編輯器,只打一個回車也能被識別為段內(nèi)換行,比如Typora(需要在源代碼模式下)和簡書。
例如:
this is a line
this is another line
相當(dāng)于HTML:
<p>
this is a line<br>this is another line
</p>
效果:
this is a line
this is another line
注意:
目前絕大多數(shù)的編輯器都支持把單獨一個回車視為段內(nèi)換行,例如簡書和Typora(需要進入源代碼模式)。不過大家還是應(yīng)該在需要段內(nèi)換行的時候在行的末尾打至少兩個空格。
引用
Markdown的引用是非常簡單的,只要在引用行的開頭打一個>,再跟一個空格,這一行就變成引用了。
相當(dāng)于HTML的<blockquote>標(biāo)簽。
例如:
> 這是一段引用
相當(dāng)于HTML:
<blockquote>這是一段引用</blockquote>
效果:
這是一段引用
列表
注意:按照規(guī)范,列表與段落、標(biāo)題之間應(yīng)該空一行。
注意2:列表項之間不需要多空一行,也不需要在列表項的末尾打空格換行。列表項的每一項是自動獨立成一行的。
有序列表
有序列表的寫法很簡單,跟Word一樣,就是數(shù)字加上一個英文的.,再接一個空格。
相當(dāng)于HTML的<ol>+<li>。
例如:
1. first
2. second
相當(dāng)于HTML:
<ol>
<li>first</li>
<li>second</li>
</ol>
效果:
- first
- second
無序列表
Markdown的無序列表打法不止一種,這里只介紹最常用的兩種:-后跟一個空格或者+后跟一個空格。兩者可以混用,我一般用+加一個空格的打法。
相當(dāng)于HTML的<ul>+<li>。
例如:
- 123
+ 123
相當(dāng)于HTML:
<ul>
<li>123</li>
<li>123</li>
</ul>
效果:
- 123
- 123
任務(wù)列表
任務(wù)列表的打法相對復(fù)雜些,是- [ ]后跟一個空格。注意在Typora等實時預(yù)覽的編輯器里,打出的順序是:
- 先打出
-[](方括號中間和減號后面無空格),然后后面打一個空格 - 方括號中間加一個空格
- 減號與左方括號之間加一個空格
打鉤的任務(wù)列表的方括號中間是一個x,就是小寫的x,沒有空格。
相當(dāng)于HTML<form>里的<input type="checkbox">,打鉤的就是有checked屬性的。
例如:
- [ ] 未完成
- [x] 已完成
相當(dāng)于HTML:
<form>
<input type="checkbox" id="checkbox">
<label for="checkbox">未完成</label>
<br>
<input type="checkbox" id="checkbox_checked" checked>
<label for="checkbox_checked">已完成</label>
</form>
效果:
- 未完成
- 已完成
注意:有的編輯器在打有序列表和無序列表時不跟空格也可以識別,比如簡書和Markdown Pad,但是絕大多數(shù)都是無法識別的,所以建議大家按照標(biāo)準(zhǔn),在數(shù)字和符號后面跟一個空格。
加粗
非常簡單,用**包裹要加粗的內(nèi)容就可以了。
相當(dāng)于HTML的<strong>。
例如:
在Java中,被標(biāo)識為final的類**不能被繼承**。
相當(dāng)于HTML:
在Java中,被標(biāo)識為final的類<srong>不能被繼承</strong>。
效果:
在Java中,被標(biāo)識為final的類不能被繼承。
斜體
與加粗打法很像,只不過斜體是打一個*而加粗是兩個。
相當(dāng)于HTML的<i>。
例如:
*我是斜的*
相當(dāng)于HTML:
<i>我是斜的</i>
效果:
我是斜的
刪除線
刪除線的打法也非常簡單,使用兩個~包裹要畫刪除線的部分就可以了。
相當(dāng)于HTML的<strike>。
例如:
~~看完這篇文章說不定你就可以入門HTML了~~
相當(dāng)于HTML:
<strike>看完這篇文章說不定你就可以入門HTML了</strike>
效果:
看完這篇文章說不定你就可以入門HTML了
行內(nèi)代碼/專有名詞
這個名字是我自己起的,因為我實在不知道它叫啥。。。
這個東西一般用來標(biāo)記專有名詞,或者一些簡單的代碼。
打法很簡單,就是用兩個`(就是Esc鍵下面,跟~在一起的那個,在英文下直接按就可以打出這個了。這個符號的名字其實叫“反引號”)把要標(biāo)記的部分包裹起來就行了。
相當(dāng)于HTML的<code>。
例如:
`Java`是世界上最好的語言
相當(dāng)于HTML:
<code>Java</code>是世界上最好的語言
效果:
Java是世界上最好的語言
代碼塊
代碼塊也有兩種打法,各有各的優(yōu)缺點。
注意:代碼塊前后都要與段落之間有一個空行。
第一種
第一種打法是三個`(就是剛才打行內(nèi)代碼時用到的那個,三個~也是可以的)加上你代碼的語言名稱,然后在代碼結(jié)束的地方再打三個。這也是我最常用的打法。
相當(dāng)于HTML的<pre>。
例如:
?```Java
package site.wendev.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
?```
相當(dāng)于HTML:
<pre>
package site.wendev.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
</pre>
效果:
package site.wendev.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
注意:有的Markdown編輯器會自動補全結(jié)束的三個`,比如Typora,但絕大多數(shù)都不會,需要你自己把它打上。
第二種
這一種比較小眾,打起來也比較麻煩,不過我剛?cè)腴T的時候用的是這一種打法。
這種打法就是代碼塊所在的行前面先打四個空格,再打代碼。Typora需要進入源代碼模式才能打出來,相對來說Markdown Pad打這種會方便些。
例如:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
同樣相當(dāng)于HTML的<pre>標(biāo)簽。
效果:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
因為這種打法太麻煩了,也不便于代碼的批量復(fù)制粘貼,所以不建議大家使用。
超鏈接
超鏈接以及接下來要說的圖片可能對剛學(xué)的同學(xué)來說有點難理解,但是不用擔(dān)心,對照著HTML來是很簡單的。
超鏈接的打法是[](),其中方括號內(nèi)為超鏈接的文字,圓括號內(nèi)是超鏈接的地址。
注意這個方括號和圓括號都是英文的。
相當(dāng)于HTML的<a>標(biāo)簽,圓括號里的是<a>標(biāo)簽的href屬性,方括號里的是<a>標(biāo)簽的內(nèi)容。
例如:
[我的簡書](http://www.itdecent.cn/u/dc63550214af)
相當(dāng)于HTML:
<a href="http://www.itdecent.cn/u/dc63550214af">我的簡書</a>
效果:
圖片
圖片就是超鏈接前加上一個英文的!。方括號內(nèi)為圖片的圖注,圓括號內(nèi)為圖片的網(wǎng)絡(luò)地址或者本地地址。
相當(dāng)于HTML的<img>標(biāo)簽,圓括號里的是src屬性,方括號里的是alt屬性。
例如:

相當(dāng)于HTML:
<img src="https://upload-images.jianshu.io/upload_images/15800372-81b1c3f89eb4b9c2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="我的首頁效果圖">
效果:

表格
表格是最復(fù)雜的,也是最勸退新人的,所以我們放在最后來講。不過沒關(guān)系,掌握了以后你也可以很輕松地打出來。
表格相當(dāng)于HTML的<table>。
因為表格的組成比較復(fù)雜,我們分塊來講。
表格的打法有很多種,這里介紹我最常用的一種。
注意:表格也要跟正文之間空出一行。
表頭
表頭的打法是:
thead|thead|thead
-----|-----|-----
相當(dāng)于HTML的<thead>。
上面的打法相當(dāng)于HTML的:
<thead>
<tr>
<td>thead</td>
<td>thead</td>
<td>thead</td>
</tr>
</thead>
表頭的第一行是表頭的內(nèi)容,相互之間用|分隔開,|的個數(shù)是表格的列數(shù)減1。
然后緊接著一行是-與|的組合,就是將第一行表頭的內(nèi)容換成-,幾個都可以,這一行是表頭與表格內(nèi)容的分界線。
表格內(nèi)容
表格內(nèi)容的打法與表頭一樣,都是:
tbody|tbody|tbody
tbody|tbody|tbody
兩列之間用一個|分隔開,行之間沒有分隔符,也不用多打空格來換行。
相當(dāng)于HTML的<tbody>。
上面的寫法相當(dāng)于HTML的:
<tbody>
<tr>
<td>tbody</td>
<td>tbody</td>
<td>tbody</td>
</tr>
<tr>
<td>tbody</td>
<td>tbody</td>
<td>tbody</td>
</tr>
</tbody>
綜上所述,整個表格的打法為:
thead|thead|thead
-----|-----|-----
tbody|tbody|tbody
tbody|tbody|tbody
相當(dāng)于HTML的:
<table>
<thead>
<tr>
<td>thead</td>
<td>thead</td>
<td>thead</td>
</tr>
</thead>
<tbody>
<tr>
<td>tbody</td>
<td>tbody</td>
<td>tbody</td>
</tr>
</tbody>
</table>
效果:
| thead | thead | thead |
|---|---|---|
| tbody | tbody | tbody |
| tbody | tbody | tbody |
注意:
似乎有些Markdown編輯器不認表格,也不知道是怎么回事。。。