分类属于:页面制作

2010 - 02 - 21

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

Published by 朝心 under 页面制作

译自:Smashing Magazine中文: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选择器语法的一个小的子集,并添加了一些新的操作符。

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

  • 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!

附:Zen coding的具体用法

遗憾的是, 本文原作者并没有说明zen coding的具体用法,神飞认为有必要做以下简要的说明。这里就以Aptana/Eclipse和Dreamweaver为例,其它编辑器平台暂不描 述,如有疑问可以在评论中与前端观察的网友交流。

Aptana/Eclipse

由于Aptana本身就是基于Eclipse的,所以,Zen Coding也是支持Eclipse的,只是需要一个EclipseMonkey插件的支持,Aptana已经封装了这个插件,所以如果你使用 Aptana,下面的第一步可以跳过。

  1. 通过更新网站安装EclipseMonkey: http://download.eclipse.org/technology/dash/update(如 果你使用Aptana,可跳过这一步)
  2. 在你的当前工作去创建一个顶级的项目,给它命名,比如,就叫zencoding
  3. 在新创建的项目中创建scripts文件夹
  4. 解压缩下载的ZIP插件包到该文件夹。项目结构看起来就像这样:
  5. 安装之后,Aptana的菜单栏中的“脚本(Script)”菜单中将会出现Zen coding相关子菜单

注意事项:

  • Aptana版的官方插件是基于MAC机的,如果你用的是Windows,需要手动更改快捷键(在每个文件头部的注释片段中更改)
  • 官方的文件编码有点儿乱,修改官方js的时候,请注意编码问题,修改不当会造成相关功能的丢失;

DreamWeaver

好消息是,现在已经有了Zen coding for DreamWeaver插件,坏消息是,该插件支持的功能很少,只支持展开缩写功能。而且默认的快捷键是无效的。只能在“命令”菜单中点击操作。另外,没 有测试该插件是不是只支持CS4版本。不过比较好的是,作者将本插件的源码也放出了,你可以自定义一个Dreamweaver的插件。

事实上,官方的DW插件在Windows下有点儿bug,就是会出现空白的行,我简单的修正了下,重新编译了个包,在本机测试没问题,感 兴趣的童鞋可以下载尝试:http://www.boxcn.net/shared/c71z7×7sfe

PS:官方的DW插件已经更新,推荐到官方去下载。新的插件添加了更多的功能支持。UPDATE @ 12-23-2009

特别推荐:豪情同学将缩写给实践了一番,总结出了很多很棒的用例,推荐大家前去学习

原作者介绍:

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

No responses yet

2009 - 12 - 11

[转]提升你设计水平的CSS3新技术

Published by 朝心 under 页面制作

前些日子在SmashingMagazine看到一篇关于CSS3新技术不错的文章,它详细介绍了CSS3的新特性和它的使用方法,它包括:浏览器 专有属性、选择器(属性选择器、连字符、伪类、伪元素)、RGBA和透明度属性、多栏布局、多背景图、Word Wrap、文字阴影、CSS圆角、边框图片、盒阴影、盒尺寸、媒体查询、语音,并详细说明了每个新技术目前有哪些浏览器兼容。彬Go本想将本文翻译成中文 版和大家分享,但发现已有国人完成翻译,所以就偷个小懒,转载一下人家的翻译,在此感谢前端观察的博主辛苦翻译本文,为大家贡献了如此珍贵的学习资料。

如果你热爱前端开发,你对CSS感兴趣,那么你肯定不可错过这篇文章。

级联样式表在13年前被引入,而且被广泛使用的CSS 2.1 标准在11年前被创建,显然我们现在已经与当年相差千里了。相当了不起的是期间网站开发有了多少进步——事实上,我们也无法想象。

为什么会这样呢,当提到CSS的时候,过去我们是如此的不情愿和害怕尝试?为什么我们还要使用讨厌的hack和依赖JavaScript的技术来写样式?为什么我们不能利用丰富的CSS3 特性和现代浏览器中可用的工具 并将我们的设计品质带到下一个等级?

是时候在我们的项目中引入CSS3 特性了,不用害怕逐渐在我们的样式表中加入css3特性和选择器会出问题。让我们的客户意识到CSS3的优势 (而且让旧浏览器更快的消失)是我们力所能及的事情——我们应该这样做,特别是在它能够让网站更加灵活并减少开发和维护成本的时候。

在本文中,我们将研究CSS3的优势,并看一下一些网页设计师是如何使用它们的。最后,我们将了解到从CSS3中我们能得到什么以及我们如何在我们的项目中使用它的新特性。

同时请参考我们之前的一篇相关文章:
使用CSS3将你的网站设计推向未来

使用浏览器专有属性

为了使用大部分CSS3特性,我们不得不与原来的属性一起使用生产商专有扩展。原因是直到现在,大部分浏览器只支持部分CSS3属性。而且不幸的是,一些属性甚至到最后都可能不被W3C推荐,所以通过指定浏览器专有属性,将他们与标准属性区分开来是很重要的(然后在他们是多余的的时候使用符合标准的样式将之覆盖)。

当然,这种方法的劣势是,将导致一个杂乱的样式表和网站在浏览器之间的表现不一致。毕竟,我们不想在我们的样式表中重拾私有浏览器hack的需求。 Internet Explorer的臭名昭著的marquee、blink以及其它标签在大量样式表中被应用,并在20世纪九十年代成为一个传奇;它们依然让现存的很多网 站(在其他浏览器中)表现不一致甚至难以阅读。而我们现在也不想将我们自己置于同样的境地,对吧?

然而,网站不需要在所有的浏览器中看起来必须严格的一致。有的时候在某个浏览器中使用私有属性来实现特定的效果是可行的。

最常见的私有属性是用于Webkit核心浏览器的(比如, Safari), 它们以-webkit-开始,以及Gecko核心的浏览器(比如, Firefox),以-moz-开始,还有Konqueror (-khtml-)、Opera (-o-) 以及Internet Explorer (-ms-)都有它们自己的属性扩展(目前只有IE8支持-ms-前缀)

作为专业的设计师,我们不得不注意:使用这些私有属性将让我们的样式表不能通过验证。所以目前将他们放到最终版的样式中是少见的。但是在某种情况下,比如试验或学习,我们至少可以考虑将他们和标准的CSS属性一起写到一个样式表中。

扩展阅读

1. 选择器

CSS选择器是个难以置信地强大的工具:它们允许我们在标签中指定特定的HTML元素而不必使用多余的 class、 ID 或JavaScripts。而且它们中的大部分并不是CSS3中新添加的,而是没有被得到应有的广泛应用。如果你在尝试实现一个干净的、轻量级的标签以及 结构与表现更好的分离,高级选择器是非常有用的。它们可以减少在标签中的class和ID的数量并让设计师更方便的维护样式表。

属性选择器

三个新的属性选择器被添加到CSS3:

  • [att^="value"]
    匹配包含以特定的值开头的属性的元素
  • [att$="value"]
    匹配包含以特定的值结尾的属性的元素
  • [att*="value"]
    匹配包含含有特定的值的属性的元素

值的属性的元素

css3-属性选择器

tweetCC 使用一个属性选择器来指定有title属性并以字符“tweetCC”结尾的链接:

1
2
3
4
5
6
7
8
9
a[title$="tweetCC"] {
position: absolute;
top: 0;
right: 0;
display: block;
width: 140px;
height: 140px;
text-indent: -9999px;
}

浏览器支持:只有IE6不支持CSS的属性选择器。IE7和IE8、Opera、Webkit核心和Gecko核心的浏览器都支持。所以在你的样式中使用属性选择器是比较安全的。

连字符

CSS3中唯一新引入的连字符是通用的兄弟选择器(同级)。它针对一个元素的有同一个父级节点的所有兄弟级别元素。

比如,给某个特定的div的同级的图片添加一个灰色的边框(div和图片应该有同一个父级节点),在样式表中定义下面的样式就足够了:

