HTML+CSS极速开发利器Zen Coding

LMS
795 3

这是一篇来自前端观察的译文,是今天在看论坛的时候偶然发现的文章,这里介绍了一个叫Zen Coding的工具。

如果你觉得这篇文章过于冗长,不想全部读完的话,我仍然推荐你一定要看看下面的视频。当然,前提是,你应该是一个web前端开发的爱好者或者学习者,甚至是工程师。

英文原文:Smashing Magazine

中文原文:Zen Coding: 一种快速编写HTML/CSS代码的方法

本文转自:Zen Coding HTML+CSS极速开发利器

请尊重版权,转载请注明来源!

下面进入正文:

在本文中我们将展示一种新的使用仿CSS选择器的语法来快速开发HTML和CSS的方法。它由Sergey Chikuyonok开发。

你在写HTML代码(包括所有标签、属性、引用、大括号等)上花费多少时间?如果你的编辑器有代码提示功能,你编写的时候就会容易些,但即便如此你还是要手动敲入很多代码。

在JavaScript方面,当我们想要在一个页面上获取某个特定的元素时,我们就会遇到同样的问题,我们必须写很多代码,这就变得难于维护和重用。JavaScript框架应运而生,它们同时引入了CSS选择器引擎。现在,你可以使用简单的CSS表达式来获取DOM元素,这相当酷。

但是,如果你不仅仅可以用CSS的选择器布局和定位元素,还能生成代码会怎么样?比如,如果你这样写:

div#content>h1+p

…然后就可以看到这样的输出:

<div id="content">
<h1></h1>
<p></p>
</div>

有些迷惑吧?今天,我将向你介绍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:

下载(完全支持):

下载(部分支持,只支持“展开缩写”):

现在让我们看一下这些工具是如何工作的吧。

展开缩写

展开缩写功能将类似CSS的选择器转换为XHTML代码。术语“缩写”可能会有点儿难以理解。为什么不直接称之为“CSS选择器”呢?嗯,首要原因是语义化:“选择器”意为选择一些东西,但是在这里我们事实上是生成 一些东西,是写一个长代码的较短的替代。其次,它只是使用真实的CSS选择器语法的一个小的子集,并添加了一些新的操作符。

