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

样式表

  来自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,见得最多的是翻成“盒模型”或“盒对象”,我也懒得去罗嗦什么了。无论如何,只是一己之见,也就故妄译之,但愿没有混淆视听~~~

时间: 2024-11-02 13:25:46

[原文翻译]样式表编写效率手册的相关文章

css样式表中的样式覆盖顺序

原文:css样式表中的样式覆盖顺序 有时候在写CSS的过程中,某些限制总是不起作用,这就涉及了CSS样式覆盖的问题,如下   <!DOCTYPE html> <html lang="en"> <head> <style> #navigator { position: absolute; background-color: red; } .current_bg { background-color: green; } </style&

深入XSLT第六章--- 联合样式表

深入XSLT第六章--- 联合样式表 XSL提供两种机制来联合样式表: 1.样式表导入,允许样式表之间相互引用2.样式表包含,允许样式表被原文组合. 样式表导入 一个XSL样式表可以包含xsl:import元素.所有xsl:import元素必须出现在样式表的开头. xsl:import元素有一个 href 属性,它的值就表示要导入的样式表的URI. 相对URI是指相对于xsl:import元素的基URI. <xsl:stylesheet xmlns:xsl="http://www.w3.o

LESS一个流行的样式表语言让您编写CSS更加方便直观

本文将介绍 LESS 产生的背景.优势.演化与 CSS 之间的转化,及其典型的应用场景,并将其与其他样式表语言进行比较.相信前端http://www.aliyun.com/zixun/aggregation/7433.html">开发工程师会喜欢 LESS,灵活运用 LESS 以提高开发效率. LESS 提供了多种方式能平滑的将写好的代码转化成标准 CSS 代码,在很多流行的框架和工具盒中已经能经常看到 LESS 的身影了(例如 Twitter 提供的 bootstrap 库就使用了 LE

&amp;#106avascript极速狂飙:CSS样式表的渲染效率

css|样式表     我的MzTreeView1.0树控件发布至今,得到了不少意见反馈,很多网友给了我很多的中肯的建议,也指出了这个控件里的诸多BUG和不足之处,所以我准备写一个新版本的树,将大家的建议都整合进来实现.这几天我就一直在写新版的树,树控件最重要的是效率,特别是大节点量的时候,效率稍微差点的模式就会拖垮浏览器,所以新版的树我首要的还是提高效率,比如增加异步数据加载的支持等,另外我还有一个设想,就是树的树型结构竖线用样式表(背景图)来实现,样式表背景图片只需要加载一次,而现在这个模式

&amp;#106avascript极速狂飙:CSS样式表的背景渲染效率

css|样式表     我的MzTreeView1.0树控件发布至今,得到了不少意见反馈,很多网友给了我很多的中肯的建议,也指出了这个控件里的诸多BUG和不足之处,所以我准备写一个新版本的树,将大家的建议都整合进来实现.这几天我就一直在写新版的树,树控件最重要的是效率,特别是大节点量的时候,效率稍微差点的模式就会拖垮浏览器,所以新版的树我首要的还是提高效率,比如增加异步数据加载的支持等,另外我还有一个设想,就是树的树型结构竖线用样式表(背景图)来实现,样式表背景图片只需要加载一次,而现在这个模式

JavaScript极速狂飙:CSS样式表的渲染效率

css|javascript|样式表     我的MzTreeView1.0树控件发布至今,得到了不少意见反馈,很多网友给了我很多的中肯的建议,也指出了这个控件里的诸多BUG和不足之处,所以我准备写一个新版本的树,将大家的建议都整合进来实现.这几天我就一直在写新版的树,树控件最重要的是效率,特别是大节点量的时候,效率稍微差点的模式就会拖垮浏览器,所以新版的树我首要的还是提高效率,比如增加异步数据加载的支持等,另外我还有一个设想,就是树的树型结构竖线用样式表(背景图)来实现,样式表背景图片只需要加

JavaScript极速狂飙:CSS样式表的背景渲染效率

css|javascript|样式表     我的MzTreeView1.0树控件发布至今,得到了不少意见反馈,很多网友给了我很多的中肯的建议,也指出了这个控件里的诸多BUG和不足之处,所以我准备写一个新版本的树,将大家的建议都整合进来实现.这几天我就一直在写新版的树,树控件最重要的是效率,特别是大节点量的时候,效率稍微差点的模式就会拖垮浏览器,所以新版的树我首要的还是提高效率,比如增加异步数据加载的支持等,另外我还有一个设想,就是树的树型结构竖线用样式表(背景图)来实现,样式表背景图片只需要加

CSS样式表的背景渲染效率_经验交流

我的MzTreeView1.0树控件发布至今,得到了不少意见反馈,很多网友给了我很多的中肯的建议,也指出了这个控件里的诸多BUG和不足之处,所以我准备写一个新版本的树,将大家的建议都整合进来实现.这几天我就一直在写新版的树,树控件最重要的是效率,特别是大节点量的时候,效率稍微差点的模式就会拖垮浏览器,所以新版的树我首要的还是提高效率,比如增加异步数据加载的支持等,另外我还有一个设想,就是树的树型结构竖线用样式表(背景图)来实现,样式表背景图片只需要加载一次,而现在这个模式(用多个<img>)图

CSS实战:写CSS样式表的参考标准实战

文章简介:点分离(SoC).他已经让我们接受膨胀.报废.冗余.缓存甚至更多.现在,我确信唯一的方法是远离这一原则来改善我们的作者样式表. 当谈到CSS,我相信神圣的原则--点分离(SoC).他已经让我们接受膨胀.报废.冗余.缓存甚至更多.现在,我确信唯一的方法是远离这一原则来改善我们的作者样式表. 对于从未听说过SoC原则在Web设计中的上下文,它涉及到一些俗称"三层分离": 结构 表现 行为 为了避免一些担忧,将它划分成独立的资源:一个HTML文档,一个或多个样式文件和一个或多个Ja