在本文中我們將展示一種新的使用仿CSS選擇器的語(yǔ)法來(lái)快速開(kāi)發(fā)HTML和CSS的方法。它由Sergey Chikuyonok開(kāi)發(fā)。
你在寫(xiě)HTML代碼(包括所有標(biāo)簽、屬性、引用、大括號(hào)等)上花費(fèi)多少時(shí)間?如果你的編輯器有代碼提示功能,你編寫(xiě)的時(shí)候就會(huì)容易些,但即便如此你還是要手動(dòng)敲入很多代碼。
在JavaScript方面,當(dāng)我們想要在一個(gè)頁(yè)面上獲取某個(gè)特定的元素時(shí),我們就會(huì)遇到同樣的問(wèn)題,我們必須寫(xiě)很多代碼,這就變得難于維護(hù)和重用。JavaScript框架應(yīng)運(yùn)而生,它們同時(shí)引入了CSS選擇器引擎。現(xiàn)在,你可以使用簡(jiǎn)單的CSS表達(dá)式來(lái)獲取DOM元素,這相當(dāng)酷。
但是,如果你不僅僅可以用CSS的選擇器布局和定位元素,還能生成代碼 會(huì)怎么樣?比如,如果你這樣寫(xiě):
復(fù)制代碼 代碼如下:
div#content>h1+p
…然后就可以看到這樣的輸出: 復(fù)制代碼 代碼如下:
div id="content"> h1>/h1> p>/p> /div>
上面的效果可以用dreamweaver,擴(kuò)展下載地址 Zen Coding for Dreamweaver v.0.7 測(cè)試通過(guò) 有些迷惑吧?今天,我將向你介紹Zen Coding,一組用于快速HTML和CSS編碼的工具。最初由Vadim Makeev在2009年4月提出(文章為俄語(yǔ)),由鄙人(也就是我)開(kāi)發(fā)了數(shù)月并最終達(dá)到比較成熟的狀態(tài)。Zen Coding由兩個(gè)核心組件組成:一個(gè)縮寫(xiě)擴(kuò)展器(縮寫(xiě)為像CSS一樣的選擇器)和上下文無(wú)關(guān)的HTML標(biāo)簽對(duì)匹配器。看一下這個(gè)演示視頻來(lái)看一下它們能為你做些什么。
注意: 該視頻原版位于Vimeo,但是要看的話需要翻[和諧]墻先,地址在這里:http://vimeo.com/7405114,上面的視頻是我費(fèi)盡周折從Vimeo上下載下來(lái)上傳到優(yōu)酷的,上傳后質(zhì)量竟被大打折扣了,囧。youtube上也有一份視頻,是基于Aptana的演示,一樣很精彩:http://www.youtube.com/watch?v=ug84Ypwqfzk。PS:貌似youtube要比Vimeo翻[和諧]墻容易些,不過(guò)如何翻[和諧]墻不在本站討論范圍。
如果你想跳轉(zhuǎn)到詳細(xì)介紹和使用指南,請(qǐng)看一下演示頁(yè)面并立刻下載你適用的插件:
Demo
Demo (使用 Ctrl + , 展開(kāi)縮寫(xiě),需要JavaScript支持)
中文版演示
下載(完全支持)
Aptana (跨平臺(tái));
Coda, via TEA for Coda (Mac);
Espresso, via TEA for Espresso (Mac);
下載(部分支持,只支持“展開(kāi)縮寫(xiě)”)
TextMate (只能用于Mac機(jī),Windows可以使用E-text編輯器替代);
TopStyle;
Sublime Text;
GEdit;
Dreamweaver CS4
editArea在線編輯器;
Zen Coding在線編輯器中文版
現(xiàn)在讓我們看一下這些工具是如何工作的吧。
展開(kāi)縮寫(xiě)
展開(kāi)縮寫(xiě)功能將類(lèi)似CSS的選擇器轉(zhuǎn)換為XHTML代碼。術(shù)語(yǔ)“縮寫(xiě)”可能會(huì)有點(diǎn)兒難以理解。為什么不直接稱(chēng)之為“CSS選擇器”呢?嗯,首要原因是語(yǔ)義化:“選擇器”意為選擇 一些東西,但是在這里我們事實(shí)上是生成 一些東西,是寫(xiě)一個(gè)長(zhǎng)代碼的較短的替代 。其次,它只是使用真實(shí)的CSS選擇器語(yǔ)法的一個(gè)小的子集,并添加了一些新的操作符。
這里是一個(gè)支持的屬性和操作符的列表:
E 元素名稱(chēng)(div, p);
E#id 使用id的元素(div#content, p#intro, span#error);
E.class 使用類(lèi)的元素(div.header, p.error.critial). 你也可以聯(lián)合使用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 條目編號(hào) (ul#nav>li.item-$*5);
正如你能看到的,你已經(jīng)知道如何使用Zen Coding了:只是些一個(gè)簡(jiǎn)單的仿CSS選擇器(呃,“縮寫(xiě)”抱歉),就像這樣…
復(fù)制代碼 代碼如下:
div#header>img.logo+ul#nav>li*4>a
…然后調(diào)用”展開(kāi)縮寫(xiě)”行為。 這里有兩個(gè)新增的操作符:元素倍增和條目編號(hào)。比如,如果你想生成5個(gè)li>元素,你可以簡(jiǎn)單的寫(xiě)位li*5。它也將同樣重寫(xiě)全部子代元素。如果你想寫(xiě)4個(gè)li>元素,每個(gè)里面都有一個(gè)a>標(biāo)簽,你就可以簡(jiǎn)單的寫(xiě)為li*4>a,這樣會(huì)生成以下HTML代碼: 復(fù)制代碼 代碼如下:
li>a href="">/a>/li> li>a href="">/a>/li> li>a href="">/a>/li> li>a href="">/a>/li>
最后一個(gè)——條目編號(hào)用于當(dāng)你想用索引標(biāo)記重復(fù)的元素的情況。假設(shè)你想生成class為item1、item2和item3的3個(gè)div>元素。你可以寫(xiě)成這樣的縮寫(xiě),div.item$*3: 復(fù)制代碼 代碼如下:
div class="item1">/div> div class="item2">/div> div class="item3">/div>
只需在你想要索引出現(xiàn)的任何class或id屬性上添加一個(gè)美元符號(hào)即可,而且想要多少都可以。那么,這樣… 復(fù)制代碼 代碼如下:
div#i$-test.class$$$*5
會(huì)被轉(zhuǎn)換成為: 復(fù)制代碼 代碼如下:
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是如何知道什么時(shí)候應(yīng)該為生成的標(biāo)簽添加默認(rèn)的屬性或者跳過(guò)關(guān)閉標(biāo)簽的?有一個(gè)專(zhuān)門(mén)的文件,名為zen_settings.js 描述了輸出元素。這是一個(gè)簡(jiǎn)單的JSON文件,描述每種語(yǔ)言的縮寫(xiě)(是的,你可以為不同的句法定義縮寫(xiě),比如HTML、XSL、CSS等)。通用的語(yǔ)言縮寫(xiě)定義看起來(lái)就像這樣:復(fù)制代碼 代碼如下:
'html': { 'snippets': { 'cc:ie6': '!--[if lte IE 6]>\n\t${child}|\n![endif]-->', ... }, 'abbreviations': { 'a': 'a href="">/a>', 'img': 'img src="" alt="" />', ... } }
元素類(lèi)型
Zen Coding有兩個(gè)主要的元素類(lèi)型:“片段(snippets)” 和 “縮寫(xiě)(abbreviations)”。 片段就是隨意的代碼碎片,而縮寫(xiě)是標(biāo)簽定義。通過(guò)片段,你可以寫(xiě)出你想要的任何代碼,它也會(huì)照你寫(xiě)的格式輸出;但是你必須手動(dòng)的格式化它(使用\n 和\t實(shí)現(xiàn)換行和縮進(jìn)) 并將${child}變量放到你想要輸出子元素的地方,就像這樣:cc:ie6>style。如果你不使用${child}變量,子元素將會(huì)輸出于代碼片段的后面 。
有了縮寫(xiě),您必須編寫(xiě)標(biāo)記定義,而且語(yǔ)法是非常重要的。通常,你必須寫(xiě)一個(gè)簡(jiǎn)單的帶有所有默認(rèn)的屬性的標(biāo)簽,比如: a href=”">/a>。當(dāng)Zen Coding被加載后,它會(huì)解析一個(gè)標(biāo)簽定義到一個(gè)描述該標(biāo)簽的名字、屬性(包括它們的順序)以及該標(biāo)簽是否為空的特定的對(duì)象中。所以,如果你寫(xiě)img src=”" alt=”" />,你會(huì)告訴Zen Coding這個(gè)標(biāo)簽必須是空的,然后“擴(kuò)展縮寫(xiě)”行為就會(huì)在輸出之前為它使用特定的規(guī)則。
對(duì)于片段和縮寫(xiě),你可以添加一個(gè)管道符號(hào),它告訴Zen Coding當(dāng)縮寫(xiě)被展開(kāi)的時(shí)候光標(biāo)會(huì)被定位到哪里。默認(rèn)的,Zen Coding 將光標(biāo)放在空屬性的引號(hào)中間以及開(kāi)始和關(guān)閉標(biāo)簽的中間。
例子
那么,這里解釋一下當(dāng)你寫(xiě)了一個(gè)縮寫(xiě)并召喚“展開(kāi)縮寫(xiě)”行動(dòng)時(shí)發(fā)生的事情。首先,它將一個(gè)完整的縮寫(xiě)分開(kāi)為獨(dú)立的元素:這樣div>a 會(huì)被分成div 和a 元素,當(dāng)然也會(huì)維持他們的關(guān)系。然后,每個(gè)元素,解析器先在代碼片段內(nèi)而后在縮寫(xiě)中尋找定義。如果它找不到,將會(huì)使用元素的名字作為新的標(biāo)簽,并為其添加縮寫(xiě)中定義的id和class。比如,如果你寫(xiě)mytag#example,解析器在片段或縮寫(xiě)中找不到mytag定義,它就會(huì)輸出mytag id=”example”>mytag>。
我們制作了很多默認(rèn)的CSS和HTML縮寫(xiě)和片段。你會(huì)發(fā)現(xiàn)學(xué)習(xí)使用Zen Coding可以增加你的生產(chǎn)力。
HTML 標(biāo)簽對(duì)匹配器
對(duì)于HTML編碼者的另一個(gè)非常常見(jiàn)的任務(wù)是尋找一個(gè)元素的標(biāo)簽對(duì)。例如你想選擇整個(gè)div id=”content”>標(biāo)簽并將其移動(dòng)到其它地方或者刪除它?;蛘哂锌赡苣阍趯ふ乙粋€(gè)關(guān)閉標(biāo)簽并想知道它屬于那個(gè)開(kāi)始標(biāo)簽。
不幸的是,很多現(xiàn)代開(kāi)發(fā)工具在該功能方面有所欠缺。那么我就決定寫(xiě)一個(gè)我自己的標(biāo)簽對(duì)匹配器作為Zen Coding的一部分。不過(guò)它依然在beta階段并尚存一些問(wèn)題,但它可以工作的很不錯(cuò)并很快。不是瀏覽整個(gè)文檔(像通常的那種HTML標(biāo)簽對(duì)匹配器的做法),它從光標(biāo)的當(dāng)前位置開(kāi)始尋找相關(guān)的標(biāo)簽。這使得它非??觳⑶?EM>上下文無(wú)關(guān):它甚至可以用于這段JavaScript代碼片段 :
復(fù)制代碼 代碼如下:
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>';
使用縮寫(xiě)包裹
這真的是一個(gè)很酷的特性,它將縮寫(xiě)和標(biāo)簽對(duì)匹配器的功能合并到一起了。你有多少才發(fā)現(xiàn)你需要添加一個(gè)包裹元素以修正一個(gè)瀏覽器bug ?或者你需要添加一個(gè)裝飾,比如一個(gè)背景圖片或者邊框到一個(gè)塊級(jí)內(nèi)容?你必須寫(xiě)開(kāi)始標(biāo)簽,臨時(shí)打斷你的代碼,找到相關(guān)的點(diǎn)然后關(guān)閉標(biāo)簽。這就是“使用縮寫(xiě)包裹”能幫助你的地方。
該功能相當(dāng)簡(jiǎn)單:它要求你輸入縮寫(xiě),然后執(zhí)行適當(dāng)?shù)摹罢归_(kāi)縮寫(xiě)”行動(dòng)并將你期望的文本放到你縮寫(xiě)的最后一個(gè)元素里面 。如果你沒(méi)有選擇任何文本,它就會(huì)啟動(dòng)標(biāo)簽對(duì)匹配器并使用結(jié)果。它同樣能搞清楚你的光標(biāo)的位置:標(biāo)簽的內(nèi)容里面或者是開(kāi)始和關(guān)閉標(biāo)簽中間。依賴(lài)于它的位置,它會(huì)包裹標(biāo)簽的內(nèi)容或標(biāo)簽本身。
縮寫(xiě)包裹為包裹個(gè)別行引入了一個(gè)特定的縮寫(xiě)句法。簡(jiǎn)單跳轉(zhuǎn)到倍增操作符后面的數(shù)字,比如:ul#nav>li*>a。當(dāng)Zen Coding 發(fā)現(xiàn)一個(gè)使用未定義的倍增數(shù)的時(shí)候,它會(huì)將它作為一個(gè)重復(fù)元素 :你的章節(jié)中有多少行,它就會(huì)輸出多少次,并將每行的內(nèi)容放到重復(fù)元素的最后一個(gè)子元素 里面。
如果你在這段文本外面包裹這段縮寫(xiě)div#header>ul#navigation>li.item$*>a>span:
復(fù)制代碼 代碼如下:
About Us Products News Blog Contact Up
你將會(huì)得到以下結(jié)果: 復(fù)制代碼 代碼如下:
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是一個(gè)強(qiáng)大的文本處理工具。
快捷鍵
Ctrl+, 展開(kāi)縮寫(xiě)
Ctrl+M 匹配對(duì)
Ctrl+H 使用縮寫(xiě)包括
Shift+Ctrl+M 合并行
Ctrl+Shift+? 上一個(gè)編輯點(diǎn)
Ctrl+Shift+? 下一個(gè)編輯點(diǎn)
Ctrl+Shift+? 定位匹配對(duì)
這些快捷鍵是可以自定義的。
在線演示
你已經(jīng)學(xué)到很多關(guān)于Zen Coding如何工作以及它是如何使你的編碼更容易了?,F(xiàn)在為什么不自己嘗試一下呢?因?yàn)閆en Coding是用純JavaScript開(kāi)發(fā)并遷移到Python,它甚至可以用于瀏覽器內(nèi)部,這令它成為引入到CMS的首選。
Demo (使用 Ctrl + , 展開(kāi)縮寫(xiě),需要JavaScript支持)
中文版演示
支持的編輯器
Zen Coding并不依賴(lài)某個(gè)特定的編輯器。它是一個(gè)只處理文本的出色的組件:它獲取文本、做一些處理并放回新的文本(或索引,用于標(biāo)簽匹配)。Zen Coding由JavaScript和Python編寫(xiě),所以它實(shí)際上可以運(yùn)行于任何平臺(tái)。在Windows,你可以運(yùn)行JavaScript版本,而Mac和Linux 分支可以使用Python版。
如果讓你的編輯器支持Zen Coding,你需要寫(xiě)一個(gè)特定的可以在你的編輯器和Zen Coding之間轉(zhuǎn)換數(shù)據(jù)的插件。問(wèn)題是一個(gè)編輯器可能不會(huì)完整的支持Zen Coding因?yàn)樗旧淼牟寮到y(tǒng)。比如,TextMate通過(guò)使用腳本輸出替換當(dāng)前行很容的就支持了“展開(kāi)縮寫(xiě)”功能,但是它不能處理標(biāo)簽對(duì)匹配因?yàn)闆](méi)有標(biāo)準(zhǔn)的方法請(qǐng)求TextMate來(lái)選擇內(nèi)容。
完全支持
Aptana (跨平臺(tái));
Coda, via TEA for Coda (Mac);
Espresso, via TEA for Espresso (Mac);
部分支持(只支持“展開(kāi)縮寫(xiě)”)
TextMate (只能用于Mac機(jī),Windows可以使用E-text編輯器替代);
TopStyle;
Sublime Text;
GEdit;
Dreamweaver CS4
editArea在線編輯器;
Zen Coding在線編輯器中文版
Aptana是我主要的開(kāi)發(fā)環(huán)境,它使用一個(gè)JavaScript版本的Zen Coding。它也包含很多其它的我用于日常工作的工具,所以任何一個(gè)新的Zen Coding版本都將會(huì)首先對(duì)Aptana可用,然后部署到Python并兼容其它的編輯器。
Coda和Espresso 插件被杰出的Text Editor Actions (TEA) 平臺(tái)支持,由Ian Beck開(kāi)發(fā)。原始的源代碼在GitHub上,但我還是制作了我自己的分支以整合Zen Coding的特性。
總結(jié)
很多嘗試過(guò)Zen Coding的人都說(shuō)它改變了他們寫(xiě)頁(yè)面的方式。當(dāng)然還有很多事情要做,還有很多的編輯器需要被支持以及一些文檔要寫(xiě)。請(qǐng)瀏覽現(xiàn)在的文檔 以及源代碼以尋找你的問(wèn)題的答案。希望你喜歡Zen Coding!
附:Zen coding的具體用法
遺憾的是, 本文原作者并沒(méi)有說(shuō)明zen coding的具體用法,神飛認(rèn)為有必要做以下簡(jiǎn)要的說(shuō)明。這里就以Aptana/Eclipse和Dreamweaver為例,其它編輯器平臺(tái)暫不描述,如有疑問(wèn)可以在評(píng)論中與前端觀察的網(wǎng)友交流。
Aptana/Eclipse
由于Aptana本身就是基于Eclipse的,所以,Zen Coding也是支持Eclipse的,只是需要一個(gè)EclipseMonkey插件的支持,Aptana已經(jīng)封裝了這個(gè)插件,所以如果你使用Aptana,下面的第一步可以跳過(guò)。
通過(guò)更新網(wǎng)站安裝EclipseMonkey: http://download.eclipse.org/technology/dash/update(如果你使用Aptana,可跳過(guò)這一步)
在你的當(dāng)前工作去創(chuàng)建一個(gè)頂級(jí)的項(xiàng)目,給它命名,比如,就叫zencoding
在新創(chuàng)建的項(xiàng)目中創(chuàng)建scripts 文件夾
解壓縮下載的ZIP插件包到該文件夾。項(xiàng)目結(jié)構(gòu)看起來(lái)就像這樣:
安裝之后,Aptana的菜單欄中的“腳本(Script)”菜單中將會(huì)出現(xiàn)Zen coding相關(guān)子菜單
注意事項(xiàng):
Aptana版的官方插件是基于MAC機(jī)的,如果你用的是Windows,需要手動(dòng)更改快捷鍵(在每個(gè)文件頭部的注釋片段中更改)
官方的文件編碼有點(diǎn)兒亂,修改官方j(luò)s的時(shí)候,請(qǐng)注意編碼問(wèn)題 ,修改不當(dāng)會(huì)造成相關(guān)功能的丟失;
DreamWeaver
好消息是,現(xiàn)在已經(jīng)有了Zen coding for DreamWeaver插件,壞消息是,該插件支持的功能很少,只支持展開(kāi)縮寫(xiě)功能。而且默認(rèn)的快捷鍵是無(wú)效的。只能在“命令”菜單中點(diǎn)擊操作。另外,沒(méi)有測(cè)試該插件是不是只支持CS4版本。不過(guò)比較好的是,作者將本插件的源碼也放出了,你可以自定義一個(gè)Dreamweaver的插件。
事實(shí)上,官方的DW插件在Windows下有點(diǎn)兒bug,就是會(huì)出現(xiàn)空白的行,我簡(jiǎn)單的修正了下,重新編譯了個(gè)包,在本機(jī)測(cè)試沒(méi)問(wèn)題,感興趣的童鞋可以下載嘗試:http://www.boxcn.net/shared/c71z7x7sfe
PS:官方的DW插件已經(jīng)更新,推薦 到官方去下載。新的插件添加了更多的功能支持。UPDATE @ 12-23-2009
特別推薦 :豪情同學(xué)將縮寫(xiě)給實(shí)踐了一番,總結(jié)出了很多很棒的用例,推薦大家前去學(xué)習(xí)。
原作者介紹:
Sergey Chikuyonok是一位俄羅斯的前端開(kāi)發(fā)工程師和作者,他在優(yōu)化方面有很大的熱情:從圖片、JavaScript效果到工作流程和節(jié)省時(shí)間的編碼。訪問(wèn)他的主頁(yè)和他的Twitter。 原文來(lái)自:http://www.qianduan.net/zen-coding-a-new-way-to-write-html-code.html
您可能感興趣的文章: Zen Coding css,html縮寫(xiě)替換大觀 快速寫(xiě)出html,css php中$美元符號(hào)與Zen Coding沖突問(wèn)題解決方法分享 Zen Coding for Dreamweaver v.0.7 快速編寫(xiě)html插件 editplus zen coding插件 快速編寫(xiě)html代碼