阅读更多

30顶
2踩

Web前端

转载新闻 Zen Coding: 一种快速编写HTML/CSS代码的方法

2010-01-26 15:26 by 副主编 just_cool 评论(25) 有29647人浏览

 


中文: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标签对匹配器。看一下这个演示视频来看一下它们能为你做些什么。

 

查看视频:http://v.youku.com/v_show/id_XMTM4NDQwNzgw.html

 

注意:该视频原版位于Vimeo,但是要看的话需要翻[和谐]墙先,地址在这里:http://vimeo.com/7405114,上面的视频是我费尽周折从Vimeo上下载下来上传到优酷的,上传后质量竟被大打折扣了,囧。youtube上也有一份视频,是基于Aptana的演示,一样很精彩:http://www.youtube.com/watch?v=ug84Ypwqfzk。PS:貌似youtube要比Vimeo翻[和谐]墙容易些,不过如何翻[和谐]墙不在本站讨论范围。

如果你想跳转到详细介绍和使用指南,请看一下演示页面并立刻下载你适用的插件:

Demo

下载(完全支持)

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

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

展开缩写

展开缩写功能将类似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代码:

1
2
3
4
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>

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

1
2
3
<div class="item1"></div>
<div class="item2"></div>
<div class="item3"></div>

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

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

会被转换成为:

1
2
3
4
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>

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

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

1
2
3
4
5
6
7
'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>。

我们制作了很多默认的CSSHTML缩写和片段。你会发现学习使用Zen Coding可以增加你的生产力。

HTML 标签对匹配器

对于HTML编码者的另一个非常常见的任务是寻找一个元素的标签对。例如你想选择整个<div id=”content”>标签并将其移动到其它地方或者删除它。或者有可能你在寻找一个关闭标签并想知道它属于那个开始标签。

不幸的是,很多现代开发工具在该功能方面有所欠缺。那么我就决定写一个我自己的标签对匹配器作为Zen Coding的一部分。不过它依然在beta阶段并尚存一些问题,但它可以工作的很不错并很快。不是浏览整个文档(像通常的那种HTML标签对匹配器的做 法),它从光标的当前位置开始寻找相关的标签。这使得它非常快并且上下文无关:它甚至可以用于这段JavaScript代码片段

1
2
3
4
5
6
7
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:

1
2
3
4
5
About Us
Products
News
Blog
Contact Up

你将会得到以下结果:

1
2
3
4
5
6
7
8
9
<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的首选。

支持的编辑器

Zen Coding并不依赖某个特定的编辑器。它是一个只处理文本的出色的组件:它获取文本、做一些处理并放回新的文本(或索引,用于标签匹配)。Zen Coding由JavaScript和Python编写,所以它实际上可以运行于任何平台。在Windows,你可以运行JavaScript版本,而 Mac和Linux 分支可以使用Python版。

如果让你的编辑器支持Zen Coding,你需要写一个特定的可以在你的编辑器和Zen Coding之间转换数据的插件。问题是一个编辑器可能不会完整的支持Zen Coding因为它本身的插件系统。比如,TextMate通过使用脚本输出替换当前行很容的就支持了“展开缩写”功能,但是它不能处理标签对匹配因为没有标准的方法请求TextMate来选择内容。

完全支持

部分支持(只支持“展开缩写”)

Aptana是我主要的开发环境,它使用一个JavaScript版本的Zen Coding。它也包含很多其它的我用于日常工作的工具,所以任何一个新的Zen Coding版本都将会首先对Aptana可用,然后部署到Python并兼容其它的编辑器。

Coda和Espresso 插件被杰出的Text Editor Actions (TEA) 平台支持,由Ian Beck开发。原始的源代码在GitHub上,但我还是制作了我自己的分支以整合Zen Coding的特性。

总结

很多尝试过Zen Coding的人都说它改变了他们写页面的方式。当然还有很多事情要做,还有很多的编辑器需要被支持以及一些文档要写。请浏览现在的文档 以及源代码以寻找你的问题的答案。希望你喜欢Zen Coding!

 

 

查看更多详情:http://www.qianduan.net/zen-coding-a-new-way-to-write-html-code.html

