Jade 語法整理

Jade 是HTML預(yù)處理語言,省略了大量的尖括號(hào)溢十,簡潔诉植,高效
參考網(wǎng)址:Jade的使用

Doctype

doctype html

生成的HTML:

<!DOCTYPE html>

其他常用類型還有: doctype xml, doctype transitional, doctype strict

標(biāo)簽

標(biāo)簽是 HTML 的核心元素届腐,Jade對(duì)縮進(jìn)敏感,可以根據(jù)縮進(jìn)劃分層次結(jié)構(gòu)往核,省略一些界定符號(hào)(大括號(hào)箫爷、尖括號(hào)......)。

ul 
    li Item A
    li Iten B
    li Item C

生成的HTML:

<ul>
    <li>Item A</li>
    <li>Item B</li>
    <li>Item C</li>
</ul>

提示:一定要保持一致的縮進(jìn)格式,建議統(tǒng)一將tab鍵輸出為空格虎锚,并采用4個(gè)空格為標(biāo)準(zhǔn)縮進(jìn)硫痰。

縮進(jìn)

Jade 支持兩種注釋:單行注釋和多行注釋,每種注釋支持兩種模式:輸出到源文件和不輸出到源文件窜护,差別在于多了一個(gè) -效斑。
創(chuàng)建一個(gè)單行輸出注釋和單行不輸出注釋:

// 這個(gè)單行注釋會(huì)輸出到編譯后的文件中
p 單行輸出注釋
//- 這個(gè)單行注釋不會(huì)輸出到編譯后的文件中
p 單行不輸出注釋

生成的HTML:

<!-- 這個(gè)單行注釋會(huì)輸出到編譯后的文件中-->
<p>單行輸出注釋</p>
<p>單行不輸出注釋</p>

相比起單行注釋柱徙,多行注釋的內(nèi)容要在注釋符號(hào)的下一行,以相同的縮進(jìn)來編寫护侮。

//
    這個(gè)多行注釋會(huì)輸出到編譯后的文件中
    這個(gè)多行注釋會(huì)輸出到編譯后的文件中
p 多行輸出注釋
//- 
    這個(gè)多行注釋不會(huì)輸出到編譯后的文件中
    這個(gè)多行注釋不會(huì)輸出到編譯后的文件中
p 多行不輸出注釋

生成的HTML:

<!-- 
這個(gè)多行注釋會(huì)輸出到編譯后的文件中
這個(gè)多行注釋會(huì)輸出到編譯后的文件中
-->
<p>多行輸出注釋</p> 
<p>多行不輸出注釋</p> 

屬性

在Jade 中填寫屬性,基本上和HTML保持一致:

input(type='checkout', checked)
input(
    type='checkbox'
    name='agreement'
    checked
)

生成的HTML:

<input type="checkbox" checked>
<input type="checkbox" name="agreement" checked>

對(duì)于頻繁使用的類名和ID名滨溉,Jade提供了兩個(gè)字面量:類名字面量和ID字面量,若不在字面量前指定標(biāo)簽名晦攒,則默認(rèn)使用 div

.link
a.link
#button
a#button

生成的HTML:

<div class="link"></div>
<a class="link"></a>
<div id="button"></div>
<a id="button"></a>

另一個(gè)常被修改的屬性是 style, 為了方便修改該屬性涧卵,Jade接收一個(gè)類似JavaScript對(duì)象類型的參數(shù):

a(style={color: 'red', background: 'green'})

生成的HTML:

<a style="color:red;background:green"></a>

為方便的添加其他自定義屬性腹尖,Jade特意增加一個(gè)語法格式 &attributes :

- var attributes = {'data-foo': 'bar'};
div#foo(data-bar="foo")&attributes(attributes)

生成的HTML:

<div id="foo" data-bar="foo" data-foo="bar"></div>

另外,還可以根據(jù)條件設(shè)置屬性的語法形式:

- var authenticated= true
body(class=authenticated ? 'authed' : 'anon')
- var currentUrl = '/about'
a(class={active: currentUrl === '/'} href='/') Home
a(class={active: currentUrl === '/about'} href='/about') About 

生成的HTML:

<body class="authed"></body>
<a href="/">Home</a><a href="/about" class="active"></a>

文本

Jade支持三種文本輸出方式:單行文本热幔、管道文本和多行文本:

