译自:http://css-tricks.com/efficiently-rendering-css/

无可否认我并不经常考虑这个问题… 我们书写的CSS的效率如何,浏览器渲染它的速度如何?

浏览器的开发者肯定关心这个问题(页面加载越快,人们用着越开心)。Mozilla有篇文章 about best practices。Google同样致力于让web更快,他们也有篇文章article about it

先来了解一下他们提出的主要想法,然后讨论其实用性。

#从右至左#

弄明白浏览器是怎样解读CSS选择器的重要一件事情是:浏览器按“从右向左”读取。意味着在选择器 ul > li a[title="home"]中,首先被解析的是a[title="home"]。这第一部分也被称为“目标选择器”,最终选择的元素是它。

#ID选择符最高效,通配选择符效率最低#

这里有四种目标选择器:ID,class,tag和通配符。按照效率排列如下。

#main-navigation {   }      /* ID (最快) */
body.home #page-wrap {   }  /* ID */
.main-navigation {   }      /* Class */
ul li a.current {   }       /* Class *
ul {   }                    /* Tag */
ul li a {  }                /* Tag */
* {   }                     /* 通配 (最慢) */
#content [title='home']     /* 通配 */

结合“从右至左”和目标选择器的思想,可以看出这样的选择器效率不是很高:

#main-nav > li {   }  /* 比你想象的要慢 */

即使这让人感到有悖常理…因为ID最有效,所以我们认为浏览器会快速地找到ID,然后很快地找到li子元素。但实际上,最先运行的是相对低效的li元素选择器。

#不要用标签修饰#

千万别这样做:

ul#main-navigation {  }

ID是唯一的,所以它们不需要和标签在一起。这样做反而会降低效率。如果可以避免的话,也不要用class修饰。class不唯一,所以理论上你可以对多个不同的元素应用一个class。如果想让标签控制样式,你可能会加以标签修饰(eg:li.first),但这种做法很罕见,所以还是别这样做。

#后代选择器是最糟糕的#

David Hyatt:

后代选择器在CSS中是最昂贵的选择器。贵得要命——尤其是把它和标签或通配符放在一起!

换言之,像下面这样的选择器简直是效率的灾难:

html body ul li a {  }

#一个选择器匹配失败比它被找到更高效#

我不确定这能让我们学到很多,因为如果在你的CSS中有大量的选择器未曾匹配任何东西…这太古怪了。不过也挺有趣,“从右至左”的解释一个选择器,一旦匹配失败就停下来,相比继续解释下来所用精力更少。

#想想你为什么会写出这样的选择器#

看看这个:

#main-navigation li a { font-family: Georgia, Serif; } 

字体样式,你可能不需要特意从一个选择器(a标签)开始(如果你只想换个字体)。这样可能达到同样的效果,但更加高效:

#main-navigation { font-family: Georgia, Serif; }

#CSS3和效率#

来自David Hyatt的噩耗:

关于CSS3选择器的可悲的事实是,如果你关心页面性能的话,他们真不该被使用!

整个评论是值得一读的。

CSS3选择器(例如:第n个孩子)是令人难以置信的好,在帮助我们锁定我们想要的元素的同时保持标记的干净和语义化,但事实是,这些花哨的选择器让更多的浏览器资源被密集使用。

到底怎么回事,我不应该使用它们吗?让我们想点实用性吧!

#实用性#

开头提到Mozilla的文章?已经有10年了。事实上,10年前的计算机更慢。这些东西在那时候更重要。10年前我刚要21岁,根本不知道CSS是什么,所以没法带你去那些古老的学校…但我感觉,我们之所以不关心渲染效率的问题,是因为它从来都不是个大问题。

这是我的想法:上面提到的最佳实践都是有意义的。你可以遵循,它们不会限制你的CSS能力。但你也不必太教条。如果你刚好需要改进从前的网站,又刚好没有考虑过这些想法,不妨看看你的样式表,哪里可以做得更好。如果你的网站没有渲染速度的问题,不用去担心,以后注意就可以了。

现在我们知道ID是最高效地选择器。如果你想使页面渲染最高效,你可以给每一个元素加上唯一的ID,然后对每个ID选择器应用样式。这超级快,同样超级荒谬。这样的页面会极端的没有语义,并且很难维护。即使在以表现为主的网站,也不会这样做。我想,这堂课并不是为了高效的CSS而牺牲语义和可维护性

感谢Jason Beaudoin email给我想法。如果有谁知道这个东西,或者你有额外的提示,请告诉我! 
只是作为一个速记,我想提一提,因为CSS样式选择器也在许多JavaScript库中使用,这些相同的概念也同样适用。 ID选择将是最快的,而复杂的后代选择等会慢一些。