1
2
3
div~img {
border: 1px solid #ccc;
}

浏览器支持:所有的主要浏览器都支持这个通用的兄弟选择器除了我们最爱的IE6

伪类

或许在CSS3中增加最多的就是新的伪类了,这里是一些最有趣和最有用的:

  • :nth-child(n)
    让你基于元素在父节点的子元素的列表位置来指定元素。你可以是用数字、数字表达式或odd 和even 关键词(对斑马样式的列表很完美)。所以如果你想匹配在第四个元素之后的一个3个元素的分组,你可以简单的这样使用:

    :nth-child(3n+4) { background-color: #ccc; }/*匹配第4,7,10,13,16,19...个元素*/
  • :nth-last-child(n)
    与上个选择器的思想同样,但是从后面匹配元素(倒序),比如,为了指定一个div里面的最后两个段落,我们可以使用下面的选择器:

    div p:nth-last-child(-n+2)
  • :last-child
    匹配一个父节点下的最后一个子元素,等同于:nth-last-child(1)
  • :checked
    匹配选择的元素,比如复选框
  • :empty
    匹配空元素(没有子元素)。
  • :not(s)
    匹配所有不符合指定声明(s)的元素。比如,如果你想让所有的没有使用”lead”类的段落的显示为黑色,可以这样写:
    p:not([class*="lead"]) { color: black; }
    .

Andrea Gandino 在他的网站上使用:last-child 为选择器指定每篇日志的最后一个段落,并将其的外间距(margin)设置为0:

css3-伪类

1
2
3
#primary .text p:last-child {
margin: 0;
}

浏览器支持: Webkit核心和Opera 浏览器支持所有新的CSS3 伪类,Firefox 2 和3 (Gecko核心) 只支持:not(s), :last-child, :o nly-child, :root, :empty, :target, :checked, :enabled 和:disabled,但是Firefox 3.5 将更加广泛的支持CSS3 选择器。Trident核心浏览器(Internet Explorer)事实上不支持这些伪选择器。

伪元素

在CSS3中唯一引入的伪元素是::selection.它可以让你指定被用户高亮(选中)的元素。

浏览器支持: 目前没有任何一款Internet Explorer 或Firefox 浏览器支持::selection 伪元素。Safari, Opera 和Chrome 均支持。

扩展阅读

2. RGBA和透明度

RGBA 让你可以不仅仅设定色彩,还能设定元素的透明度。一些浏览器尚不支持它,所以最好在RGBa前面设定其它浏览器支持的没有透明的颜色属性。

css3-透明度
Tim Van Damme在链接的hover效果上使用了RGBA

在这个网站上,Tim Van Damme在鼠标悬停效果上使用了RGBa;例如,在他的首页的network链接上:

1
2
3
4
#networks li a:hover,
#networks li a:focus {
background: rgba(164, 173, 183, .15);
}

当设定一个RGBA 色彩的时候,我们必须依次设定红、蓝、和绿色的值,可以是0-255或百分数。透明值应该在0.0到1.0之间,例如0.5 代表50% 的透明度。

RGBA 和opacity 之间的不同是前者只会应用到指定的元素上,而后者会影响我们指定的元素及其子元素。

这里有个例子展示我们如何给一个div添加80% 透明:

1
2
3
div {
opacity: 0.8;
}

浏览器支持: RGBA 被Webkit内核浏览器支持。IE所有版本都不支持。Firefox 2也不支持,但是Firefox 3 和Opera 9.5均支持。Opacity 被Opera、Webkit核心 和Gecko核心的浏览器支持。IE所有版本同样不支持。IE只支持自家的该死的滤镜(filter)

扩展阅读:

3. 多栏布局

这是新的CSS3 选择器可以让你不用使用多个div标签就能实现多栏布局。浏览器解释这个属性并生成多栏,让文本实现一个仿报纸的多栏结构。

css3-多栏布局
tweetCC 在其首页使用了CSS3 多栏选择器

tweetCC 在其首页上将介绍文字显示为四栏。这四栏并非浮动的div;相反,设计师使用下面的CSS3 多栏布局:

1
2
3
4
5
6
.index #content div {
-webkit-column-count : 4;
-webkit-column-gap : 20px;
-moz-column-count : 4;
-moz-column-gap : 20px;
}

我们可以通过这个选择器定义三件事情:栏数(column-coun)、栏宽(column-width、例子中没有用到)和各栏之间的空白/间距(column-gap)。 如果column-count未设定,浏览器会在允许的宽度内容纳尽可能多的栏目。

为了在各栏时间添加一个数值的分隔,我们可以使用column-rule 属性,其功能和border 属性类似:

1
2
3
div {
column-rule: 1px solid #00000;
}

上面的这条属性,浏览器中不会看到任何效果,因为它没有分栏,如果配合上面的例子就可以了。

相关属性: column-break-after, column-break-before, column-span, column-fill.

浏览器支持: 多栏布局目前被Safari 3+,chrome,和Firefox 1.5+所支持。

扩展阅读:

4. 多背景图

CSS3 允许你使用多个属性比如background-image、background-repeat, background-size, background-position, background-originand background-clip等在一个元素上添加多层背景图片.

在一个元素上添加多背景的最简单的方法是使用简写代码,你可以指定上面的所有属性到一条声明中,只是最常用的还是image, position 和repeat:

1
2
3
4
5
div {
background: url(example.jpg) top left no-repeat,
url(example2.jpg) bottom left no-repeat,
url(example3.jpg) center center repeat-y;
}

第一个图片将是离用户“最近”的那个。

该属性的一个更复杂的版本可以是这样的:

1
2
3
4
5
div {
background: url(example.jpg) top left (100% 2em) no-repeat,
url(example2.jpg) bottom left (100% 2em) no-repeat,
url(example3.jpg) center center (10em 10em) repeat-y;
}

在这里,(100% 2em) 是background-size 的值;第一个背景图片将会出现在左上角并会被拉伸至该div的100%宽度和2em的高度。

因为只有少数的浏览器支持它,又因为在网站上不显示背景有损网站的视觉效果,所以,这并不是一个被广泛应用了的属性。尽管如此,它显然能够大大地提高设计师的工作流并显著减少标签数量——相对于用其它方式实现同样的效果。

浏览器支持: 目前,多背景图片只在Safari/chrome 和Konqueror中有效

扩展阅读:

5. Word Wrap

word-wrap 属性用来防止太长的字符串溢出的。可以用两个属性值normal 和break-word。normal 值(默认的) 只在允许的断点截断文字,如连字符。如果使用了break-word ,文字可以在任何需要的地方截断以匹配分配的空间并防止溢出。

css3-word-wrap
WordPress 后台在数据表中使用了word-wrap.

WordPress 的控制面板中,word-wrap 属性被用于表格中的元素;比如在日志和页面的列表中:

1
2
3
.widefat * {
word-wrap: break-word;
}

浏览器支持: word-wrap 被Internet Explorer 和Safari/chrome支持。Firefox 将在3.5版本中支持它。

扩展阅读:

6. 文字阴影

尽管在CSS2中就已经存在,text-shadow是一个未被广泛应用的CSS属性。但是它将在CSS3中被广泛采用。这个属性给设计师一个新的跨浏览器的工具来为设计添加一个维度以使文字醒目。

尽管这样,你需要确认,你的设计中的文字是可读的,以防用户的浏览器不支持CSS3高级属性。给文字和背景色彩足够的对比度以防text-shadow 属性不能被浏览器正确渲染或理解。

css3-文字阴影
Beakapp 在它的网站中使用了text-shadow 属性:内容区域.

BeakApp.com 为内容区域使用了text-shadow 属性,为文字添加深度和维度 并让它变得醒目——而不是使用某种图片替换技术。该属性目前只在Safari和Chrome中可用。

该网站的主菜单使用的CSS如下:

1
2
3
.signup_area p {
text-shadow: rgba(0,0,0,.8) 0 1px 0;
}

