在本文中咱們將展現一種新的使用仿CSS選擇器的語法來快速開發HTML和CSS的方法。它由Sergey Chikuyonok開發。html
你在寫HTML代碼(包括全部標籤、屬性、引用、大括號等)上花費多少時間?若是你的編輯器有代碼提示功能,你編寫的時候就會容易些,但即使如此你仍是要手動敲入不少代碼。前端
在JavaScript方面,當咱們想要在一個頁面上獲取某個特定的元素時,咱們就會遇到一樣的問題,咱們必須寫不少代碼,這就變得難於維護和重用。JavaScript框架應運而生,它們同時引入了CSS選擇器引擎。如今,你可使用簡單的CSS表達式來獲取DOM元素,這至關酷。vim
可是,若是你不只僅能夠用CSS的選擇器佈局和定位元素,還能生成代碼會怎麼樣?好比,若是你這樣寫:瀏覽器
複製代碼 代碼以下:
div#content>h1+p 框架
…而後就能夠看到這樣的輸出:
複製代碼 代碼以下:
<div id="content">
<h1></h1>
<p></p>
</div> eclipse
上面的效果能夠用dreamweaver,擴展下載地址 Zen Coding for Dreamweaver v.0.7 測試經過
有些迷惑吧?今天,我將向你介紹Zen Coding,一組用於快速HTML和CSS編碼的工具。最初由Vadim Makeev在2009年4月提出(文章爲俄語),由鄙人(也就是我)開發了數月並最終達到比較成熟的狀態。Zen Coding由兩個核心組件組成:一個縮寫擴展器(縮寫爲像CSS同樣的選擇器)和上下文無關的HTML標籤對匹配器。看一下這個演示視頻來看一下它們能爲你作些什麼。編輯器
注意:該視頻原版位於Vimeo,可是要看的話須要翻[和諧]牆先,地址在這裏:http://vimeo.com/7405114,上面的視頻是我費盡周折從Vimeo上下載下來上傳到優酷的,上傳後質量竟被大打折扣了,囧。youtube上也有一份視頻,是基於Aptana的演示,同樣很精彩:http://www.youtube.com/watch?v=ug84Ypwqfzk。PS:貌似youtube要比Vimeo翻[和諧]牆容易些,不過如何翻[和諧]牆不在本站討論範圍。工具
若是你想跳轉到詳細介紹和使用指南,請看一下演示頁面並馬上下載你適用的插件:佈局
Demo
Demo (使用 Ctrl + , 展開縮寫,須要JavaScript支持)
中文版演示
下載(徹底支持)
Aptana (跨平臺);
Coda, via TEA for Coda (Mac);
Espresso, via TEA for Espresso (Mac);
下載(部分支持,只支持「展開縮寫」)
TextMate (只能用於Mac機,Windows可使用E-text編輯器替代);
TopStyle;
Sublime Text;
GEdit;
Dreamweaver CS4
editArea在線編輯器;
Zen Coding在線編輯器中文版
如今讓咱們看一下這些工具是如何工做的吧。學習
展開縮寫
展開縮寫功能將相似CSS的選擇器轉換爲XHTML代碼。術語「縮寫」可能會有點兒難以理解。爲何不直接稱之爲「CSS選擇器」呢?嗯,首要緣由是語義化:「選擇器」意爲選擇一些東西,可是在這裏咱們事實上是生成 一些東西,是寫一個長代碼的較短的替代。其次,它只是使用真實的CSS選擇器語法的一個小的子集,並添加了一些新的操做符。
這裏是一個支持的屬性和操做符的列表:
E
元素名稱(div, p);
E#id
使用id的元素(div#content, p#intro, span#error);
E.class
使用類的元素(div.header, p.error.critial). 你也能夠聯合使用class和idID: div#content.column.width;
E>N
子代元素(div>p, div#footer>p>span);
E+N
兄弟元素(h1+p, div#header+div#content+div#footer);
E*N
元素倍增(ul#nav>li*5>a);
E$*N
條目編號 (ul#nav>li.item-$*5);
正如你能看到的,你已經知道如何使用Zen Coding了:只是些一個簡單的仿CSS選擇器(呃,「縮寫」抱歉),就像這樣…
複製代碼 代碼以下:
div#header>img.logo+ul#nav>li*4>a
…而後調用」展開縮寫」行爲。
這裏有兩個新增的操做符:元素倍增和條目編號。好比,若是你想生成5個<li>元素,你能夠簡單的寫位li*5。它也將一樣重寫所有子代元素。若是你想寫4個<li>元素,每一個裏面都有一個<a>標籤,你就能夠簡單的寫爲li*4>a,這樣會生成如下HTML代碼:
複製代碼 代碼以下:
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
最後一個——條目編號用於當你想用索引標記重複的元素的狀況。假設你想生成class爲item一、item2和item3的3個<div>元素。你能夠寫成這樣的縮寫,div.item$*3:
複製代碼 代碼以下:
<div class="item1"></div>
<div class="item2"></div>
<div class="item3"></div>
只需在你想要索引出現的任何class或id屬性上添加一個美圓符號便可,並且想要多少均可以。那麼,這樣…
複製代碼 代碼以下:
div#i$-test.class$$$*5
會被轉換成爲:
複製代碼 代碼以下:
<div id="i1-test" class="class111"></div>
<div id="i2-test" class="class222"></div>
<div id="i3-test" class="class333"></div>
<div id="i4-test" class="class444"></div>
<div id="i5-test" class="class555"></div>
Zen Coding是如何知道何時應該爲生成的標籤添加默認的屬性或者跳過關閉標籤的?有一個專門的文件,名爲zen_settings.js描述了輸出元素。這是一個簡單的JSON文件,描述每種語言的縮寫(是的,你能夠爲不一樣的句法定義縮寫,好比HTML、XSL、CSS等)。通用的語言縮寫定義看起來就像這樣:
複製代碼 代碼以下:
'html': { 'snippets': { 'cc:ie6': '<!--[if lte IE 6]>\n\t${child}|\n<![endif]-->',
...
},
'abbreviations': { 'a': '<a href=""></a>', 'img': '<img src="" alt="" />',
...
}
}
元素類型
Zen Coding有兩個主要的元素類型:「片斷(snippets)」 和 「縮寫(abbreviations)」。片斷就是隨意的代碼碎片,而縮寫是標籤訂義。經過片斷,你能夠寫出你想要的任何代碼,它也會照你寫的格式輸出;可是你必須手動的格式化它(使用\n 和\t實現換行和縮進) 並將${child}變量放到你想要輸出子元素的地方,就像這樣:cc:ie6>style。若是你不使用${child}變量,子元素將會輸出於代碼片斷的後面。
有了縮寫,您必須編寫標記定義,並且語法是很是重要的。一般,你必須寫一個簡單的帶有全部默認的屬性的標籤,好比: <a href=」"></a>。當Zen Coding被加載後,它會解析一個標籤訂義到一個描述該標籤的名字、屬性(包括它們的順序)以及該標籤是否爲空的特定的對象中。因此,若是你寫<img src=」" alt=」" />,你會告訴Zen Coding這個標籤必須是空的,而後「擴展縮寫」行爲就會在輸出以前爲它使用特定的規則。
對於片斷和縮寫,你能夠添加一個管道符號,它告訴Zen Coding當縮寫被展開的時候光標會被定位到哪裏。默認的,Zen Coding 將光標放在空屬性的引號中間以及開始和關閉標籤的中間。
例子
那麼,這裏解釋一下當你寫了一個縮寫並召喚「展開縮寫」行動時發生的事情。首先,它將一個完整的縮寫分開爲獨立的元素:這樣div>a 會被分紅div 和a 元素,固然也會維持他們的關係。而後,每一個元素,解析器先在代碼片斷內然後在縮寫中尋找定義。若是它找不到,將會使用元素的名字做爲新的標籤,併爲其添加縮寫中定義的id和class。好比,若是你寫mytag#example,解析器在片斷或縮寫中找不到mytag定義,它就會輸出<mytag id=」example」><mytag>。
咱們製做了不少默認的CSS和HTML縮寫和片斷。你會發現學習使用Zen Coding能夠增長你的生產力。
HTML 標籤對匹配器
對於HTML編碼者的另外一個很是常見的任務是尋找一個元素的標籤對。例如你想選擇整個<div id=」content」>標籤並將其移動到其它地方或者刪除它。或者有可能你在尋找一個關閉標籤並想知道它屬於那個開始標籤。
不幸的是,不少現代開發工具在該功能方面有所欠缺。那麼我就決定寫一個我本身的標籤對匹配器做爲Zen Coding的一部分。不過它依然在beta階段並尚存一些問題,但它能夠工做的很不錯並很快。不是瀏覽整個文檔(像一般的那種HTML標籤對匹配器的作法),它從光標的當前位置開始尋找相關的標籤。這使得它很是快而且上下文無關:它甚至能夠用於這段JavaScript代碼片斷:
複製代碼 代碼以下:
var table = '<table>'; for (var i = 0; i < 3; i++) {
table += '<tr>'; for (var j = 0; j < 5; j++) {
table += '<td>' + j + '</td>';
}
table += '</tr>';
}
table += '</table>';
使用縮寫包裹
這真的是一個很酷的特性,它將縮寫和標籤對匹配器的功能合併到一塊兒了。你有多少才發現你須要添加一個包裹元素以修正一個瀏覽器bug?或者你須要添加一個裝飾,好比一個背景圖片或者邊框到一個塊級內容?你必須寫開始標籤,臨時打斷你的代碼,找到相關的點而後關閉標籤。這就是「使用縮寫包裹」能幫助你的地方。
該功能至關簡單:它要求你輸入縮寫,而後執行適當的「展開縮寫」行動並將你指望的文本放到你縮寫的最後一個元素裏面。若是你沒有選擇任何文本,它就會啓動標籤對匹配器並使用結果。它一樣能搞清楚你的光標的位置:標籤的內容裏面或者是開始和關閉標籤中間。依賴於它的位置,它會包裹標籤的內容或標籤自己。
縮寫包裹爲包裹個別行引入了一個特定的縮寫句法。簡單跳轉到倍增操做符後面的數字,好比:ul#nav>li*>a。當Zen Coding 發現一個使用未定義的倍增數的時候,它會將它做爲一個重複元素:你的章節中有多少行,它就會輸出多少次,並將每行的內容放到重複元素的最後一個子元素裏面。
若是你在這段文本外面包裹這段縮寫div#header>ul#navigation>li.item$*>a>span:
複製代碼 代碼以下:
About Us
Products
News
Blog
Contact Up
你將會獲得如下結果:
複製代碼 代碼以下:
<div id="header">
<ul id="navigation">
<li class="item1"><a href=""><span>About Us</span></a></li>
<li class="item2"><a href=""><span>Products</span></a></li>
<li class="item3"><a href=""><span>News</span></a></li>
<li class="item4"><a href=""><span>Blog</span></a></li>
<li class="item5"><a href=""><span>Contact Up</span></a></li>
</ul>
</div>
你能夠看到,Zen Coding是一個強大的文本處理工具。
快捷鍵
Ctrl+,
展開縮寫
Ctrl+M
匹配對
Ctrl+H
使用縮寫包括
Shift+Ctrl+M
合併行
Ctrl+Shift+?
上一個編輯點
Ctrl+Shift+?
下一個編輯點
Ctrl+Shift+?
定位匹配對
這些快捷鍵是能夠自定義的。
在線演示
你已經學到不少關於Zen Coding如何工做以及它是如何使你的編碼更容易了。如今爲何不本身嘗試一下呢?由於Zen Coding是用純JavaScript開發並遷移到Python,它甚至能夠用於瀏覽器內部,這令它成爲引入到CMS的首選。
Demo (使用 Ctrl + , 展開縮寫,須要JavaScript支持)
中文版演示
支持的編輯器
Zen Coding並不依賴某個特定的編輯器。它是一個只處理文本的出色的組件:它獲取文本、作一些處理並放回新的文本(或索引,用於標籤匹配)。Zen Coding由JavaScript和Python編寫,因此它實際上能夠運行於任何平臺。在Windows,你能夠運行JavaScript版本,而Mac和Linux 分支可使用Python版。
若是讓你的編輯器支持Zen Coding,你須要寫一個特定的能夠在你的編輯器和Zen Coding之間轉換數據的插件。問題是一個編輯器可能不會完整的支持Zen Coding由於它自己的插件系統。好比,TextMate經過使用腳本輸出替換當前行很容的就支持了「展開縮寫」功能,可是它不能處理標籤對匹配由於沒有標準的方法請求TextMate來選擇內容。
徹底支持
Aptana (跨平臺);
Coda, via TEA for Coda (Mac);
Espresso, via TEA for Espresso (Mac);
部分支持(只支持「展開縮寫」)
TextMate (只能用於Mac機,Windows可使用E-text編輯器替代);
TopStyle;
Sublime Text;
GEdit;
Dreamweaver CS4
editArea在線編輯器;
Zen Coding在線編輯器中文版
Aptana是我主要的開發環境,它使用一個JavaScript版本的Zen Coding。它也包含不少其它的我用於平常工做的工具,因此任何一個新的Zen Coding版本都將會首先對Aptana可用,而後部署到Python併兼容其它的編輯器。
Coda和Espresso 插件被傑出的Text Editor Actions (TEA) 平臺支持,由Ian Beck開發。原始的源代碼在GitHub上,但我仍是製做了我本身的分支以整合Zen Coding的特性。
總結
不少嘗試過Zen Coding的人都說它改變了他們寫頁面的方式。固然還有不少事情要作,還有不少的編輯器須要被支持以及一些文檔要寫。請瀏覽如今的文檔 以及源代碼以尋找你的問題的答案。但願你喜歡Zen Coding!
附:Zen coding的具體用法
遺憾的是, 本文原做者並無說明zen coding的具體用法,神飛認爲有必要作如下簡要的說明。這裏就以Aptana/Eclipse和Dreamweaver爲例,其它編輯器平臺暫不描述,若有疑問能夠在評論中與前端觀察的網友交流。
Aptana/Eclipse
因爲Aptana自己就是基於Eclipse的,因此,Zen Coding也是支持Eclipse的,只是須要一個EclipseMonkey插件的支持,Aptana已經封裝了這個插件,因此若是你使用Aptana,下面的第一步能夠跳過。
經過更新網站安裝EclipseMonkey: http://download.eclipse.org/technology/dash/update(若是你使用Aptana,可跳過這一步)
在你的當前工做去建立一個頂級的項目,給它命名,好比,就叫zencoding
在新建立的項目中建立scripts文件夾
解壓縮下載的ZIP插件包到該文件夾。項目結構看起來就像這樣:
安裝以後,Aptana的菜單欄中的「腳本(Script)」菜單中將會出現Zen coding相關子菜單
注意事項:
Aptana版的官方插件是基於MAC機的,若是你用的是Windows,須要手動更改快捷鍵(在每一個文件頭部的註釋片斷中更改)
官方的文件編碼有點兒亂,修改官方js的時候,請注意編碼問題,修改不當會形成相關功能的丟失;
DreamWeaver
好消息是,如今已經有了Zen coding for DreamWeaver插件,壞消息是,該插件支持的功能不多,只支持展開縮寫功能。並且默認的快捷鍵是無效的。只能在「命令」菜單中點擊操做。另外,沒有測試該插件是否是隻支持CS4版本。不過比較好的是,做者將本插件的源碼也放出了,你能夠自定義一個Dreamweaver的插件。
事實上,官方的DW插件在Windows下有點兒bug,就是會出現空白的行,我簡單的修正了下,從新編譯了個包,在本機測試沒問題,感興趣的童鞋能夠下載嘗試:http://www.boxcn.net/shared/c71z7x7sfe
PS:官方的DW插件已經更新,推薦到官方去下載。新的插件添加了更多的功能支持。UPDATE @ 12-23-2009
特別推薦:豪情同窗將縮寫給實踐了一番,總結出了不少很棒的用例,推薦你們前去學習。
原做者介紹:
Sergey Chikuyonok是一位俄羅斯的前端開發工程師和做者,他在優化方面有很大的熱情:從圖片、JavaScript效果到工做流程和節省時間的編碼。訪問他的主頁和他的Twitter。