这里是一个支持的属性和操作符的列表:

  1. E
    元素名称(div, p);
  2. E#id
    使用id的元素(div#content, p#intro, span#error);
  3. E.class
    使用类的元素(div.header, p.error.critial). 你也可以联合使用class和idID: div#content.column.width;
  4. E>N
    子代元素(div>p, div#footer>p>span);
  5. E+N
    兄弟元素(h1+p, div#header+div#content+div#footer);
  6. E*N
    元素倍增(ul#nav>li*5>a);
  7. 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代码:

&lt;li&gt;&lt;a href=""&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;&lt;/a&gt;&lt;/li&gt;

最后一个——条目编号用于当你想用索引标记重复的元素的情况。假设你想生成class为item1、item2和item3的3个< div >元素。你可以写成这样的缩写,div.item$*3:

&lt;div class="item1"&gt;&lt;/div&gt;
&lt;div class="item2"&gt;&lt;/div&gt;
&lt;div class="item3"&gt;&lt;/div&gt;

只需在你想要索引出现的任何class或id属性上添加一个美元符号即可,而且想要多少都可以。那么,这样…

div#i$-test.class$$$*5

会被转换成为:

&lt;div id="i1-test" class="class111"&gt;&lt;/div&gt;
&lt;div id="i2-test" class="class222"&gt;&lt;/div&gt;
&lt;div id="i3-test" class="class333"&gt;&lt;/div&gt;
&lt;div id="i4-test" class="class444"&gt;&lt;/div&gt;
&lt;div id="i5-test" class="class555"&gt;&lt;/div&gt;

你会看到,当你写a的缩写的时候,输出是< a href=””><。或者,如果你写img,输出就是< img src=”” alt=”” / >。

Zen Coding是如何知道什么时候应该为生成的标签添加默认的属性或者跳过关闭标签的?有一个专门的文件,名为zen_settings.js描述了输出元素。这是一个简单的JSON文件,描述每种语言的缩写(是的,你可以为不同的句法定义缩写,比如HTML、XSL、CSS等)。通用的语言缩写定义看起来就像这样:

'html': { 'snippets': { 'cc:ie6': '&lt;!--[if lte IE 6]&gt;\n\t${child}|\n&lt;![endif]--&gt;',
...
},   'abbreviations': { 'a': '&lt;a href=""&gt;&lt;/a&gt;', 'img': '&lt;img src="" alt="" /&gt;',
...
}
}

元素类型

Zen Coding有两个主要的元素类型:“片段(snippets)” 和 “缩写(abbreviations)”。片 段就是随意的代码碎片,而缩写是标签定义。通过片段,你可以写出你想要的任何代码,它也会照你写的格式输出;但是你必须手动的格式化它(使用\n 和\t实现换行和缩进) 并将${child}变量放到你想要输出子元素的地方,就像这样:cc:ie6>style。如果你不使用${child}变量,子元素将会输出于 代码片段的后面。

有了缩写,您必须编写标记定义,而且语法是非常重要的。通常,你必须写一个简单的带有所有默认的属性的标签,比如: < a href=””>。当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 = '&lt;table&gt;'; for (var i = 0; i &lt; 3; i++) {
table += '&lt;tr&gt;'; for (var j = 0; j &lt; 5; j++) {
table += '&lt;td&gt;' + j + '&lt;/td&gt;';
}
table += '&lt;/tr&gt;';
}
table += '&lt;/table&gt;';

使用缩写包裹

这真的是一个很酷的特性,它将缩写和标签对匹配器的功能合并到一起了。你有多少才发现你需要添加一个包裹元素以修正一个浏览器bug?或者你需要添加一个装饰,比如一个背景图片或者边框到一个块级内容?你必须写开始标签,临时打断你的代码,找到相关的点然后关闭标签。这就是“使用缩写包裹”能帮助你的地方。

该功能相当简单:它要求你输入缩写,然后执行适当的“展开缩写”行动并将你期望的文本放到你缩写的最后一个元素里面。如果你没有选择任何文本,它就会启动标签对匹配器并使用结果。它同样能搞清楚你的光标的位置:标签的内容里面或者是开始和关闭标签中间。依赖于它的位置,它会包裹标签的内容或标签本身。

缩写包裹为包裹个别行引入了一个特定的缩写句法。简单跳转到倍增操作符后面的数字,比如:ul#nav>li*>a。当Zen Coding 发现一个使用未定义的倍增数的时候,它会将它作为一个重复元素:你的章节中有多少行,它就会输出多少次,并将每行的内容放到重复元素的最后一个子元素里面。

如果你在这段文本外面包裹这段缩写
div#header>ul#navigation>li.item$*>a>span:

  • About Us
  • Products
  • News
  • Blog
  • Contact Up

你将会得到以下结果:

&lt;div id="header"&gt;
&lt;ul id="navigation"&gt;
&lt;li class="item1"&gt;&lt;a href=""&gt;&lt;span&gt;About Us&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="item2"&gt;&lt;a href=""&gt;&lt;span&gt;Products&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="item3"&gt;&lt;a href=""&gt;&lt;span&gt;News&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="item4"&gt;&lt;a href=""&gt;&lt;span&gt;Blog&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="item5"&gt;&lt;a href=""&gt;&lt;span&gt;Contact Up&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

你可以看到,Zen Coding是一个强大的文本处理工具。

快捷键

  1. Ctrl+,
    展开缩写
  2. Ctrl+M
    匹配对
  3. Ctrl+H
    使用缩写包括
  4. Shift+Ctrl+M
    合并行
  5. Ctrl+Shift+?
    上一个编辑点
  6. Ctrl+Shift+?
    下一个编辑点
  7. Ctrl+Shift+?
    定位匹配对

这些快捷键是可以自定义的。

原作者介绍:

Sergey Chikuyonok是一位俄罗斯的前端开发工程师和作者,他在优化方面有很大的热情:从图片、JavaScript效果到工作流程和节省时间的编码。访问他的主页他的Twitter

THE END

评论 3

  1. cyrus
    🏅

    好东西。有什么难记的。CSS学得好的的都很容易上手。这么简单还说难。

  2. 万戈
    🏆🏅

    很强憾,不过这相当于一种新的HTML构写方法,有点不习惯

    1. 是啊,我也这么认为.本来对于我来说,记那些语法规则就不容易了,又要去多记一种规则.

发表评论

Submit