// 單行文本內(nèi)容直接跟在標(biāo)簽名后面
p 這里是單行文本內(nèi)容
// 管道文本使用管道符
p 
    | 這是一行管道文本乐设,行數(shù)無限制
    | 這是一行管道文本,行數(shù)無限制
    | 這是一行管道文本绎巨,行數(shù)無限制
    | ......
// 多行文本需要在標(biāo)簽名后添加點(diǎn)號(hào)
p. 
    這是多行文本近尚,注意縮進(jìn)
    這是多行文本,注意縮進(jìn)
    這是多行文本场勤,注意縮進(jìn)
    ......

生成的HTML:

<!-- 單行文本內(nèi)容直接跟在標(biāo)簽名后面 -->
<p>這里是單行文本內(nèi)容</p>
<!-- 管道文本使用管道符 -->
<p>
    這里是一行管道文本,行數(shù)無限制
    這里是一行管道文本,行數(shù)無限制
    這里是一行管道文本赏廓,行數(shù)無限制
    ......
</p>
<!-- 多行文本需要在標(biāo)簽名后添加點(diǎn)號(hào) -->
<p>
    這里是一行管道文本狠鸳,行數(shù)無限制
    這里是一行管道文本,行數(shù)無限制
    這里是一行管道文本留瞳,行數(shù)無限制
    ......
</p>

代碼嵌入

將JavaScript嵌入到Jade中拒迅,共3種方法:

① 使用 -,代碼中的特殊字符不會(huì)被轉(zhuǎn)義:

-for (var i=0; i<3; i++)
    li <a></a>

生成的HTML:

<li><a></a></li>
<li><a></a></li>
<li><a></a></li>

② 使用 =,代碼中的特殊字符將會(huì)轉(zhuǎn)義:

p
    = 'This code is <escaped>!'

生成的HTML:

<p>this is <escaped;>!</p>

③ 使用 !=,代碼中的特殊字符不會(huì)被轉(zhuǎn)義:

p
    != 'This code is <escaped>!'

生成的HTML:

<p>this is <escaped>!</p>

插值語法

Jade 提供了字符串插值和標(biāo)簽插值璧微,其中字符串插值要考慮到安全性問題作箍,所以又分成轉(zhuǎn)義和不轉(zhuǎn)義兩種情況:

// 轉(zhuǎn)義字符串插值 #{}
- var theGreat = "<span>escape!</span>";
p This will be safe: #{theGreat}
// 不轉(zhuǎn)義字符串插值 !{}
- var theGreat = "<span>escape!</span>";
p This will be safe: !{theGreat}
// 標(biāo)簽插值
p #[a(href="jade-lang.com") Jade]

生成的HTML:

<!-- 轉(zhuǎn)義字符串插值 #{} -->
<p>This will be safe: <span>escape!</span></p>
<!-- 不轉(zhuǎn)義字符串插值 !{} -->
<p>This will be safe: <span>escape!</span></p>
<!-- 標(biāo)簽插值 -->
<p><a href="jade-lang.com"></a></p>

條件語句

最基本的條件語句:if ... else if ... else:

- var user = { description: 'foo bar baz' }
- var authorised = false
#user 
    if user.description
        h2 Description
        p.description=  user.description
    else if authorised
        h2 Description
        p.description.
            User has no description, 
            why not add one...
    else 
        h1 Description
        p.description User has no description

生成的HTML:

<div id="user">
    <h2>Description</h2>
    <p class="description">foo bar baz</p>
</div>

此外,Jade還提供了一個(gè) unless條件語句前硫,它會(huì)判斷條件是否不符合要求胞得,若不符合,則執(zhí)行下一步开瞭。

- var con = false
unless con
    p Hellp, World

生成的HTML:

<p>Hello, World</p>

分支語句

Jade中提供了類似switch語法 -- case:

- var friends = 10 
case friends 
    when 0 
        p you have no friends 
    when 1 
        p you have a friend 
    default 
        p you have #{friends} friends

生成的HTML:

<p>you have 10 friends</p>

注意:在Jade中并沒有提供類似break 的語法懒震,對(duì)于所有的條件默認(rèn)只有一種輸出結(jié)果,如果沒有符合條件的就輸出defualt 中的內(nèi)容嗤详,但有一種特例:

- var friends = 0 
case friends 
    when 0 
    when 1 
    default p you have #{friends} friends

