在Mozilla UI中优化CSS文件的规则

原文地址:Writing Efficient CSS for use in the Mozilla UI

以下文档描述了应用在 Mozilla UI 中优化 CSS 文件的规则。第一部分是对于 Mozilla 样式系统分类规则的一般性讨论。在了解这个系统的基础上,后续部分包含了一些指南,书写可以利用这个样式系统实践优点的样式的指南。

样式系统如何分类规则

样式系统把规则分为四大类。理解这些类是很重要的,因为对于规则的匹配来说他们是首先要考虑的。之后的段落中会使用“主选择符”这个说法。主选择符是指选择符最右边的部分(最终要匹配的那个元素,而不是它的祖先元素)。例如,在以下规则中:

a img, div > p, h1 + [title] {}

主选择符是 “img”, “p”, 和 “[title]“。

ID 规则

ID 选择符作为主选择符的规则。

例如:

  • button#backButton { } /* ID 类别的规则 */
  • #urlBar[type="autocomplete"] { } /* ID 类别的规则 */
  • treeitem > treerow > treecell#myCell:active { } /* ID 类别的规则 */

Class 规则

如果一条规则有一个指定的 class 作为主选择符,就被归入此类。

例如:

  • button.toolbarButton { } /* 基于 class 的规则 */
  • .fancyText { } /* 基于 class 的规则 */
  • menuitem > .menu-left[checked="true"] { } /* 基于 class 的规则 */

Tag 规则

如果主选择符不是 ID 或者 class,那么下一个类很可能就是 tag 分类。如果一条规则指定 tag 为主选择符,就被归入此类。

例如:

  • td { } /* 基于 tag 的规则 */
  • treeitem > treerow { } /* 基于 tag 的规则 */
  • input[type="checkbox"] { } /* 基于 tag 的规则 */

全局规则

除以上分类之外都归入此类。

例如:

  • [hidden="true"] { } /* 全局规则 */
  • *{} /* 全局规则 */
  • tree > [collapsed="true"] { } /* 全局规则 */

样式系统如何匹配规则

样式系统从最右边的选择符开始向左侧移动来匹配一条规则。样式系统会一直向左匹配选择符直到规则匹配完毕或者由于出错停止匹配。

对于规则分类的第一步发生在主选择符类别基础上。这个分类的目的是把那些不需要浪费时间匹配的规则过滤出来。这是显著提升性能的重点。对于一个给定的需要匹配的元素,规则越少,样式的渲染越快。例如,元素有一个 ID,那么只有和元素 ID 匹配的 ID 规则会被检索。只有和元素的 class 匹配的 class 规则会被检索。只有和 tag 匹配的 tag 规则会被检索。全局规则总是会被检索。

高效 CSS 指南

避免全局规则

确保规则不以全局分类结束

不要给 ID 分类规则指定标签名或者 class

如果有一条样式规则是以 ID 选择符为主选择符的,就别再画蛇添足的加上标签名了。ID 都是唯一的,因此加上标签名反而会无谓地拖慢匹配过程。(当有不同元素使用同一类名,而又需要动态地改变其中一个元素的类名来针对不同情况应用不同样式时是个例外。)

  • BAD – button#backButton { }
  • BAD – .menu-left#newMenuIcon { }
  • GOOD – #backButton { }
  • GOOD – #newMenuIcon { }

不要给 class 分类规则指定标签名

和以上规则类似,所有的类名也是唯一的。标签和类名连缀的写法是一个惯例(但是,如果设计的变更使得需要改变标签就会有灵活性的问题,因为也需要改变 class — 最好选用具有严格语义的名字,这种灵活性也是分离样式表的目标之一)。

  • BAD – treecell.indented { }
  • GOOD – .treecell-indented { }
  • BEST – .hierarchy-deep { }

尽量把规则应用到最明确的类上。

