« Apple是如何藐视MS的 | 首页 | 新一期CGTalk选择奖里几个比较awesome的家伙 »

分类: 标准叹

2004年10月10日

[原文翻译]样式表编写效率手册

  来自positioniseverythingHow To write Efficient CSS是篇浅显易懂的CSS优化技术教学文章,实用性强,文字优美,非常经典,曾经JJGOD有翻译过,但是链接已经失效,自己也没有保存,所以干脆用自己的风格翻译出来,如果能达到JJGOD的翻译水准将是我的无上荣幸。尽管我努力试图保留原文作者的原汁原味,但是在翻译过程中发现,作者使用的生动的词句直译成中文反而并不生动,为此加入自己的语气和用词习惯,这样应该会令译文重新恢复“生动”:)
  水平有限,如有纰漏恳请拨冗斧正......

效率的好处
  CSS最受追捧的优点就是减小页面体积,从而减少了下载时间,无论是在页面第一次被下载时,还是此后直接从缓存中加载。事实的确如此,但是,这个在页面首次被下载过程中节省下来的体积往往又有很大一部分被浪费掉了,原因就是极度冗余的样式表代码。
  好吧,一切都结束了,让我们重新开始。你将学习一些高效的样式表编写“密技”,开始对你的样式表敲骨吸髓榨干到最后一滴汁。当然,你不可能藉此节省“巨大”的页面体积,不过,对于那些在激烈的竞争中求生存的网站,省一个字节是一个字节,这些节省的字节对他们而言是极具价值的。
  有这么几个范围可以进行“字节瘦身”,包括简写属性多重声明使用默认值属性继承空白的处理

简写属性
如何设置页面边距为零(Zeroing page margins)一文谈及了几个CSS简写属性,不过关于这个主题仍然有很多可以说的。

常用的简写属性包括:

  • font — 字体,控制"font-size"(字体尺寸)、"font-weight"(字体磅数)、"line-height"(行高)等
  • background — 背景,控制元素的背景、定位、重复等
  • list-style — 列表样式,设置列表项目符号的属性
  • margin — 边距,定义盒装容器各条边框旁留出的空白的宽度
  • border — 边框,定义盒状容器各条边框的样式属性,此处会涉及到另几个涉及边框的简写属性
  • padding — 内边距,定义盒状容器各条边框内侧留出的补白宽度

以上列表项可以直接链接到W3C CSS 2 specifications中相关的内容章节。

例如,font(字体)属性是一次性同时设置font-style(字体样式)、font-variant(字体变体)、font-weight(字体磅数)、font-size(字体尺寸)、line-height(行高)和font-family(字型组)的简写属性。然而,并不是所有这些属性都必须在简写属性中同时用到。当简写格式中的某些值被省略时,每个“失踪”的属性实际上都被指定使用它的默认值,这些值都可以在W3C specificationsfont property(字体属性)内容部分中找到。如果在一个样式表文件中大量使用了字体相关的样式控制属性,那么使用这个简写属性将能显著缩减样式表的体积。

background(背景)和list-style(列表样式)属性也有类似的作用。列表中剩下的几个简写属性涉及到一个CSS盒状容器的四条边框,和前几个属性情况有所不同。

盒状容器边框的简写属性
任何一个区块级元素(divs—区块、tables—表格、lists—列表、paragraphs—段落,等等)的四条边框都有各自的marginsborderspadding属性,可以各自单独设置它们的宽度。就拿borders来说,每条边框都可以独立分配border-style(边框式样)和border-color(边框颜色)。要是将所有这些属性统统拼写出来,乖乖,单这一条规则集就够冗长的了!使用简写规则可以极大地减少工作量。

时钟
假如盒状容器四条边框的某个边框属性都一样,那样的话只要使用基本的简写属性就可以了,比如这样写:

margin: 5px;
border-width: 5px;
padding: 5px;