生成的HTML:

<p>you have very 0 friends</p>

上面的示例可以看出个扰,當(dāng)沒有可輸出內(nèi)容時(shí),就會(huì)執(zhí)行向下查找可執(zhí)行語句葱色,一直到 default

遍歷語句

Jade使用 each 對(duì)數(shù)組和對(duì)象遍歷递宅,用法與JavaScript大同小異。

// 遍歷數(shù)組
ul 
    each val, index in ['zero', 'one', 'two']
        li= index + ': ' + val

// 遍歷對(duì)象
ul 
    each val, index in {1:'one',2:'two',3:'three'}
        li= index + ': ' + val

生成的 HTML:

<!-- 遍歷數(shù)組 -->
<ul>
    <li>0: zero</li>
    <li>1: one</li>
    <li>2: two</li>
</ul>
<!-- 遍歷對(duì)象 -->
<ul>
    <li>1: one</li>
    <li>2: two</li>
    <li>3: three</li>
</ul>

循環(huán)語句

Jade 使用 while 實(shí)現(xiàn)循環(huán)苍狰,用法與JavaScript相似:

- var n = 0;
ul 
    while n < 4
        li= n++

生成的 HTML:

<ul>
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>

mixins

在 Scss 和 Jade 中办龄,混合宏(mixins)都是舉足輕重的語法,混合宏具有復(fù)用淋昭、解耦、可讀英融、可擴(kuò)驶悟、可維護(hù)等優(yōu)勢(shì)材失。創(chuàng)建混合宏需要使用 mixin 標(biāo)識(shí)符龙巨,創(chuàng)建混合宏實(shí)例時(shí)旨别,需要使用 + 標(biāo)識(shí)符:

//- Declaration
mixin list
    ul
        li foo
        li bar
        li baz
//- Use
+list
+list

生成的 HTML:

<ul> 
    <li>foo</li> 
    <li>bar</li> 
    <li>baz</li> 
</ul> 
<ul> 
    <li>foo</li> 
    <li>bar</li> 
    <li>baz</li> 
</ul> 

上面是最基本的混合宏昼榛,給它傳遞參數(shù)剔难,才能讓它更有通用性:

mixin pet(name)
    li.pet= name
ul
    +pet('cat')
    +pet('dog')
    +pet('pig')

生成的 HTML:

<ul>
    <li class="pet">cat</li>
    <li class="pet">dog</li>
    <li class="pet">pig</li>
</ul>

此外,還可以使用 ... 標(biāo)識(shí)符表示不定數(shù)量的參數(shù):

mixin list(id, ...items)
    ul(id=id)
        each item in items
            li= item
+list('my-list', 1, 2, 3, 4)

生成的 HTML:

<ul id="my-list"> 
    <li>1</li> 
    <li>2</li> 
    <li>3</li> 
    <li>4</li> 
</ul>

有時(shí)候偶宫,我們需要替換混合宏的某個(gè)部分纯趋,就可以使用 block 標(biāo)識(shí)符來占位:

mixin article(title)
    .article
        .article-wrapper
            h1= title
            if block
                block
            else 
                p No content provided
+article('Hello world')

+article('Hello world')
    p This is my
    p Amazing article

生成的 HTML:

<div class="article">
    <div class="article-wrapper">
        <h1>Hello world</h1>
        <p>No content provided</p>
    </div>
</div>
<div class="article">
    <div class="article-wrapper">
        <h1>Hello world</h1>
        <p>This is my</p>
        <p>Amazing article</p>
    </div>
</div>

有關(guān)屬性的混合宏吵冒,其中一種是:

mixin link(href, name) 
    a(href=href)&attributes(attributes)= name
    
+link('/foo', 'foo')(class="btn")

生成的 HTML:

<a href="/foo" class="btn">foo</a>

上面混合宏中并沒有聲明 attributes痹栖,是因?yàn)?Jade 已經(jīng)隱式為其引用了所有傳遞給 &attributes 的參數(shù)

includes

實(shí)現(xiàn)高度復(fù)用的一種方式是將代碼片段保存到不同文件中揪阿,然后在需要的地方導(dǎo)入這些片段南捂,為此溺健,Jade 提供了 include 指令钮蛛。下面是一個(gè) index 頁面:

//- index.jade
doctype html
html
    include ./includes/head.jade
    body
        h1 My Site
        p Welcome to my super lame site.
        include ./incliudes/foot.jade

head 代碼片段:

//- includes/head.jade
head
    title My Site
    script(src='/javascripts/jquery.js')
    script(src='/javsscripts/app.js')

footer 代碼片段:

//- includes/foot.jade
#footer
    p Copyright (c) footer

生成的 HTML:

<!doctype html>
<html>
    <head>
        <title>My Site</title>
        <script src='/javascripts/jquery.js'></script>
        <script src='/javsscripts/app.js'></script>
    </head>
    <body>
        <h1>My Site</h1>
        <p>Welcome to my super lame site.</p>
        <div id="footer">
            <p>Copyright (c) footer</p>
        </div>
    </body>
</html>

繼承

Jade 中使用 extends 來繼承代碼片段缚去,與 include 本分地引用代碼段不同琼开,繼承可以修改代碼片段柜候。
首先,在 layout 頁面使用 block 標(biāo)識(shí)符渣刷,可以設(shè)置一個(gè)可修改的代碼片段矗烛,緊跟之后的是該代碼片段的名字:

//- layout.jade
doctype html 
html 
    head
        block title
            title Default title
    body
        block content

然后,在 index 頁面繼承 layout, 并可以根據(jù)代碼片段的名字修改相關(guān)代碼:

//- index.jade
extends ./layout.jade

block title
    title Article Title

block content
    h1 My Article

生成的 HTML:

<!doctype html> 
<html> 
    <head> 
        <title>Article Title</title> 
    </head> 
    <body> 
    <h1>My Article</h1> 
    </body> 
</html>

上面的繼承方式涣旨,會(huì)抹除原來代碼片段的部分霹陡,如果想要追加代碼片段,可以使用 appendprepend 指令烹棉。 append 用于在原來代碼片段之后追加浆洗,prepend 用于在原有代碼之前追加旅薄,一個(gè)初始頁面:

//- layout.jade
doctype html 
html 
    head
        title Layout
    body
        block content
            p Hello

生成的 HTML:

<html> 
    <head> 
        <script src="/vendor/jquery.js"></script> 
        <script src="/vendor/caustic.js"></script> 
    </head>
    <body> 
        <p>Hello</p> 
        <p>World</p> 
    </body> 
</html>

使用 prepend :

extend layout

block prepend content
    p World

生成的 HTML:

<html> 
    <head> 
        <script src="/vendor/jquery.js"></script> 
        <script src="/vendor/caustic.js"></script> 
    </head>
    <body> 
        <p>World</p> 
        <p>Hello</p> 
    </body> 
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洛口,一起剝皮案震驚了整個(gè)濱河市第焰,隨后出現(xiàn)的幾起案子妨马,更是在濱河造成了極大的恐慌烘跺,老刑警劉巖滤淳,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖咐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡偿凭,警方通過查閱死者的電腦和手機(jī)弯囊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作谭,“玉大人折欠,你說我怎么就攤上這事锐秦〉脸溃” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闲昭。 經(jīng)常有香客問我序矩,道長,這世上最難降的妖魔是什么瓶蝴? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任舷手,我火速辦了婚禮男窟,結(jié)果婚禮上珠叔,老公的妹妹穿的比我還像新娘祷安。我一直安慰自己兔乞,他們只是感情好凉唐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布台囱。 她就那樣靜靜地躺著簿训,像睡著了一般强品。 火紅的嫁衣襯著肌膚如雪屈糊。 梳的紋絲不亂的頭發(fā)上逻锐,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天晓淀,我揣著相機(jī)與錄音盏档,去河邊找鬼。 笑死锄俄,一個(gè)胖子當(dāng)著我的面吹牛奶赠,可吹牛的內(nèi)容都是我干的毅戈。 我是一名探鬼主播苇经,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼扇单,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜘澜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞪醋,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤银受,失蹤者是張志新(化名)和其女友劉穎蚓土,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜀漆,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鲜侥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了描函。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舀寓。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肌蜻,死狀恐怖蒋搜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情育谬,我是刑警寧澤膛檀,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站宿刮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏私蕾。R本人自食惡果不足惜僵缺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踩叭。 院中可真熱鬧磕潮,春花似錦、人聲如沸容贝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斤富。三九已至膏潮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叠纷。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工航厚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盈电。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容