拖慢系统最大的一个原因是有太多的 tag 分类规则了。通过给元素增加类名,可以把这些 tag 类里的规则分一部分去class 分类,就可以不需要浪费时间来试图给一个标签匹配那么多的的规则了。

  • BAD – treeitem[mailfolder="true"] > treerow > treecell { }
  • GOOD – .treecell-mailfolder { }

避免后代选择符

CSS 中,后代选择符(descendant)[注1]的耗能高的可怕,尤其是选择符的规则是在 tag 或者全局分类中。子选择符(child selector)则经常是真正所需。如果没有主题模块所有者的明确允许,UI CSS 中禁止使用后代选择符。

  • BAD – treehead treerow treecell { }
  • BETTER, BUT STILL BAD (see next guideline) – treehead > treerow > treecell { }

Tag 类规则中最好不要包含后代选择符

避免使用具有 tag 类规则的后代选择符。这会明显地增加匹配时间(尤其是这些规则会被多次匹配时)。

  • BAD – treehead > treerow > treecell { }
  • BEST – .treecell-header { }

小心子选择符的使用

要小心使用子代选择符。如果有别的方式可以不用,就不要用子选择符。尤其是子选择符被大量使用在 RDF 树和类似的菜单中时。

  • BAD – treeitem[IsImapServer="true"] > treerow > .tree-folderpane-icon { }

要注意模版中来自 RDF 的属性是可以复制的!可以利用这一点把 RDF 属性复制到需要改变那个属性的子元素上。

  • GOOD – .tree-folderpane-icon[IsImapServer="true"] { }

倚赖继承

了解并使用那些可以继承的属性。XUL widgetry[注2] 已经明确设置了,因此可以把 list-style-image 或者 font 规则应用到父级标签上,它将渗透进匿名内容。因此就不需要浪费时间为那些匿名内容写规则了。

  • BAD – #bookmarkMenuItem > .menu-left { list-style-image: url(blah); }
  • GOOD – #bookmarkMenuItem { list-style-image: url(blah); }

上例中,样式化匿名内容的需求(没有理解 list-style-image 可以继承)导致了一条 class 类规则。其实这条规则应该属于最明确的一类 — ID 类规则。

要记住,尤其是那些匿名内容,它们都有同样的 class。上面那个不好的例子导致需要检查每个菜单的图标是否包含在 bookmarks 菜单项中。这是非常可怕的高昂消耗(有很多菜单);除 bookmarks 菜单之外,这条规则不应该被其他任何菜单想检查。

使用 -moz-image-region

把一堆图片放到一个单独的图片文件中,并用 -moz-image-region[注3] 选中会有显著的性能提升。()

注1: 后代选择符(descendant selector) 子选择符(child selector) 是有区别的。单从字面来讲,后代选择符,顾名思义包括儿子、孙子、重孙子等所有后代; 子选择符只是指儿子,就不管那帮孙子了。

注2: XUL widgetry 不清楚是啥。

注3: 貌似想法和现在说的 CSS sprites 方法差不多,要知道这可是十年前(2000年)的文章啊。 – 糖伴西红柿

时间: 2024-10-16 04:46:37

在Mozilla UI中优化CSS文件的规则的相关文章

9个精简优化CSS文件的技巧

