译自: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. ubuntu修改grub界面默认开机顺序

    终端输入: sudo gedit /etc/default/grub GRUB_DEFAULT代表的就是启动项的顺序,从数字0开始 修改成默认的第几个,就赋值成几就好(顺序从数字0开始) 然后别忘了运 ...

  2. JAVA实例,判断是否是瑞年

    题目:用户输入一个年份,返回是否是瑞年. 瑞年规则:能被4整除,并且不能能被100整除,或者能被400整除的年份称之为瑞年. 实例: import java.util.Scanner; public ...

  3. Java队列集合的性能测试

    同时开10个线程存入和取出100万的数据,结论如下: DoubleBufferedQueue < ConcurrentLinkedQueue < ArrayBlockingQueue &l ...

  4. perl处理含有中文字符的json编码

    例子:1. 有php的 json函数生成的中文串 [root@tts177:/tmp]$/opt/php/bin/php -r 'echo json_encode(Array("a" ...

  5. DEDE仿站经常用到的基本标签和变量

    一.针对于DEDE后台基本设置里面的使用到的数据标签. 主标题:{dede:global.cfg_webname/}  主要用于<title></title>里面 网 站描述: ...

  6. oracle查询锁和杀锁

    查询锁: SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username, l.os_user_name,s.machine, ...

  7. [ActionScript 3.0] AS3 时间格式化方法

    /** * 格式化时间,格式 00:00:00 * @param total 总时间(毫秒) */ function getFormatTime(total:uint):String { if (to ...

  8. java中的final总结

    Java关键字final有最终的,不可改变的含义,它可以修饰非抽象类.非抽象类成员方法和变量. 报错:类"TestFinal"要么是abstract,要么是final的,不能两个都 ...

  9. java 宠物商店代码

    Pet.java interface Pet{ public String getName(); public String getColor(); public int getAge(); publ ...

  10. 求链表中倒数第k个节点

    注意鲁棒性和算法效率的典型例题:(头文件省略) typedef struct node { int data; struct node* next; }ListNode; ListNode* Find ...