这里我们使用阴影颜色(使用了RGBA,前面有描述), 然后是右(x 坐标) 和底部(y 坐标) 偏移,最后是模糊半径

如果要在一个文字上使用多阴影,可以使用逗号分开。比如:

1
2
3
4
5
p {
text-shadow: red 4px 4px 2px,
yellow -4px -4px 2px,
green -4px 4px 2px;
}

浏览器支持: Webkit核心浏览器和Opera 9.5 支持text-shadow。Internet Explorer 不支持它,Firefox 将在即将发行的3.5版本中支持。

扩展阅读:

7. @font-face属性

尽管是最被期待的CSS3 特性 (甚至它在CSS2中就已经被引入了), @font-face在网站上仍然没有像其它CSS3属性那样被广泛采用.这主要因为字体授权和版权问题:嵌入的字体很容易从网站上下载到,这是字体厂商的主要顾虑。

尽管如此,授权我呢提貌似已经开始解决了。TypeKit 承诺将制定一个方案,以使设计师和字体厂商更容易的统一授权问题,这将显著的充实网站设计中的排版并使@font-face 属性在实际工作中可用。

css3-font-face属性
Mozilla实验室JetPack 网站采用font-face规则来使用DroidSans 字体。

少数使用该属性的网站之一是新上线的JetPack MozillaLabs.

1
2
3
4
@font-face{
font-family: ‘DroidSans’;
src: url(‘../fonts/DroidSans.ttf’) format(‘truetype’);
}

要想在你的网站中使用嵌入字体,你必须独立的生命每个样式(比如, normal, bolditalic)。请确保只使用被授权为使用到网站的字体并在需要的时候给字体的设计师一些表扬。

在定义了@font-face 规则之后,你就可以用普通的font-family 属性来引用该字体了:

1
2
3
p {
font-family: “DroidSans”;
}

如果一个浏览器不支持@font-face,它将使用font-family(CSS 字体库)属性中指定的下一个字体。对支持的浏览器来说,如果@font-face 字体是一个奢侈品(只有少数元素用到),这对一些网站是可行的;但是如果该字体在设计中占有一个主要的角色或者是公司的视觉特征的一部分,你就可能想使用 其它的解决方案,比如sIFRCufón。尽管如此,请记住,这些工具对标题或较短的文字更适合,复制和粘贴此类内容比较困难而且对用户并不友好。

css3-新技术
在网站中使用此类字体不是很好吗?Dave Shea 使用CufónMuseo Sans来做的实验。很漂亮!

浏览器支持: @font-face 被Safari 3.1+和chrome支持。Internet Explorer 支持EOT 字体。 Opera 10 和Firefox 3.5 将会支持它。

扩展阅读:

8. 圆角(边框半径)

Border-radius 无需背景图片就能给HTML元素添加圆角。现在,它可能是使用最多的CSS3属性了,很简单的原因是使用圆角比较好而且不会对设计和可用性有冲突。

不同于添加Javascript或多于的HTML标签,仅仅需要添加一些CSS属性并从好的方面考虑。这个方案是清晰的和比较有效的,而且可以让你免于花费几个小时来寻找精巧的浏览器方案和基于Javascript圆角。

css3-圆角
Sam Brown的博客在标题、分类和链接处使用了border-radius.

Sam Brown在他的博客的标题、分类、链接和div中大量的使用了border-radius属性。使用图片来实现该效果将会比较费时的,这是在项目中使用CSS3属性是提高开发效率的重要步骤的原因之一

为了给类别链接添加圆角,Sam 使用了下面的CSS片段:

1
2
3
4
5
6
h2 span {
color: #1a1a1a;
padding: .5em;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
}

我们可以做的更进一步,添加原始的CSS3 属性和Konqueror 属性扩展,如下:

1
2
3
4
5
6
7
8
h2 span {
color: #1a1a1a;
padding: .5em;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
-khtml-border-radius: 6px;
border-radius: 6px;
}

如果我们想在我们的元素中的某个特定的角上应用此属性,我们可以单独的指定每个角:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
div {
-moz-border-radius-topright: 6px;
-moz-border-radius-topleft: 6px;
-moz-border-radius-bottomright: 6px;
-moz-border-radius-bottomleft: 6px;
-webkit-border-top-right-radius: 6px;
-webkit-border-top-left-radius: 6px;
-webkit-border-bottom-right-radius: 6px;
-webkit-border-bottom-left-radius: 6px;
border-top-right-radius: 6px;
border-top-left-radius: 6px;
border-bottom-right-radius: 6px;
border-bottom-left-radius: 6px;
}

浏览器支持: border-radius只有所有版本的IE浏览器和Opera不支持,Webkit和Gecko核心的浏览器都支持。

扩展阅读:

9. 边框图片

border-image 属性允许你在元素的边框上设定图片, 让你从通常的solid, dotted 和其它边框样式中解放出来。该属性给设计师一个更好的工具,用它可以方便的定义设计元素的边框样式,比background-image 属性(对高级设计来说) 或枯燥的默认边框样式更好用。我们也可以明确的定义一个边框可以被如何缩放或平铺。

CSS3-边框-图片
SpoonGraphics 博客为它的图片边框使用了border-image 属性。

SpoonGraphis blog中,border-image被用于图片边框,如下所示:

1
2
3
4
5
6
#content .post img {
border: 6px solid #f2e6d1;
-webkit-border-image: url(main-border.png) 6 repeat;
-moz-border-image: url(main-border.png) 6 repeat;
border-image: url(main-border.png) 6 repeat;
}

要想定义border-image,我们必须指定图片地址,图片的那部分将被剪切并用于元素的每一个边上,以及图片是否被缩放或平铺。

为了制作一个使用下面的图片作为边框的div ,我们应该使用下面的代码(我们将为这个例子添加Opera 和Konqueror 支持):

CSS3-边框

1
2
3
4
5
6
7
8
div {
border-width: 18px 25px 25px 18px;
-webkit-border-image: url(example.png) 18 25 25 18 stretch stretch;
-moz-border-image: url(example.png) 18 25 25 18 stretch stretch;
-o-border-image: url(example.png) 18 25 25 18 stretch stretch;
-khtml-border-image: url(example.png) 18 25 25 18 stretch stretch;
border-image: url(example.png) 18 25 25 18 stretch stretch;
}

该属性的最后一个值可以是stretch (默认), round (只有一个平铺了整数倍的图片被填充在允许的地方) 或repeat。在我们的例子中,上下左右边框图片被拉伸。如果我们只想顶部和底部边框被拉伸,我们可以使用下面的CSS:

1
2
3
4
div {
()
border-image: url(example.png) 18 25 25 18 stretch repeat;
}

我们可以可以单独的指定每一个角,如果我们想为每一个角使用不同的图片:

1
2
3
4
5
6
7
8
9
10
div {
border-top-image: url(example.png) 5 5 stretch;
border-right-image: url(example.png) 5 5 stretch;
border-bottom-image: url(example.png) 5 5 stretch;
border-left-image: url(example.png) 5 5 stretch;
border-top-left-image: url(example.png) 5 5 stretch;
border-top-right-image: url(example.png) 5 5 stretch;
border-bottom-left-image: url(example.png) 5 5 stretch;
border-bottom-right-image: url(example.png) 5 5 stretch;
}

如果浏览器不支持border-image 属性,它将无视这些属性,并只应用定义的其它边框属性,比如border-width 和border-color.

浏览器支持: border-image 目前只有Webkit核心浏览器支持。不太确定Firefox的下一个版本是否支持。

扩展阅读:

10. 盒阴影

box-shadow 属性可以对HTML元素添加阴影 而不用额外的标签或背景图片。类似text-shadow 属性,它增强设计的细节;而且因为它不影响内容的可读性,随意他可以是增加那种额外感觉/效果的一种很好的方法。

CSS3-盒-阴影
10to1 为它的导航北京和hover状态使用了box-shadow 属性.

10to1 为其导航区域增加的一个简单的阴影并将该属性应用于导航链接的hover效果:

1
2
3
4
5
6
7
8
9
#navigation {
-webkit-box-shadow: 0 0 10px #000;
-moz-box-shadow: 0 0 10px #000;
}
#navigation li a:hover,
#navigation li a:focus {
-webkit-box-shadow: 0 0 5px #111;
-moz-box-shadow: 0 0 5px #111;
}

box-shadow属性可以用多个值:水平偏移、垂直偏移、模糊半径、伸展半径和阴影颜色。水平和垂直偏移和阴影色使用的最多。

在一个div上应用红色阴影,右边和下边偏移4px,无模糊,我们可以使用下面的代码:

1
2
3
4
5
div {
-moz-box-shadow: 4px 4px 0 #f00;
-webkit-box-shadow: 4px 4px 0 #f00;
box-shadow: 4px 4px 0 #f00;
}

浏览器支持: box-shadow目前只有Webkit核心浏览器支持,但是即将发布的Firefox 3.5 也将提供很好的支持。

扩展阅读:

11. 盒子大小

根据CSS 2.1 规范,在计算盒子的总大小的时候,元素的边框和padding应该被加入到宽度和高度之中的。但是众所周知,旧的浏览器却以它们自己的非常有“创意”的方式来解释这个规范。box-sizing属性允许你指定浏览器如何计算一个元素的宽度和高度。

CSS3-新特性
WordPress 在控制面板的所有的输入框元素中使用border-box 属性。

WordPress 后台区域在它的所有text类型的input标签和textarea标签上使用了该属性:

1
2
3
4
5
6
7
input[type="text"],
textarea {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}

第三个属性(-ms-box-sizing) 只有在Internet Explorer 8下有效。通过其他选择器,WordPress 的样式表同样添加了Konqueror 属性: -khtml-box-sizing。

box-sizing 属性可以两个值中的一个:border-box 和content-box。 Content-box如CSS2.1中的定义的那样渲染宽度。Border-box 从设定的宽度和高度中扣除padding和边框(如老式浏览器那样。)。

浏览器支持:box-sizing 被IE8、Opera、Gecko核心和Webkit核心浏览器支持。

扩展阅读:

12. 媒体查询

媒体查询(media queries)可以让你为不同的设备基于它们的能力定义不同的样式。比如,在可视区域小于480像素的时候,你可能想让网站的侧栏显示在主内容的下边,这样它就不应该浮动并显示在右侧了:

1
2
3
4
5
6
7
8
9
10
11
#sidebar {
float: right;
display: inline; /* IE Double-Margin Bugfix */
}

@media all and (max-width:480px) {
#sidebar {
float: none;
clear: both;
}
}

你也可以指定使用虑色屏的设备:

1
2
3
4
5
6
7
8
9
a {
color: grey;
}

@media screen and (color) {
a {
color: red;
}
}

潜力是无限的。这个属性是很有用的因为你你不在需要必须为不同的设备写独立的样式表了,而且你也无需使用JS来确定每个用户的浏览器的属性和功能。一个实现一个灵活的布局的更加流行的基于Javascript的方案是使用智能的流体布局,让布局对于用户的浏览器分辨率更加灵活。

浏览器支持: 媒体查询被基于webkit核心的浏览器和Opera支持。Firefox将在3.5版本中支持它。IE目前不支持这些属性而且在将来的版本中,也没有支持的计划。

扩展阅读:

13. 语音

CSS3的语音模块CSS3可以让你为屏幕阅读者指定语音样式。你可以控制语音的不同设置,比如:

  • voice-volume
    使用从0到100的数字(0 即静音)、百分数或关键词(silent,x-soft,soft,medium,loud 和x-loud等)来设置音量。
  • voice-balance
    控制来自哪个声道(如果用户的音箱系统支持立体声)。
  • Speak
    指示屏幕阅读器阅读相关的文字、数字或标点符号。可用的关键词为none, normal, spell-out, digits, literal-punctuation, no-punctuation 和inherit.
  • Pauses and rests
    在一个元素的被读完之前或之后设定暂停或停止。你可以使用时间单位(比如, “2s” 表示2 秒钟) 或关键词(none,x-weak, weak, medium, strong 和x-strong)。
  • Cues
    使用声音限制特定元素并控制器音量。
  • voice-family
    设定特定的声音类型和声音合成(就像font-family)。
  • voice-rate
    控制阅读的速度。可以设置为百分数或关键词: x-slow, slow,medium, fast 和x-fast.
  • voice-stress
    指示应该使用的任何重音(强语气),使用不同的关键词: none, moderate,strong 和 reduced.

比如,告诉屏幕阅读器使用男声读取所有的h2 标签,用左边的喇叭,用软调按照指定的声音,可以像下面这样指定样式:

1
2
3
4
5
6
h2 {
voice-family: female;
voice-balance: left;
voice-volume: soft;
cue-after: url(sound.au);
}

不幸的是,这个属性现在只有非常少的支持,但是显然值得关注因为我们可以在将来提高我们网站的易用性。

浏览器支持: 现在,只有Opera 浏览器(Windows XP and 2000)支持语音模块的部分属性。为了使用它们,需要使用-xv- 前缀,比如-xv-voice-balance: right。

扩展阅读:

结尾

CSS3 属性可以极大的提高你的工作流,让一些最耗时的CSS任务不费吹灰之力就能搞定,并且可以使用更好、更简洁和更轻的代码标签。一些属性尚未被广泛的支持,甚至是最新的浏览器,但这并不意味着我们不能用它们进行试验或者为使用先进浏览器的用户更高级的功能和CSS样式。

在这点儿上,请记住,培养我们的用户 也同样是有用和必须的:网站无需看起来在每个浏览器里都要保持一致,而且如果一个差异不(负面)影响美学和网站的可用性,它就应该是被考虑的。如果我们继续浪费大量的时间和金钱以使每个细节绝对一致(而不是采用更灵活的和未来导向的方案), 用户将没有升级他们的浏览器的任何需要/动机,这样我们就不得不在旧的浏览器变为古董级浏览器以及强大的现代浏览器变为标准之前等待很长的时间

我们试验和使用新的CSS3属性越早,它们就被流行的浏览器支持的更早,我们也就能够更早的广泛使用它们。

推荐阅读及资源:

关于原作者

Inayaili de León是一个葡萄牙的网页设计师。她对网页设计和前端编码真的非常感兴趣,而且喜欢漂亮和简洁的网站。她居住在伦敦。你可以在Web Designer Notebook上看到她的更多文章,并follow her on Twitter.

No responses yet

2009 - 10 - 10

有趣的PNG优化(更多的技巧)

Published by 朝心 under 页面制作

原文地址:http://www.smashingmagazine.com/2009/07/25/png-optimization-guide-more-clever-techniques/

作者:Sergey Chikuyonok

译文地址:http://zanbu.blogbus.com/logs/43337794.html

接着上一篇我们继续分享Sergey Chikuyonok带来的PNG优化技巧,虽然在原文的评论中也看到一些人认为何必花这么多时间去做这样的优化工作,我还是那句话做为一个页面重构人 员,图片优化是与我们息息相关的,业界的最新知识我们必须掌握,至于在项目中怎么去应用要靠个人判断。

灰度

Photoshop 不能保存灰度模式的 PNG 文件,所以你得在保存黑白图像后再使用 OptiPNG,代码如下:

optipng -o5 bw-image.png

灰度图像占用的空间远小于 RGB 图像,因为每个像素只用一个字节来表示,而不是三个:


PNG-24(Photoshop → 真彩色),8167字节


PNG-24(Photoshop + OptiPNG → 灰度),6132字节

在保存图像为 PNG 文件之前,将其设置为灰度模式(图像 → 模式 → 灰度)非常重要,尤其是半透明图像(参见 Dirty transparency 的方法) 。

减少颜色