注意: 必须设置border-style(边框式样)才能显示边框。为此我们可以定义border-style属性或在border属性中设置式样。仅仅使用border-width属性是不能显示边框的。

可是,假如出现其中几条边框的值并不相同的情况,这时候,一种我们称之为“时钟”的CSS特性开始起作用了。让我们把一个盒状容器想象成一个钟面。当指针向上直指,它们所指的相当于盒状容器的顶边,也正是简写属性的第一个值。接下来是三点钟的位置,相当于盒状容器的右侧边。然后是六点钟位置,相当于盒状容器的底边,最后九点钟方位指代左侧边。

来看个例子。我们想在页面上放一个盒状容器,它的顶边距宽10px、右边距宽5px、底边距宽3px、没有左边距。那么用margin简写属性可以这么写:

margin: 10px 5px 3px 0;

在声明属性时,这些属性值之间必须用也只能用空格分隔。并且,除非属性值为零,否则每个值都必须标注单位。

注意一下边距为零时值被定义成0,因为无论什么值只要是零,单位就无关紧要。任何一种单位(px, em, %, 等)的零值等于任何其他单位的零值。

改型时钟
当某几条边框相同时,边框的简写属性可以更大程度地浓缩。如前文所述,当所有边框都一致时,所有边框使用同一值,可是,假如顶边和底边一致,而右侧边和左侧边一致,这样的情况下,边距的代码可以写成如下这样:

margin: 10px 5px;

这样写将顶边和底边的边距设置成10px,两侧的侧边距为5px。还有一招,就是当顶边和底边不同而侧边一致的情况。顶边距10px、左侧和右侧边距5px、底边距20px,我们就这么写:

margin: 10px 5px 20px;

这全都取决于简写属性用到的值得数目以及次序。记住,一个值=所有的边框;两个值=顶/底边框,两侧边框;三个值=顶边框,两侧边框,底边框;四个值=遵循钟面原则。好了,不太难记吧?

边框差异
border shorthand properties(边框简写属性)和padding(内边距)同样也可以使用这种“时钟”简写方法。border-widthborder-colorborder-stylepadding和margin(边距)的操控方式相同。不过,border属性还是有一点差异的。border属性可以同时设置盒状容器的四条边框的border-widthborder-styleborder-color

当四条边框全都一样时很好处理,但是如果他们不一样呢?难道我们还要回到从前诸如border-topborder-right的日子么?好吧,也许可以。幸运的是,我们另高招。

譬如说盒状容器各边框的式样和颜色都相同,唯独宽度各不相同。最直接有效的写法是照常使用基本的border简写属性定义border-widthborder-styleborder-color,然后单独使用border-width属性定义不同的边框宽度来覆盖前面的设置,象下面这样:

border: 10px solid red;
border-width: 10px 5px 3px 0;

如果四条边框的所有边框属性都各不相同,那么这个办法就派不上大用场了,不过这种情形毕竟不常发生。如果仅是border-style或者border-color属性各有变化,那么用这个办法稍作修改就能像处理border-width那样来处理这些属性了。

接下来我们一起来看另一种情况,看看高效的CSS编写方式有什么不同。

多重声明
譬如说我们有六个绝对定位的区块(Dreamweaver中的层),它们全都一样,所不同的是它们彼此隔开一定距离横排在页面顶部。由于它们的页面定位不同,必须给它们取单独的类名或ID,除此之外它们其余的属性统统一样。

用排版编辑器的话或许会为每个ID单独编写样式规则,包括所有的字体规则、文本规则、定位声明等等。像这样不停地重复那些完全一样的规则看上去实在不是什么明智之举,不是么?没错。下面就是如何最大限度地精简这些规则的方法:

#first {left: 0;}
#second {left: 100px;}
#third {left: 200px;}
#fourth {left: 300px;}
#fifth {left: 400px;}
#sixth {left: 500px;}
#first, #second, #third, #fourth, #fifth, #sixth {
 position: absolute;
 top: 0;
 width: 75px;
 font-size: .9em;
 font-weight: bold;
 text-align: center;
 line-height: 1.4em;
 background-color: silver;
 color: navy;
 padding: 5px;
 border: 1px solid navy;
 }

通过逐个列出这些相同区块的ID,并用逗号紧跟一个空格来分隔这些ID,后面大段的样式规则将同时应用于所有这六个区块。显而易见,如果每个ID都重复定义这些属性,整个CSS就会臃肿不堪。这可能是唯一最有效减小样式表体积的办法了。

注意: 确保最后一个ID选择符后面没有跟逗号,而应该像上面的多重ID规则集代码样本写的一样。有些浏览器仍旧能显示这些区块,但是有些就会将这个认作是代码错误而不显示任何一个区块。

使用默认值
多数CSS属性都有初始默认值,而当你为元素的这些属性重新定义了值的时候,它们的默认值也就被覆盖了。例如内边距的各个属性,padding-toppadding-rightpadding-bottompadding-left,它们的初始值都是0。如果不希望目标元素有内边距,那么内边距属性就可以省略不写。

注意: 我们先前讨论的简写属性本身并没有默认值。通常各个值都取自简写模型中所表现的单个属性。虽然CSS 2 specification Property Index(属性索引)里列出的默认值里很多是none或者0,但浏览器通常自己会根据不同元素为某些属性设置不同默认值的。

例如: Opera浏览器预设body元素的内边距为8px。h1-h6标题和段落元素通常默认的边距都不为零。不同的浏览器,为lists(列表)和list-items(列表项)预设的内外边距非零默认值也不尽相同。

属性继承
避免编写冗余代码的另外一个办法就是注意子元素从父元素那里继承下来的属性。可以继承的属性着实不多,可其中很多还是不常用到的属性,像voice-family。常用的可继承属性的列出来也没几个(按字母顺序):

  • color — 颜色
  • font (and related properties) — 字体及相关属性
  • letter-spacing — 字距
  • line-height — 行高
  • list-style (and related properties) — 列表样式及相关属性
  • text-align — 文本对齐
  • text-indent — 文本缩进
  • text-transform — 文本转换
  • white-space — 空白
  • word-spacing — 词距

在某些旧版浏览器中继承特性存在很多问题,而现在的新版浏览器一般来说都能正确实现继承。只要了解了哪些属性可以继承,你就又能少写不少多余代码了。重申一下,要查阅完整的属性列表请查看CSS 2 Property Index(CSS 2 属性索引)

空白的处理
这里说的空白不是CSS里那个有特定值的white-space属性,这里说的是样式表文件里面本来就存在的空白间隔。这些个间隔来自于那些用于产生新行的换行符,以及那些在单独一行里有助提高可读性的空格。尽管移除这些间隔可以省出几个字节的体积,但是通常也省不了多少。

假如这些空隔被移除了,样式表会变得晦涩难读,更别提以后做修改了。如果工程明确要求删除每一个多余的字节,那你最好新建一个方便阅读的“主”样式表文件,然后复制一份,再把其中所有的空白移除,这份样式表就是使用中的“现场版”样式表。要是今后要修改的话,在那份易读的主样式表里修改,再像上面那样复制一份并移除空白,继续作为“现场版”。

小心!有些空格是CSS编码中必需的,要是这些空格被移除了,CSS规则也会跟着改变并导致一些意外结果的发生。W3C的规范说明中要使用了诸如"space separated,"(以空格间隔)这样的措词,那么这些空格就是必需的。这种情况常见于简写属性的各个属性值之间。往往我们讲到包含选择符就讲到包含组合符,它就是一个空格,要是把选择符里所有的空格都移除,那可不是什么好主意。也许移除空格这样的活留给那些狂热分子最适合不过了,是吧?