由于CSS文件加载于网页的头部,所以每位访问者都会下载这些文件.我们会对PHP文件.图片进行优化,而往往忽略了CSS文件.今天我们应该思考这个问题并做点什么. 可以使用 CSS optimizers 来优化CSS, 但是我认为如果你使用下面提到的技巧编写代码时,效率和能力都会得到提高. 优化CSS文件还能节省流量同时提高页面加载速度. 1. 注释 编写CSS时注释显得格外有用,这样协同工作的同事就会理解代码的含义.注释方法有多种,你可以使用如下方法: /*-------------------*

net css 模板-在母版页中引入css文件,css的第一个样式无效,求解

问题描述 在母版页中引入css文件,css的第一个样式无效,求解 在母版页中引入css文件,css的第一个样式无效, ** 无论如何就第一个样式无效 **

ASP。NET 中 在CSS文件中定义的样式背景为啥显示不出来

问题描述 ASP.NET中在CSS文件中定义的样式背景为啥显示不出来 解决方案 解决方案二:没代码怎么知道~解决方案三:给出代码.可能路径问题,或者是选择器错误.解决方案四:比较大可能是路径问题解决方案五:引用CSS文件的代码贴出来.解决方案六:可以把CSS文件放到<head></head>之间,还有你说那个问题,可以能是路径引用不对解决方案七:直接写在里面试试例如<divstyle="color:red"></div>解决方案八:应该是

使用 YUI Compressor对JavaScript和CSS文件进行压缩优化(转)

本 文向您介绍如何通过在您的 CSS 和 JavaScript 文件中 - 两种易于优化的常见资源,使用社区中提供的工具即可完成优化 - 优化空间使用来实现更高的性能.然而,在继续之前,有一点是很重要的,压缩 CSS 和 JavaScript 文件只是为了让您的 web 应用程序 "轻巧" 的诸多操作其中的两个技术.    为了从本文中获得最大收益,您需要安装下列工具: 一个文本编辑器 Java Runtime Environment 1.4 或者更新版本    问题:空白内容 当 开

asp.net 多个css文件内容自动放到一个文件中

没事做,写了一个把多个css文件合并到一个文件中的方法,因为开发时,为了方便修改和共用css,我们可能会在页面引用4.5个css文件 ,但是实际运行中,我们是手动把css放到html 中去的 ,这样运行时页面显示快点,实际上是如此,但是每次修改的工作量是很大的,本地修改之后不能原封不动地放到服务器上去,在服务器上又要手动修改页面中的css. 在asp.net mvc模式中,我们可以把css的内容放到一个部分视图中,在head标签之间包含这个视图,那样运行时css就在html中了,我下面这个方法就

html调用问题,调用js,css文件

问题描述 html调用问题,调用js,css文件 1,html调用js和css需要注意什么 2,三者文件存储有什么规定?写了几个代码都不能调用js 解决方案 1,注意路径,js,css使用相对路径注意是相对当前html页面的路径,路径不对无法加载js,css就会报错,布局显示错误 2,html meta指定为utf-8时,html存储编码也要为utf-8,gb2312则对应ansi(国内ansi一般是gb2312).js和css存储编码要和html存储编码一致,如果js不一致可以给script标

Android中利用xml文件布局修改Helloworld程序_Android

Android环境布置完毕,直接就是一个Helloworld程序,详情请看<利用adt-bundle轻松搭建Android开发环境与Hello world(Linux)>这使得很多人难以理清整个Android项目的基本结构.其实安卓项目,与其它Java工程的项目,SSH.Servlet等,都是采取Java与XML文件联合的方式,形成一个工程的. 有几个文件是需要熟知的.如下图: MainActivity.java是整个安卓工程的入口, 其中,里面的protected void onCreate

多个js与css文件的合并方法详细说明_javascript技巧

在Web项目的开发中,js,css文件会随着项目的开发变得越来越多,越来越大,这就给给性能方面带来一些问题,如,页面引入的的js,css越多的话,那么对就增加了http请求数,解决该问题的一个好的方法就是合并js,css文件. 下面就简单介绍一个方法,十分简单.下面介绍以合并js文件为例 (1) G.js文件 复制代码 代码如下: ~function(){ window.G={}; G.Method={ add:function(){ alert(111);} ,sub:function(){

Android中利用xml文件布局修改Helloworld程序

Android环境布置完毕,直接就是一个Helloworld程序,详情请看<利用adt-bundle轻松搭建Android开发环境与Hello world(Linux)>这使得很多人难以理清整个Android项目的基本结构.其实安卓项目,与其它Java工程的项目,SSH.Servlet等,都是采取Java与XML文件联合的方式,形成一个工程的. 有几个文件是需要熟知的.如下图: MainActivity.java是整个安卓工程的入口, 其中,里面的protected void onCreate