这个方法可以作为色调分离的替代方案。色调分离会严重改变图像的色彩,如果你要将图像嵌在网站背景中的话,这根本不可接受。这种方法能让你控制颜色更加自如,但也是限制在256色以内。

这个方法主要是从半透明图像中提取图像信息(即删除透明度),将其转换为索引颜色再应用到原始蒙版中。减少颜色数量利于文件的有效压缩。

1.在 Photoshop 中打开并且复制原始图像(图像 → 复制)。


63KB

2.从复制的图像中删除透明(滤镜 → Photo Wiz → Remove Transparency) :

3.设置图像模式为索引颜色(图像 → 模式 → 索引颜色)。在新对话窗口中输入如下设置:

  • 颜色:190 ,
  • 仿色:扩散,
  • 数量:80%。

4.图像模式设置回 RGB 颜色,并复制图层到原始文件中。将复制的图层对齐,并创建剪贴蒙版。现在保存为 PNG-24 文件:


51KB

如你所见,做些简单的步骤就可以节省下11KB,而且还没有任何质量损失。甚至这种方法还有一个好处:使用 OptiPNG 时能够获得更高的压缩率。而对于这张图像,它的大小被从51KB减小到33KB,压缩了36%。你可以保存为 Web 格式的文件并应用 Influence mask 来减低大小,而不必把图像转为索引颜色模式。

但是这种方法并不等同于在 Fireworks 中的调整 PNG-8 的透明度。在多数情况下,即使颜色数减少了,但仍会超过256色,所以你必须保存图片为 PNG-24,而非 PNG-8。要记住,不透明的红色和透明50%的红色是完全不同的两种颜色。

降低细节

这项技术对于优化阴影、倒影、发光等非常好用。记得在 Dirty transparency 中讲到,真彩色图像中的每个像素都用了四个字节来描述:RGBA。最后一个控制像素的透明度。对于 Alpha 值太低的像素(即像素只是勉强可见),你就可以替换 RGB 数据以取得更好的压缩效果。让我们试试吧。

1.再次在 Photoshop 中打开复古 iPod


63KB

2.iPod 下方的倒影就是非常好的优化对象。Ctrl+单击 或 ⌘+点击 图层面板中的缩略图创建选区。到通道面板从选区创建新的通道:

3.我们必须选中那些勉强可见的像素。反相该通道(图像 → 调整 → 反相),然后打开阈值对话框(图像 → 调整 → 阈值) 。设置阈值为170就足够了:

4.这样我们就得到了只包括勉强可见的像素的蒙版。Ctrl+单击 或 ⌘+单击 通道创建选区。返回图层面板,选择图像图层,打开滤镜 → 杂色 → 中间值。这个滤镜将平滑选区中的像素,也就是说更利于压缩。设置半径为5:

现在存储图像为 Web 所用格式,PNG-24,文件大小已经从63KB减小为59KB了。你可以调整阈值和中间值,在提高压缩率与保存更多细节间平衡。

其它 PNG 的使用和优化技巧

1.每次优化都必须先彻底分析图像。再选用最合适的优化技术。

2.自主创新。以这些技术为基础,研究你自己的优化方法。

3.许多人认为,对于颜色较少的图像,PNG-8 总比 PNG-24 更适用。但是他们错了。有时候,PNG-24 反而更小:


PNG-8,833字节


PNG-24,369字节

在这张图像中,PNG-8 额外占用了空间:3个字节是用来描述颜色板中的像素,另外再用1个字节来描述图像数据流中的像素,而 PNG-24 总共只需要3个字节来描述。因此,如果图像颜色数较低,也没有透明,那么就该测试下 PNG-8 和 PNG-24 哪个更小。

4.如果您使用的是旧版本的 Photoshop(低于 CS3 ),你可能会发现,图像在图像编辑器与在网页浏览器中看起来不一样。这是因为 PNG 文件中存有伽玛值,可以控制图像的伽玛校正。(关于伽玛的相关内容,可以参考这篇文章——译注)你可以放心地将其删除,用 TweakPNG (仅 Windows 下)或 smush.it 都能做到。

5.有一种“特殊的” PNG 图像格式,可以在支持半透明的情况下,以索引颜色的 PNG-8 保存。Photoshop 不能保存这种图像(Fireworks 则可以),但可以先在 Photoshop 中编辑,然后再用 OptiPNG 转换。

OptiPNG 默认会将少于256色的真彩色图像(24位)转换成8位色。这么做的话,可以先应用“减少颜色”和“降低细节”技术,再“猜测”图像的颜色数。不过这样非常费时。PNGGNQ 工具可以将真彩色图像转为256色,但这样你就不能完全掌控图像了。

你必须减少颜色数到256色以下,包括半透明像素在内。这种格式之所以“特别”,因为它在 IE6 下会:


IE6


其他浏览器

你也看到了,IE6 只显示不透明像素。这种格式的好处是你可以使用标准的 <img> 标签,或把图片作为背景(即不使用巨耗资源的 AlphaImageLoader CSS 滤镜),但代价是 IE6下 的视觉效果非常糟糕。

6.不要使用“另存为”保存应用在网页上的 PNG 图像,而应该使用“存储为 Web 所用格式”。默认情况下,Photoshop 会将预览连同图像一起保存,这样文件就会稍大一些。

One response so far

2009 - 10 - 10

有趣的PNG优化

Published by 朝心 under 页面制作

原文地址:www.smashingmagazine.com/2009/07/15/clever-png-optimization-techniques

作者:Sergey Chikuyonok

引言

做为一名网页设计师你或许已经对png格式非常熟悉,它提供了完整的透明度,这是一种无损的,功能强大的图像格式。能够很好代替gif图像格式。但 是绝大多数人认为它不可被压缩,带着这样的疑问我们来认真看完下面这篇文章。每一种图像格式都有自己的优缺点,如果掌握了相关知识,在进行图像优化时能够 针对图像进行相应处理,得到高品质的图像和高压缩率,这是图像优化的关键所在。png被称为开源的gif图像格式,它们之间有很多相同的地方(如:索引 色),但png在每一个方面都要强于gif。它介绍了一些非常酷的功能,例如:图像封装和压缩,但对我们网页设计师来说最重要的还是线性过滤(也称为“三 角过滤”)。

什么是线性过滤?

这里介绍下它的原理,假如我们有一张5*5像素水平渐变的图片,如下图(每个数字代表了一种颜色)

未经过过滤的图片

通过上图你会发现相同的颜色都是在垂直方向上扩展,而不是水平方向。这样的图片如果用gif格式将很难获得高压缩率,它只压缩水平方向扩展的颜色(图像尺寸越大,越能说明问题)。让我们看看线性过滤是怎样将这类图像压缩的:

以数字2为标识的每一行都经过了“Up过滤”,“Up过滤”向 png 解码器发送信息:“对于当前的像素,提取上方像素的值,并将其添加到当前值”。图中第2-5行垂直方向都拥有相同的值。所以它们的值都是0,如果这样的图片越大那么压缩比率也越大。

在理想情况下,“Sub过滤”能提供更好的结果:

以数字1为标识的每一行都经过了“Sub过滤”,它发送信息给解码器:“当前像素提取左侧像素的值,添加到当前值”。例子中的值全为1,我想你大概也猜到这样的数据肯定能被有效的压缩。

线性过滤是非常重要的概念,尤其是在图片处理时可以针对过滤特点进行处理以便得到更好的过滤效果。png有5种过滤器:None(无过滤),Sub(当前值减去左侧像素的值),Up(减去上方像素的值),Average(减去左侧和上方像素的平均值)和Paeth(替换上方,左边或者上方的左边像素值,并重新以Alan Paeth命名)。

通过比较下面的图片,我想大家应该都能明白“线性过滤”的魅力所在。


gif:2568字节


png:372字节

图片类型

png是一种存储元数据信息的图片类型。如果你是Photoshop用户,你应该已经对png8(索引图像)和png24(真彩色图像)非常熟悉, 如果你是 Fireworks用户,或许已经知道png32(真彩色透明图像)。但是Photoshop的png24格式也能存储真彩色透明图像,其实这些命名都不 是官方的,所以在png图像格式说明面并不能找到这些概念,为了方便起见,在这次讨论中我们采用Photoshop的命名方式。