来自: qianduan.net
30
2
评论 共 25 条 请登录后发表评论
25 楼 jordan_micle 2010-08-30 14:23
有创意,但意义实在不大了。。。
24 楼 cuixiping 2010-06-04 11:26
很有创意,赞一个!
23 楼 myfreedisk 2010-03-22 16:27
java
22 楼 daxiong921 2010-03-02 19:22
太棒了,当犹豫不决的时候,用它刷拉拉一下就好了。
21 楼 biaowen 2010-01-27 17:22
搞个eclipse插件呀。。胚方便。。
20 楼 落魄轻狂 2010-01-27 15:53
java_fxj 写道
koalaxyq 写道
还不如ctl+c 与 ctl+v来的实际些

是啊,这个东东,还要记很多规则,麻烦。

看完文章就基本会了吧,是规则繁多还是您很浮躁(真的看完这篇文章了?),或者您对当前的ctrl c ctrl v式的工作很满意呢?


19 楼 mblmh2008 2010-01-27 15:24
还得去学.懒得弄了.早说啥时候用呢?
aspx的文件基本山都在vs里完成要不vs里直接这么写?你怎麽转呢?
忒麻烦了
18 楼 tedeyang 2010-01-27 14:15
java_fxj 写道
koalaxyq 写道
还不如ctl+c 与 ctl+v来的实际些

是啊,这个东东,还要记很多规则,麻烦。

>*:+一共4个操作符也嫌烦?真搞不懂。这也太浮躁了吧。
17 楼 tedeyang 2010-01-27 13:39
就像在eclipse中用“sys”缩写“System.out”一样,wonderful!
16 楼 java_fxj 2010-01-27 11:38
koalaxyq 写道
还不如ctl+c 与 ctl+v来的实际些

是啊,这个东东,还要记很多规则,麻烦。
15 楼 geminiyellow 2010-01-27 10:20
头好疼
14 楼 Snow_Young 2010-01-27 10:16
看起来不错,等手头项目都忙完可以考虑试试
13 楼 jltest 2010-01-27 10:11
有意思
12 楼 csc365kl 2010-01-27 10:07
不错 不错
11 楼 shinezhou 2010-01-27 10:06
啥东西?


