译自: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. Shell_Oracle Erp基于主机文件Host开发详解(案例)

    2014-06-20 Created By BaoXinjian

  2. POJ 1269 Intersecting Lines(计算几何)

    题意:给定4个点的坐标,前2个点是一条线,后2个点是另一条线,求这两条线的关系,如果相交,就输出交点. 题解:先判断是否共线,我用的是叉积的性质,用了2遍就可以判断4个点是否共线了,在用斜率判断是否平 ...

  3. Log4j乱码

    在log4j.properties里添加encoding , 例如 : log4j.appender.fuscent=org.apache.log4j.DailyRollingFileAppender ...

  4. java中使用正则表达式

    1.用正则表达式分割字符串 Pattern SPLIT2 = Pattern.compile("[,]"); String[] tmpStrings1 = SPLIT2.split ...

  5. java:jdk环境变量配置+tomcat环境变量配置

    一:JDK1.先安装jdk  查看jdk版本:   DOC下输入java -version2.配置环境变量(添加系统变量)  JAVA_HOME      D:\study\jdk-6\jdk-6(j ...

  6. 关于如何查看mysql版本及其端口号

    关于如何查看MySQL版本: 方法一: 进入mysql cmd, status; 1 status; 将显示当前mysql的version的各种信息. 方法二: 还是在mysql的cmd下,输入: s ...

  7. [DataTable] datatable根据表中的字段进行排序

    private DataTable SortTable(DataTable dt,string[] pids) { DataTable dt0 = dt.Clone(); //复制原表结构 ;i< ...

  8. poj 3026 Borg Maze 最小生成树 + 广搜

    点击打开链接 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7097   Accepted: 2389 ...

  9. PL/SQL常用设置 可看引用位置更清晰直观 引自:http://blog.csdn.net/xiaoqforever/article/details/27695569

    引自:http://blog.csdn.net/xiaoqforever/article/details/27695569 1,登录后默认自动选中My Objects 默认情况下,PLSQL Deve ...

  10. Codeforces Round #223 (Div. 2) C

    C. Sereja and Prefixes time limit per test 1 second memory limit per test 256 megabytes input standa ...