png 可提供5种图片类型:灰度,真彩色,索引色,带alpha通道的灰度,带alpha通道的真彩色。遗憾的是Photoshop只能导出3种图像类型:带透 明的索引颜色,真彩色,带透明度的真彩色。这就是为什么大家一直认为Fireworks是png图像最好处理工具。其实不然,Fireworks并没有足 够的工具来处理导出的png图像,它仅仅是在导出时做一些微小的优化工作。

那还有没有更好的png压缩工具呢?答案是肯定的。OptiPNGpngcrush都是非常有效的工具,从本质上来看,这些工具主要做以下优化:

  1. 1.选择最合适的图像类型(例如:如果图像中没有太多的颜色,真彩色图像会被转化为索引色图像)
  2. 2.选择最合适的过滤方式
  3. 3.选择最合适的压缩策略以及选择性的减少颜色深度

所有这些操作都不会影响到图像质量,却能减小 png 图像文件的大小,所以我强烈建议您每次保存 png 图像时都使用这些工具。

下面来介绍几种处理图像的方法,使图片更好的执行“线性过滤”。

1.色调分离

色调分离的优化方法已经广为人知。在Photoshop中打开样例图片,点击图层面板中的”创建新的填充或调整图层图标”,并选择色调分离:

选择尽可能小的数值(通常40就够了)并保存图片:


原图:84K


压缩后:53K

优化原理:有效的减少颜色数量,合并相似的颜色,创建出分离区域,更好的执行“线性过滤”,得到高压缩率。

这种方法有一定的局限性,尤其是优化的图片与 html 背景融合的情况下须慎用(蓝色为 html 背景)。

2.多余的透明

看看下面的图片:


75K


30K

两张图片都是用 Photoshop 导出的,而且没有经过任何优化。即使对比图中的每个像素,你都不会发现它们之间存在任何区别。但是为什么前者居然是后者的2.5倍大?

在探寻奥秘之前,你必须安装一个“Remove Transparency”的 Photoshop 插件才可以看到隐藏的细节。

在 Photoshop 中打开上面的两张图片,选择 Filer -> Photo Wiz -> Remove Trasparency。现在,你就可以看到保存在图像中的真实像素信息了:

这是怎么回事?其实很简单。带alpha通道的真彩色图像每个像素都用了4个字节来表示:RGBA。最后一个是alpha通道,控制该像素透明度: 值为0则完全透明,255则完全不透明。这意味着每一个像素(任何RGB值)只要alpha值设为0就可以完全隐藏。但是这些RGB数据仍然存在,而且它 不利于png编码器对数据流进行有效的封装和编码。因此,我们必须在导出图像前删除这些隐藏数据(例如上图中填充的黑色)。下面是一个比较便捷的方法:

  1. 1.在Photoshop中打开上面例子中第一张图片;
  2. 2.Ctrl+单击(Mac系统中为 ?+单击)图层面板中的缩略图,建立选区 -> 单击选择栏目 -> 选中反向。
  3. 3.切换到快速蒙版模式,按Q键:
  4. 4.我们已经建立了一个半透明图像的蒙版,但我们只需要完全透明的图像。图像 -> 调整 -> 阈值,并将阈值色阶滑到最右端,从而使选区完全透明:
  5. 5.退出快速蒙版模式(按Q键),并用黑色填充选区:
  6. 6.再次反选(选择 -> 反向),点击图层面板的“添加蒙版”图标,添加蒙版。

对于上述这些操作我们只须了解即可,因为png二次压缩工具内已经内置了该项操作。

3.透明分离

有时候因为图片中存在一些半透明像素,你不得不保存一个“重量级”的PNG-24文件。如果将此类图像一分为二,一部分是不透明像素,另一部分则为 半透明,然后各以适当格式保存。比如你可以用 PNG-24 格式保存半透明像素,而不透明像素则用 PNG-8 甚至 JPEG 格式保存。这样操作下来在实际应用中你将会节省很大的图片流量。看一下实际案例:


PNG24 62K

  1. 1.在图层面板中 Ctrl+单击(或 ?+单击)图像缩略图建立选区;
  2. 2.在通道面板中选择“将选区存储为通道”;
  3. 3.取消(Ctrl+D 或 ?+D)选区,选择新建的通道,然后打开阈值(图像 -> 调整 -> 阈值)。将滑块尽量向右拖动;
  4. 4.我们已经为不透明的像素创建了蒙版。现在利用这个蒙版来分离原始图层。Ctrl+单击(或 ?+单击)alpha1通道,转到图层面板,选择原始图层层,打开图层 -> 新建 -> 通过剪切的图层。这样我们就分离出了不透明和半透明像素。 现在你需要将这两个文件分别存储为不同的文件格式:不透明像素保存为 PNG-8,半透明像素保存为 PNG-24。针对半透明像素图层你还可以使用色调分离技术让文件变得更小。
    PNG-8 17KBPNG-24 色调分离(色阶=35) 6KB

最终对比结果:


原图:63K


优化后:23KB

优化后的图片大小几乎只有原图的1/3,在原来的基础上能够节省2/3的流量。但是这种方法有一个明显的缺点:将一个图片分成两个图片,增加了重构人员的工作量,减少图片大小的同时却又增加了http连接数。

这里只是介绍些优化方法,在实际应用中请大家多去尝试,发现不同方法的应用规律,总结出来大家一起分享! 在原文中Sergey Chikuyonok提到还会有第二部分的内容,将进一步探讨更高层次的技术,会谈到灰度模式的图像,使用更少的颜色,降低细节,并讨论进一步优化png的小技巧,以及png优化的实例。让我们一起期待下一篇大作。

3 responses so far

2009 - 06 - 06

Google开源网页加速工具Page Speed

Published by 朝心 under 页面制作

Google刚刚开源了Page Speed,这是一个Google优化其网站,特别是加速网页加载的内部工具。

Page Speed是运行在Firebug里 的Firefox插件。该工具可以运行在Linux、Mac和Windows XP/Vista之上。Page Speed在运行时会分析一些Web服务器配置和服务器上下载下来的代码,还会创建一个结果列表,其中包括如何改进网页的建议。分析基于一个分为五类的最佳实践列表:

这些实践考虑了页面加载时间,以及发出页面请求到客户端看到结果之间的时间。页面加载时间包括创建TCP连接、解析DNS名称、发送 请求、获取(包括来自于缓存的)资源、执行脚本、渲染。

该工具提出的建议有:

这些建议根据优先级排列。比如说,在加载Facebook的主页时,已知的高优先级建议是:“在文件头部先包含外部的JavaScript文件,然 后再将外部的CSS文件包含进来。为了保证并行下载CSS文件,始终要在包含外部JavaScript之前先包含外部CSS。”

Page Speed的活动版面显示了所有浏览器的活动,包括网络事件和JavaScript代码完成的时间(单位:毫秒)。要想看看在尝试加载特定页面时,浏览器 在哪里花费了最多的时间,这是非常有用的。总之对Web开发人员来说,Page Speed似乎是一个必备的工具。

查看英文原文:Google Has Open Sourced Page Speed

No responses yet

2009 - 02 - 18

WordPress模板修改

Published by 朝心 under 页面制作

WordPress基本模板文件

一套完整的WordPress模板应至少具有如下文件:

  • style.css : CSS(样式表)文件
  • index.php : 主页模板
  • archive.php : Archive/Category模板
  • 404.php : Not Found 错误页模板
  • comments.php : 留言/回复模板
  • footer.php : Footer模板
  • header.php : Header模板
  • sidebar.php : 侧栏模板
  • page.php : 内容页(Page)模板
  • single.php : 内容页(Post)模板
  • searchform.php : 搜索表单模板
  • search.php : 搜索结果模板