10 楼 thethinking 2010-01-27 09:56
有意思吗?
9 楼 elmar 2010-01-27 09:49
蛋疼…………
8 楼 joey.he 2010-01-27 09:49
如果能跟vim的结合,那会更爽~
7 楼 毕竟红尘 2010-01-27 09:40
类模板?
不习惯
6 楼 koalaxyq 2010-01-27 09:15
还不如ctl+c 与 ctl+v来的实际些

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • ofbiz学习资料

    ofbiz学习资料,里面有个开发最佳时间和开发入门。

  • ofbiz——excel导出/加载工具类

    org.apache.ofbiz.base.util.ExcelUtil类主要实现了excel导出/加载功能。 实验室预约系统中主要使用了加载功能。使用方法: List list = ExcelUtil.readExcel(file); 这样excel表格里的数据就解析到了list对象里了。 需要依赖的jar包:commons-beanutils-1.9.1.jar,poi-3

  • ofbiz学习笔记(自学整理)

    自学整理的ofbiz学习笔记,自学整理的ofbiz学习笔记,自学整理的ofbiz学习笔记,自学整理的ofbiz学习笔记,适合初学者,可以下个看看

  • ofbiz学习文档

    ofbiz很好的学习资料,学习了很多,希望对你也能有帮助!

  • ofbiz 学习文档.doc

    非常详细的ofbiz 学习文档.doc,公开给大家学习

  • ofbiz工作流学习(一)

    1 Ofbiz概况OFBiz是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类WEB应用系统的框架。    OFBiz最主要的特点是OFBiz提供了一整套的开发基于Java的web应用程序的组件和工具。包括实体引擎, 服务引擎, 消息引擎, 工作流引擎, 规则引擎等。2 系统组成与层次结构

  • ofbiz 业务流程剖析

    ofbiz 业务流程剖析 1 制造模块剖析 mrp算法 为了方便说明,给一个最简单的生产模式 m1-p1 也就是由原材料m1直接加工生产p1,比例是1:1 我们设m1的库存量是1000,最低库存200,采购提前期6天,p1的库存是900个,最低库存100 现在接到一个订单,2月2号要2000个p1发运(ofbiz是按照发运期来算提前量的...

  • OFBIZ 人工服务工作流配置 具体操作步骤

    一直以来 在技术上遇到问题都是google网上的资源,最近项目中需要用到ofbiz里面的工作流流程,第一感觉就是先google下,可能是ofbiz在国内的资源比较稀缺,搜出来的资源大多不是我想要的,木有办法!看来只能靠自己了~ 经过自个周末两天的努力,终于有了点眉目!现分享给大家,有问题的地方还是欢迎大家批评指正! 闲话不多说,具体可以分为以下6个步骤,如下: 1、因为是自己配置工作流流程,所...

  • ofbiz——工作流学习笔记一(xpdl)

     Ofbiz学习Org.ofbiz.workflow.definition数据结构关系       描述了工作流运行过程的数据结构之间的关系;具体内容参考org.ofbiz.workflow.definition.vsd工作流标准概述ü         工作流过程定义接口—Xml Process Definition Language,ü         使用不同工具对

  • ofbiz工作流学习(三)

    OFBIZ流程操作使用过程1 流程定义   一般用JaWe进行流程定义。根据查找的资料,使用JaWe生成的xpdl文件和workflow engine有少许不兼容的情况,摘抄总结如下:1)JAWE生成DataFields会和ofbiz Implementation Tool里的ActualParameter冲突, 导致runtime data不能正常的获取, 如果你的Tool需要Act

  • 【电子商务平台】Ofbiz研究学习详细记录——概况

    Ofbiz 是一个非常著名的开放的电子商务平台,提供了创建基于J2EE/XML规范和技术标准,构建大中型企业级,跨平台,跨数据库,跨应用服务器的多层,分布式电子商务类WEB应用系统的框架。Ofbiz最主要的特点是Ofbiz提供了一整套的开发基于java的web应用程序的组件和工具。包括实体引擎,服务引擎,消息引擎,工作流引擎,规则引擎等。 一.下载            Apache Ofb

  • 串讲Apache OFBiz技术架构

    以图代文,串讲Apache OFBiz技术架构。

  • ofbiz和应用服务器结合

       ofbiz本身默认使用的tomcat,你可以通过启动ofbiz目录下的startofbiz.bat(windows)或者startofbiz.sh(linux)进行启动。但是这种启动方式对于调试和监控带来不变。  如何将ofbiz和tomcat进行挂接就是一个我们要做的工作。经过我在linux下的验证。我们可以将ofbiz和tomcat融合。具体的做法是使用命令:1、安装好jdk和你

  • 开源电子商务之OFBIZ10.04组件开发入门 :使用外部数据库MySql

    版权:本文档不得用于商业目的,仅供OFBIZ爱好者学习。如要转载请与作者联系。gowanjia@gmail.com QQ:110476592 1、  下载安装MySQL Server 5.0数据库(相关资料很多,这里不详述) 2、  打开component://e

  • 关于ofbiz-workFlow

    OFBIZ 人工服务工作流配置 具体操作步骤 一直以来 在技术上遇到问题都是google网上的资源,最近项目中需要用到ofbiz里面的工作流流程,第一感觉就是先google下,可能是ofbiz在国内的资源比较稀缺,搜出来的资源大多不是我想要的,木有办法!看来只能靠自己了~ 经过自个周末两天的努力,终于有了点眉目!现分享给大家,有问题的地方还是欢迎大家批评指正! 闲话不多说,具体可以分为以下...

  • 随便玩玩之ofbiz项目搭建

    下载地址ofbiz : http://ofbiz.apache.org/download.html;  下载 Ant : http://ant.apache.org/bindownload.cgi;   下载安装,mySQl   下载安装JDK。 因为ofbiz里已经集成了tomcat,这里就不需要安装了   配置ANT失败可能原因;   1.下载后项目导入esclipse

  • Apache OFBIZ快速上手(一)--简单例子

    本篇文章主要介绍简单例子,OFBIZ的其他介绍就先不说了,放在后面的博文中。 1、目录结构                                 说明:在hot-deploy目录下建立文件夹learning,为例。注意先把文件扔到hot-deploy目录下再启动服务器。 2、创建ofbiz-component.xml文件 创建此文件,负责让OFBIZ知道learni

  • OFBiz安装注意事项:不要启动Tomcat

    由于形成了思维定势,如果要部署Web服务,必须要将Web服务部署到Tomcat等类似的Web服务器上。 所以安装OFBiz时,先将OFBiz部署到了Tomcat下,然后启动。 但是启动总是报8080端口被占用的问题,同时按照ofbiz网站的说明,http://localhost:8080/ecommerce总是无法访问,报404错误。 查了半天的资料,最后还是详细的看了一下官方的安装说明。

Global site tag (gtag.js) - Google Analytics