总结
至此你已经学习了如何使你的样式表更简洁经济高效的几种方法。经常使用这些技巧的好处不仅仅是节省样式表体积、加快下载,更令样式表常葆清爽整洁,通常易读易懂的代码也易于后期必要的修改维护。即便你是用排版编辑器来创建你的样式表,你一样可以用本文中所提及的这些方法来将你的“成品”编写得更合理更高效!

Holly 'n John e-mail
©positioniseverything
Last updated: July 3, 2004
Created November, 2003
Translated by POPOEVER on October 10, 2004

—————————— 全文完 ——————————

译者注: 本文在翻译过程中有几点引起我的注意,主要是一些专属名词如何翻译最为恰当,我原本也有看过不少国内的Web Standards相关的翻译作品以及中文本土作品,其间对于一些名词一直纠缠不清,各说一词,我也就暂且不去管他们了,汉语博大精深,想要统一一个单词往往不是件容易事,更何况本来就是“舶来”的术语。比如padding,有翻成“填充”的,有翻成“补白”的,还有翻成“补丁”,对于后二者我倒觉得可以接受,至少谐音可以方便洋文差的朋友记忆,不过我还是坚持把它翻成“内边距”,因为这样从表意上说最形象,padding本来就是边框到内部文本的距离么,不叫“内边距”叫什么。至于margin究竟是译作“空白”还是“留空”或是“间隙”、“间隔”、“边距”,哪个更好,我母亲从前是做高级编辑的,她跟我说应该叫“白边”,既然我已经把padding翻成“内边距”,那么看来margin也只能凑成一对地翻作“边距”喽。还有一个是box,见得最多的是翻成“盒模型”或“盒对象”,我也懒得去罗嗦什么了。无论如何,只是一己之见,也就故妄译之,但愿没有混淆视听~~~

--POPOEVER原创翻译,翻译著作权所有,谢绝转载,原文版权归属原作者所有

Posted by POPOEVER at 2004年10月10日 15:06 | back to top
Featured

Trackback Pings

本篇日志的回溯引用地址:

http://plod.popoever.com/acp630/mt-tb.cgi/344