当然,具体到特定的某款模板,可能不止这些文件,但一般而言,这些文件是每套模板所必备的。

基本条件判断Tag

  • is_home() : 是否为主页
  • is_single() : 是否为内容页(Post)
  • is_page() : 是否为内容页(Page)
  • is_category() : 是否为Category/Archive页
  • is_tag() : 是否为Tag存档页
  • is_date() : 是否为指定日期存档页
  • is_year() : 是否为指定年份存档页
  • is_month() : 是否为指定月份存档页
  • is_day() : 是否为指定日存档页
  • is_time() : 是否为指定时间存档页
  • is_archive() : 是否为存档页
  • is_search() : 是否为搜索结果页
  • is_404() : 是否为 “HTTP 404: Not Found” 错误页
  • is_paged() : 主页/Category/Archive页是否以多页显示

Header部分常用到的PHP函数

  • <?php bloginfo(’name’); ?> : 博客名称(Title)
  • <?php bloginfo(’stylesheet_url’); ?> : CSS文件路径
  • <?php bloginfo(’pingback_url’); ?> : PingBack Url
  • <?php bloginfo(’template_url’); ?> : 模板文件路径
  • <?php bloginfo(’version’); ?> : WordPress版本
  • <?php bloginfo(’atom_url’); ?> : Atom Url
  • <?php bloginfo(’rss2_url’); ?> : RSS 2.o Url
  • <?php bloginfo(’url’); ?> : 博客 Url
  • <?php bloginfo(’html_type’); ?> : 博客网页Html类型
  • <?php bloginfo(’charset’); ?> : 博客网页编码
  • <?php bloginfo(’description’); ?> : 博客描述
  • <?php wp_title(); ?> : 特定内容页(Post/Page)的标题

模板常用的PHP函数及命令

  • <?php get_header(); ?> : 调用Header模板
  • <?php get_sidebar(); ?> : 调用Sidebar模板
  • <?php get_footer(); ?> : 调用Footer模板
  • <?php the_content(); ?> : 显示内容(Post/Page)
  • <?php if(have_posts()) : ?> : 检查是否存在Post/Page
  • <?php while(have_posts()) : the_post(); ?> : 如果存在Post/Page则予以显示
  • <?php endwhile; ?> : While 结束
  • <?php endif; ?> : If 结束
  • <?php the_time(’字符串’) ?> : 显示时间,时间格式由“字符串”参数决定,具体参考PHP手册
  • <?php comments_popup_link(); ?> : 正文中的留言链接。如果使用 comments_popup_script() ,则留言会在新窗口中打开,反之,则在当前窗口打开
  • <?php the_title(); ?> : 内容页(Post/Page)标题
  • <?php the_permalink() ?> : 内容页(Post/Page) Url
  • <?php the_category(’, ‘) ?> : 特定内容页(Post/Page)所属Category
  • <?php the_author(); ?> : 作者
  • <?php the_ID(); ?> : 特定内容页(Post/Page) ID
  • <?php edit_post_link(); ?> : 如果用户已登录并具有权限,显示编辑链接
  • <?php get_links_list(); ?> : 显示Blogroll中的链接
  • <?php comments_template(); ?> : 调用留言/回复模板
  • <?php wp_list_pages(); ?> : 显示Page列表
  • <?php wp_list_categories(); ?> : 显示Categories列表
  • <?php next_post_link(’ %link ‘); ?> : 下一篇文章链接
  • <?php previous_post_link(’%link’); ?> : 上一篇文章链接
  • <?php get_calendar(); ?> : 日历
  • <?php wp_get_archives() ?> : 显示内容存档
  • <?php posts_nav_link(); ?> : 导航,显示上一篇/下一篇文章链接
  • <?php include(TEMPLATEPATH . ‘/文件名’); ?> : 嵌入其他文件,可为定制的模板或其他类型文件

与模板相关的其他函数

  • <?php _e(’Message’); ?> : 输出相应信息
  • <?php wp_register(); ?> : 显示注册链接
  • <?php wp_loginout(); ?> : 显示登录/注销链接
  • <!–next page–> : 将当前内容分页
  • <!–more–> : 将当前内容截断,以不在主页/目录页显示全部内容
  • <?php timer_stop(1); ?> : 网页加载时间(秒)
  • <?php echo get_num_queries(); ?> : 网页加载查询量

当然,这些都是与模板相关的最基本的东西,更详细的信息请参考WordPress官方文档

3 responses so far

2008 - 08 - 27

swfobject 2.0 使用

Published by 朝心 under 页面制作

用JavaScript嵌入你的SWF

swfobject 2.1下载

swfobject.embedSWF(swfUrl, id, width, height, version, expressInstallSwfurl, flashvars, params, attributes)有5个必须的参数和4个可选的参数:

  1. swfUrl(String,必须的)指定SWF的URL。
  2. id(String,必须的)指定将会被Flash内容替换的HTML元素(包含你的替换内容)的id。
  3. width(String,必须的)指定SWF的宽。
  4. height(String,必须的)指定SWF的高。
  5. version(String,必须的)指定你发布的SWF对应的Flash Player版本(格式为:major.minor.release)。
  6. expressInstallSwfurl(String,可选的)指定express install SWF的URL并激活Adobe express install [ http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75 ]。
  7. flashvars(String,可选的)用name:value对指定你的flashvars。
  8. params(String,可选的)用name:value对指定你的嵌套object元素的params。
  9. attributes(String,可选的)用name:value对指定object的属性。

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” lang=”en” xml:lang=”en”>
<head>
<title>SWFObject v2.0 dynamic embed - step 3</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
<script type=”text/javascript” src=”swfobject.js”></script>

<script type=”text/javascript”>
swfobject.embedSWF(”myflash.swf”, “myflash”, “300″, “120″, “9.0.0″);
swfobject.embedSWF(”myflash.swf”, “myflash”, “300″, “120″, “9.0.0″, null, null, {wmode: ‘transparent’});
</script>

</head>
<body>
<div id=”myflash”>
This content requires Adobe Flash Player version 8 and above. <a href=”http://www.doocom.cn/soft/” target=”_blank”>Click here to install Flash Player.</a> –Power By:<a href=”http://www.doocom.cn/” target=”_blank”>Doocom.cn</a>

此动画要求Adobe Flash 8 或以上版本播放器,<a href=”http://www.doocom.cn/soft/” target=”_blank”>请点击这里下载安装</a>!–Power By:<a href=”http://www.doocom.cn/” target=”_blank”>Doocom.cn</a>
</div>
</body>
</html>