高效渲染css的更多相关文章

  1. [css] 【转载】 精简高效的CSS命名准则/方法

    原文链接:http://www.zhangxinxu.com/wordpress/2010/09/%E7%B2%BE%E7%AE%80%E9%AB%98%E6%95%88%E7%9A%84css%E5 ...

  2. 编写高效的 CSS 选择器

    高效的CSS已经不是一个新的话题了,也不是我一个非得重拾的话题,但它却是我在Sky公司工作之时,所感兴趣的,关注已久的话题. 有很多人都忘记了,或在简单的说没有意识到,CSS在我们手中,既能很高效,也 ...

  3. 编写高效的CSS选择器

    高效的CSS已经不是一个新话题,也不是一个我非得重拾的话题,但是,它却是自我在SKY工作以后,真正感兴趣并始终关注的一个话题. 很多人或者忘记了,或者仅仅是没有意识到,CSS可以是高效的也可能导致低能 ...

  4. [转] 编写高效的 CSS 选择器

    高效的CSS已经不是一个新的话题了,也不是我一个非得重拾的话题,但它却是我在Sky公司工作之时,所感兴趣的,关注已久的话题. 有很多人都忘记了,或在简单的说没有意识到,CSS在我们手中,既能很高效,也 ...

  5. 书写更加高效的CSS,走出误区

    根据一些CSS写作经验,如何提高渲染效率及所占用消耗的资源,我们来浅谈一下CSS的渲染效率,书写高效的CSS. 1.十六进制的颜色值对位数与大小写 编写十六进制颜色值时你可能会用小写字母或省略成3位数 ...

  6. 书写高效的CSS

    一.使用高效是CSS ①:使用外联样式替代行间样式或内嵌样式. 不推荐使用内联样式:<style></style> 不推荐使用内嵌样式:<p style="&q ...

  7. 高效的CSS代码(2)

    ——阅读笔记,欢迎纠错^_^ 内容比较零散..... 1.让浮动元素的父容器根据元素的高度而自适应高度的方法: <div class="clearfix"><di ...

  8. 如何书写高效的css样式

    如何书写高效的css样式? 有以下四个关键要素: 1.高效的css 2.可维护的css 3.组件化的css 4.hack-free  css 书写高效的css: 1.使用外联样式替代行间样式或内嵌样式 ...

  9. 美团开源Graver框架:用“雕刻”诠释iOS端UI界面的高效渲染

    Graver 是一款高效的 UI 渲染框架,它以更低的资源消耗来构建十分流畅的 UI 界面.Graver 独创性的采用了基于绘制的视觉元素分解方式来构建界面,得益于此,该框架能让 UI 渲染过程变得更 ...

随机推荐

  1. DBA_Oracle DBA常用表汇总(概念)

    2014-06-20 Created By BaoXinjian

  2. Java SE 第二十三讲----static关键字and final关键字

    1.static关键字 [在二十二讲视频中30分钟开始讲授] 2.static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量进行了修改,其他 ...

  3. 【转】Python处理HTML转义字符

    Python处理HTML转义字符 转 [http://www.cnblogs.com/xuxn/archive/2011/08/12/parse-html-escape-characters-in-p ...

  4. I/O地址映射

    几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I ...

  5. 安装LINUX X86-64的10201出现链接ins_ctx.mk错误-转自yingtingkun

    详细错误信息为: Error in invoking target ‘install’ of makefile ‘/opt/oracle/product/10.2/ctx/lib/ins_ctx.mk ...

  6. [JS]以下是JS省市联动菜单代码

    以下是JS省市联动菜单代码: 代码一: <html> <head> <title></title> <script language=" ...

  7. Hadoop有关的网站

    软件下载: http://archive.apache.org hbase对Hadoop的支持矩阵: https://hbase.apache.org/book.html#configuration

  8. 一个构建XML对象的js库

    初学javascript,学习中用到在IE中建立XML对象,于是写了一个简单的“库”.因为水平所限,肯定会有不恰当的地方,欢迎指正. 如果大家有知道现存的更好的东西,非常希望大家能将它推荐给我. 代码 ...

  9. 数据以Excel形式导出导服务器,再将文件读取到客户端另存 以HSSFWorkbook方式实现

    public void exportExcel(List<P2pInfo> repayXist,HttpServletRequest request,HttpServletResponse ...

  10. 结束日期必须大于开始日期--My97DatePicker日历控制的又一方便之处

    在做时间查询时,有时需要两个日期,从一个日期到另外一个日期的那种,但是这样会有一个问题,比如后者的结束日期晚于开始日期怎么办?用JS写验证,麻烦,呵呵,用这个日历控件,可方便实现结束日期只显示开始日期 ...