Listed below are links to weblogs that reference '[原文翻译]样式表编写效率手册' from Plod.


  1. #39

    » 樣式表(CSS)編寫效率手冊 from DZ&MAY@BLOG
    來自 positioniseverything 的 How To write Efficient CSS 是篇淺顯易懂的CSS優化技術教學文章,實用性強,文字優美,非常經典。 效率的好處 CSS最受推賞的優點就是減小頁面體積,從而減少了下載時...

    Tracked on 2004年10月12日 16:59 from this weblog | back to top

  2. #40

    » CSS之禅意设计 - 拥抱网页标准 from Owen's Blog
    Dave在悉尼We04会议演讲时宣布了他的出书计划,我便迫不及待的在Amazon上预定了这本新书:The Zen of CSS Design。和他一起编写的作者还有Molly,另一位知名网页设计师和网页标准的布道者。该书

    Tracked on 2004年10月14日 14:24 from this weblog | back to top

  3. #41

    » [转载]样式表编写效率手 from Loveyuki 's BLOG
    [b]  [/b]来自[url=http://www.positioniseverything.net/]positioniseverything[/url]的[url=http://www.positioniseverything.net/articles/efficientcss.html]How&nb...

    Tracked on 2004年10月15日 17:22 from this weblog | back to top

  4. #42

    » [?][? from Ryunho! Blog

    Tracked on 2004年10月15日 23:58 from this weblog | back to top

  5. #43

    » [原文翻译]样式表编写效 from Xiao Chuan
    来自[url=http://www.positioniseverything.net/]positioniseverything[/url]的[url=http://www.positioniseverything.net/articles/efficientcss.html]How To write Efficient CSS[/url]是篇浅显易懂的CSS优化技术教学文章,实用性强,文字优...

    Tracked on 2004年10月16日 11:55 from this weblog | back to top

  6. #44

    » 样式表编写效率手册 from Skyong's Blog | 乱七八糟
    来自<a target="_blank" href="http://www.positioniseverything.net/">positioniseverything</a>的<a target="%...

    Tracked on 2004年10月16日 17:42 from this weblog | back to top

  7. #45

    » [转载]样式表编写效率手册 [ 日期:2004-10-15 ] [ 来自:Plod ] from Julysea
    Ping Back来自:blog.csdn.net

    Tracked on 2004年10月17日 09:15 from this weblog | back to top

  8. #46

    » 样式表编写效率手册 from TGQ
    来自:[url=http://plod.popoever.com/archives/000325.html]Plod[/url]
    [原文翻译]样式表编写效率手册
      来自positioni..

    Tracked on 2004年10月19日 01:32 from this weblog | back to top

  9. #63

    » CSS之禅意设计 - 拥抱网页标准 from Owen's Blog - 文心
    Dave在悉尼We04会议演讲时宣布了他的出书计划,我便迫不及待的在Amazon上预定了这本新书:The Zen of CSS Design。和他一起编写的作者还有Molly,另一位知名网页设计师和网页标准的布道者。该书

    Tracked on 2005年01月11日 18:17 from this weblog | back to top

  10. #813

    » [原文翻译]样式表编写效 from Seven worlds
    来自positioniseverything的How To write Efficient CSS是篇浅显易懂的CSS优化技术教学文章

    Tracked on 2005年03月09日 16:25 from this weblog | back to top

  11. #814

    » [原文翻译]样式表编写效 from Seven worlds
    POPOEVER翻译的CSS编写效率手册

    Tracked on 2005年03月09日 16:32 from this weblog | back to top

  12. #53609

    » 关于翻译 Guy Kawasaki 一文的声明 from Plod
      看到了 frank 在[转译]1.2万美元如何建立一个Web 2.0、用户贡献内容、长尾、社会化媒体网站一文后的留言,其实我也很好奇,花花说以前有人翻译过了的时候也去搜索了一下,没什么结果,这次又去搜了一下,还是没有什么发现,不过倒是正好顺着搜索结果去了 frank 的 blog,才知道原来他真的误以为 (GFWed) 我是转载别人的译文,由于 frank 的 blog 架在 blogger.com 上面,最近又被封了,访问不方便,这些日子 Tor 也是奇慢,无法在他 blog 上留言,只好在这...

    Tracked on 2007年08月13日 10:09 from this weblog | back to top

Comments


  1. #912

    really hard working, nice! 翻译了这么长的文章 :) 希望更多的人能看到吧。

    Posted by owen at 2004年10月13日 02:07 | back to top

  2. #913

    pop, 看了你最后一段的补充我有一些自己的意见,总的来说Padding起到的是内边距的作用,但在一些情况下它的作用确实是填充或者是你说的补白。这个定义不可能像border那么直接让人理解。通过我所接触到的设计和理解,padding和边距的概念是有区别的。虽然没机会读中文方面的资料,但如果硬性的翻译为内边距可能对读者的理解有导向的限制。同样Margin也是这样,虽然我提不出什么更好的翻译,但我觉得保留Margin和padding的原词可能更加,可以在翻译的时候做相应的解释,但不必一定将其翻译成中文。因为毕竟在CSS定义的时候我们是无法用中文定义的。好像有一次JJGOD也在我的blog上讲过CSS中文的问题。
    一些想法,请指正。

    Posted by owen at 2004年10月13日 02:25 | back to top

  3. #917

    谢谢owen的意见,其实我也很矛盾,只是译文是实际的东西,必须有一个单词来解释的时候,无奈之中只好求全,为得是便于记忆,成对的概念往往记忆效率比较高。但是事实上padding和margin确是与“边”距在原始概念上存在差异,这点我很清楚,早在99年初学web standards的时候,在没有合适的教材的情况下,对于我一个完全的门外汉,把它们理解成“边距”令我能非常形象地记忆和理解。我倒是希望有更多人关注这个问题,希望能为将来的w3.org.cn标准汉化工作“堆积”一些参考资源和建设性意见:)

    Posted by POPOEVER at 2004年10月13日 16:01 | back to top

  4. #922

    对了,我无法访问w3c.org.cn, 请问这是为w3c的官方汉还项目还是自发组织的翻译项目呢?

    Posted by owen at 2004年10月14日 13:53 | back to top

  5. #924

    哈哈,owen多打了个"c",应该是w3.org.cn,目前处于筹备状态,近期任务是建库,第一个活动是简历样式设计比赛,作品将收纳入库:)

    Posted by POPOEVER at 2004年10月14日 14:54 | back to top

  6. #933

    我的主页的 URL 改了一下,原来 www.niub.com 下的页面全部要去掉 www. 才能访问 :(

    所以我以前翻译的这篇文章是在:
    http://niub.com/jjgod/archive/efficientcss.html,其实 popo 兄这里就译得很不错,我自己比较喜欢意译,至于水平什么的,popo 兄过誉了。

    margin 和 padding 的问题,我的看法和 owen 一样,在大部分时间保留原文是比较精确的,还能避免读者误解,如果真的要译,必须注明。有的时候加入一些中文,可以改善段落的可读性,丰富一下文字,也是不错的。

    至于译成什么,我当时翻译这里时也查了一下 hlb 他们以前对 P.I.E. 的翻译,大概是 margin = 边界, padding = 补白, border = 边框。

    我个人的看法是,margin = 边白 (印刷术语毕竟和 Web 设计不同,我也不喜欢这么译,但既有“边”又有“白”,同时表达这两个意思的词实在难找),padding = 补白 (这个倒是挺统一的,好像印刷上也是这么说,好像),border = 边界 (“界”带有界限的意思,“框”却带有方框的意思,想象一下,border-left 我可以说成“左边界”,但“左边框”似乎就不大通顺了,因为实际上指的是“边框的左侧”而不是“左边的那个边框”)。

    一点意见,还请指正。

    Posted by jjgod at 2004年10月16日 12:43 | back to top

  7. #944

    谢谢jjgod的建议,以后会在译文中多斟酌:)
    说到“边框”,其实frame才是“框”,border还是“边界”比较合适,不过不知道你们注意没有,其实我这些单词都来自M$ Word,以前用Word的时候用惯了所以自己觉得特别容易理解,呵呵,惭愧~~~

    Posted by POPOEVER at 2004年10月17日 01:07 | back to top

  8. #945

    DW2004里好像用的是边框
    padding用的“填充”
    marging用的“边界”

    Posted by Bone at 2004年10月17日 05:12 | back to top

  9. #1035

    我第一次看css的教程的时候,恰巧看到的翻译是外边框和内边框,没有什么,一下就理解了,后来在看到补白,补丁或者其他倒觉得奇怪了。

    Posted by gnaw0725 at 2004年10月25日 23:06 | back to top

  10. #1120

    background后面的如果是left top的话,可以不写吗?它默认是什么呢

    Posted by lycey at 2004年11月04日 03:17 | back to top

  11. #1126

    To: lycey,我可以花5秒钟告诉你答案,可是我更愿意花10秒钟劝说你自己先动手测试以及去W3C或MSDN查找相关资料,因为那样是绝对值得做的:)

    Posted by POPOEVER at 2004年11月04日 21:11 | back to top

Post a comment

说老实话,做开心人,欢迎您留露箴言
即便如此,也请遵纪守法,勿放厥辞
汝国如汝母,辱国如辱母,吾辈当自强
您的观点仅代表个人,与本站无关,望请自尊

Thanks for signing in, . Now you can comment. (sign out)

(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)


Remember me?