在本文中咱们将展现一种新的使用仿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。