怎样配置你的Flash内容?
你可以为你的object元素添加下面这些常用的可选属性(attributes)[ http://www.w3schools.com/tags/tag_object.asp ]:

  • id
  • name
  • styleclass(不使用class,因为class也是ECMA4的保留关键字)
  • align

你可以使用下面这些专用于Flash的可选param元素[ http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701 ]:

  • play
  • loop
  • menu
  • quality
  • scale
  • salign
  • wmode
  • bgcolor
  • base
  • swliveconnect
  • flahvars
  • devicefont [ http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_13331 ]
  • allowscriptaccess [ http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_16494 ]
  • seamlesstabbing [ http://www.adobe.com/support/documentation/en/flashplayer/7/releasenotes.html ]
  • allowfullscreen [ http://www.adobe.com/devnet/flashplayer/articles/full_screen_mode.html ]
  • allownetworking [ http://livedocs.adobe.com/flash/9.0/main/00001079.html ]

怎样用JavaScript对象来定义你的flashvars、params和attributes?
你最好用对象的字面量(Object literal notation)来定义JavaScrpt对象,例如这样:

<script type=text/javascript>

var flashvars = {};
var params = {};
var attributes = {};

swfobject.embedSWF(myContent.swf, myContent, 300, 120, 9.0.0,expressInstall.swf, flashvars, params, attributes);

</script>

你可以在定义对象的时候添加你的name:value对(注意:请确保不要再对象中的最后一个name:value对后面加上逗号):

<script type=text/javascript>

var flashvars = {
name1: hello,
name2: world,
name3: foobar
};
var params = {
menu: false
};
var attributes = {
id: myDynamicContent,
name: myDynamicContent
};

swfobject.embedSWF(myContent.swf, myContent, 300, 120, 9.0.0,expressInstall.swf, flashvars, params, attributes);

</script>

或者在对象创建之后用点号添加属性(properties)和值:

<script type=text/javascript>

var flashvars = {};
flashvars.name1 = hello;
flashvars.name2 = world;
flashvars.name3 = foobar;

var params = {};
params.menu = false;

var attributes = {};
attributes.id = myDynamicContent;
attributes.name = myDynamicContent;

swfobject.embedSWF(myContent.swf, myContent, 300, 120, 9.0.0,expressInstall.swf, flashvars, params, attributes);

</script>

上面的代码也可以这样写(为那些喜欢俏皮话的顽固脚本程序员准备的不易读的简写版本(the less readable shorthand version for the die-hard scripter who love one-liners)):

<script type=text/javascript>

swfobject.embedSWF(myContent.swf, myContent, 300, 120, 9.0.0,expressInstall.swf, {name1:hello,name2:world,name3:foobar}, {menu:false}, {id:myDynamicContent,name:myDynamicContent});

</script>

如果你不想使用一个参数,你可以将它定义为false或者一个空对象:

<script type=text/javascript>

var flashvars = false;
var params = {};
var attributes = {
id: myDynamicContent,
name: myDynamicContent
};

swfobject.embedSWF(myContent.swf, myContent, 300, 120, 9.0.0,expressInstall.swf, flashvars, params, attributes);

</script>

flashvars对象是一个为了增加易用性而设计的作为快捷方式的参数,所以你可以先忽略它,然后在params对象中指定你的flashvars:

<script type=text/javascript>

var flashvars = false;
var params = {
menu: false,
flashvars: name1=hello&name2=world&name3=foobar
};
var attributes = {
id: myDynamicContent,
name: myDynamicContent
};

swfobject.embedSWF(myContent.swf, myContent, 300, 120, 9.0.0,expressInstall.swf, flashvars, params, attributes);

</script>

提示:使用SWFObject 2.0 HTML和JavaScript代码生成器(SWFObject 2.0 HTML and JavaScript generator)来帮助你创建代码:[ http://code.google.com/p/swfobject/wiki/SWFObject_2_0_generator ]。

7 responses so far

2008 - 06 - 14

开始EditPlus的自动完成

Published by 朝心 under 页面制作

一直用着DW写样式,其实还算不错,就是启动太慢,软件越做越大,用到的功能是越来越少了。

长期以来,一直想找个可以替换的编辑器,试用过TOPSTYLE,结果还是不习惯。

以前曾经尝试过用EDITPLUS来写代码,可惜被DW养成的坏习惯,纯手写代码实在写不下去,效率太差了……。前两天忽然在群里看到有人在讨论EDITPLUS,说起EDITPLUS配置自动完成的书写效率多高,自己也心痒痒,在网上先随便DOWN了个自动完成的模版,然后再把按自己的习惯进行了修改,试用了几天,感觉还是满爽的,终于可以抛弃DW了。

大家可以到www.editplus.com下载各种自动完成文件,文件下载后是.acp后缀的,把文件放到Editplus的安装目录下,打开Editplus》工具》首选项》文件》设置和语法,文件类型选中对应的CSS,在“自动完成”里选择刚才放到安装目录下的.acp文件,确定就完成啦。

正确配置之后,例:只要输入“oh”,然后再按空格,就出来“overflow:hidden;”了。
其实这个功能要叫“自动替换”比较好理解。

大家可以先把下载的自动完成文件,按自己习惯进行修改:
“#T=”后面的内容是你在EP中输入的字母,再按空格的时候,下面的第二行以下(直到碰到下一个“#T=”)的内容就会自动完成
“^!”是自动完成后,鼠标当前位置

我的对照表-080826
#T=*
* html ^!{height:100px;}
#T=z
^! {}
#T=x
#^! {}
#T=c
.^! {}
#T=fl
float:left;
#T=fr
float:right;
#T=fn
float:none;
#T=cb
clear:both;
#T=db
display:block;
#T=dt
display:table;
#T=di
display:inline;
#T=dn
display:none;
#T=o
overflow:^!;
#T=oh
overflow:hidden;
#T=oa
overflow:auto;
#T=os
overflow:scroll;
#T=ov
overflow:visible;
#T=por
position:relative;
#T=poa
position:absolute;
#T=pos
position:static;
#T=vi
visibility:^!;
#T=vih
visibility:hidden;
#T=viv
visibility:visible;
#T=m
margin:^!;
#T=mt
margin-top:^!px;
#T=ml
margin-left:^!px;
#T=mb
margin-bottom:^!px;
#T=mr
margin-right:^!px;
#T=p
padding:^!;
#T=pt
padding-top:^!px;
#T=pl
padding-left:^!px;
#T=pb
padding-bottom:^!px;
#T=pr
padding-right:^!px;
#T=pm
padding:^!; margin:;
#T=w
width:^!px;
#T=h
height:^!px;
#T=wh
width:^!px;
height:px;
#T=lh
line-height:^!px;
#T=mh
min-height:^!px;
#T=boc
border-collapse:collapse;
#T=bo
border:1px solid #^!;
#T=bon
border:none;
#T=bot
border-top:1px solid #^!;
#T=bor
border-right:1px solid #^!;
#T=bob
border-bottom:1px solid #^!;
#T=bol
border-left:1px solid #^!;
#T=bgc
background-color:#^!;
#T=bg
background:#fff url(../img/^!) no-repeat left top;
#T=bgx
background:url(../img/^!) repeat-x left top;
#T=bgy
background:url(../img/^!) repeat-y left top;
#T=bgp
background-position:^!;
#T=bgi
background-image:url(../img/^!);
#T=bgn
background:none;
#T=f
font:normal normal 12px/1.5em “Arial”;
#T=fs
font-size:^!px;
#T=fw
font-weight:bold;
#T=fwn
font-weight:normal;
#T=co
color:#^!;
#T=tac
text-align:center;
#T=tal
text-align:left;
#T=tar
text-align:right;
#T=ti
text-indent:^!;
#T=tdn
text-decoration:none;
#T=tdu
text-decoration:underline;
#T=va
vertical-align:^!;
#T=ls
list-style:^!;
#T=cp
cursor:pointer;
#T=ws
white-space:nowrap;
#T=tab
.tab{
}
.tab th, .tab td{
padding:3px 5px;
}
.tab th{
}
.tab td{
}
#T=ff
font-family:arial,verdana,sans-serif;
#T=fil
filter:Alpha(opacity=50);-moz-opacity:0.5;opacity:0.5;
#T=@import
@import url(”styles.css”);

附:自己修改的自动完成文件(XHTML&CSS)

5 responses so far

2008 - 03 - 25

IE8居然还自带SCRIPT DEBUG

Published by 朝心 under 页面制作

只要页面出现JS错误,浏览器总弹出“A runtime error has occurred.Do you wish to debug?”框,非常的烦……
IE 菜单: Tools->Options->Advanced —— uncheck “Disable Script Debugging”
影响正常浏览(主要是不会用,真正需要看调试又看不了),还是关掉的好

4 responses so far

2008 - 03 - 25

多IE浏览器问题

Published by 朝心 under 页面制作

安装了IE8 beta1后,一直喜欢用的IE6绿色版(IE6Eolas)不能用了……
只能改用另一个绿色版组合(ie-MultipleIEs),这个之前试用了,好像有些显示和原IE6不同(好像是没了双倍MARGIN的BUG,忘记了)
不过现在没办法,也只能继续用着看看了。
其他调用IE内核的浏览器调用的还是之前安装的IE7,还好,一般浏览不用去搞IE8,忍受外面各种网站的变形

One response so far