写了几篇关于js的博客,也是关于性能的,现在,我觉得有必要那css来认真分析一下了。之前只是看别人这么写就跟着写,但是没有去研究这样写或者是不是正确的写法,性价比怎么样,渲染的效率好么!这些都没有考虑。

那么,现在,我提出css的一些选择器的性能分析。

.wrapper ul li a{color:red;……}
.wrapper .list p.name{margin:10px ;……}
* {margin:;padding:}
……

这样写完了以后,渲染的效果至少呈现出来了,可是,要想到     css选择器从右向左的匹配规则    

此时,我就想研究一下浏览器在将DOM tree 变成 render tree 的时候css规则是如何匹配的?于是,就在网上找了一些资料:

看了这么多我的理解是从右往左匹配会首先过滤掉一大批不符合规则的样式,从而使得效率更高。举个例子

.wrapper .list a .demo{……}

如果从左往右匹配会先找到.wrapper,然后再找到里面很多的.list,在往里找直到找到那个.demo,查找的越深,过滤掉的也就越多,在这个查找的过程中会有很多没用的样式也被遍历过,这里就导致匹配的效率很低。
如果从右向左匹配会首先过滤掉不是.demo的元素,在依次往上查找,越往上过滤掉的也就越少,这样效率明显比从左往右匹配要高很多
弄明白了从右向左匹配的规则那么我们要如何写才能让浏览器更快的匹配到呢?
浏览器在面对众多的CSS样式代码时并不是毫无规则的一个一个匹配,而是先将样式规则分为四个主要类别:

  • ID 规则 这第一个类别包含了那些将 ID 选择器作为关键选择器的规则。
  • Class 规则 如果一个规则将一个 class 明确作为它的关键选择器,那么它就属于该类别。
  • 标签规则 如果一条规则将一个标签作为它的关键选择器,那么这条规则就属于该类别。
  • 通用规则 不属于上面那些类别的规则都属于这个类别。

并引入关键选择器的概念(选择器最后的那部分)

.wrapper ul li a{color:red;……}           /* 关键选择器为a */
.wrapper .list p.name{margin:10px ;……} /* 关键选择器为.name */

根据关键选择器属于哪类再在这一类中查找,从而达到更快匹配的目的。那么问题来了,怎样写才能达到高效呢?
CSS选择器效率从高到低的排序如下:

  1. ID选择器 比如#header
  2. 类选择器 比如.promo
  3. 元素选择器 比如 div
  4. 兄弟选择器 比如 h2 + p
  5. 子选择器 比如 li > ul
  6. 后代选择器 比如 ul a 7. 通用选择器 比如 *
  7. 属性选择器 比如 type = “text”
  8. 伪类/伪元素选择器 比如 a:hover

以上引用自Steve Souders的Even Faster网站
在实际使用中我们尽量选择高效一点的选择器,但是有一点很难避免那就是组合选择器的使用,一般都会用到。在使用组合选择器时我们需要注意一下几点:

  • 如果规则拥有ID选择器作为其关键选择器,则不在需要添加其他规则了,因为ID是唯一的。

    • 差 .wrapper button#backButton {…}
    • 好 #backButton {…}
  • 不要用标签名限定 class 规则,这会有损灵活性
    • 差 .wrapper p.name{…}
    • 好 .wrapper .name{…}
  • 避免使用过度限制选择器(最好不要超过3层)
    • 差 body .wrapper .content .list {}
    • 好 .content .list{}
  • 避免后代选择器,后代选择器是 CSS 中性能耗用最大的选择器。
    • 差 ul li a{}
    • 好 .list .list-content{}
  • 依赖继承

本来想写几个demo展示出不同选择器的效率的,但是不好演示,大家可以看看CSS selector performance
这篇文章中介绍了20中不同的选择器的执行效率问题。

结合自己的实践经历,在编写CSS规则时需注意以下几点:

  1. 嵌套层级最好不要超过3层
  2. 避免使用标签选择器,尽可能使用具体的类名
  3. 不要给关键选择器添加多余的规则

CSS选择器在性能提升上尽管相对于js等提升空间不大,但在大型项目中高效率的css选择器的性能优势就能得到展现

CSS选择器性能分析的更多相关文章

  1. CSS选择器 - 性能的探究及提升

    [本博客为原创:http://www.cnblogs.com/HeavenBin/]  前言: 在工作中编写CSS样式表时随着选择器层数的增加总会看到选择器又丑又长的情况,利用工作之余研究从其命名再到 ...

  2. [转]关于浏览器css选择器性能优化

    作为一个前端开发, 我觉得很有必要了解浏览器对css选择器的解析,因为这个关系到页面的渲染,高效的方式.避开开销大的方式这些无疑为网站加载缩短了时间. 最近在新的项目中陷入了一个误区,也是出于对jqu ...

  3. 如何提升 CSS 选择器性能

    CSS 选择器性能损耗来自? CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间,所以优化选择器的原则是应尽量避免使用消耗更多匹配时间的选择器.而在这之前我们需要了解CSS选择器匹配 ...

  4. 提升 CSS 选择器性能的方法

    CSS 选择器性能损耗来自? CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间,所以优化选择器的原则是应尽量避免使用消耗更多匹配时间的选择器.而在这之前我们需要了解CSS选择器匹配 ...

  5. 网站CSS选择器性能讨论

    CSS选择符由一些初始化参数组成,这些参数指明了要应用这个CSS规则的页面元素.作为一个网站的前端开发工程师,应该避免编写一些常见的开销很大的CSS选择符模式,尽量编写高效的CSS选择符,从而加快页面 ...

  6. 看这一篇就够了,css选择器知识汇总

    对大多技术人员来说都比较熟悉CSS选择器,举一例子来说,假设给一个p标签增加一个类(class),可是执行后该class中的有些属性并没有起作用.通过Firebug查看,发现没有起作用的属性被覆盖了, ...

  7. 编写高效的CSS选择器

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

  8. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析

    Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...

  9. CSS性能分析,如何优化CSS提高性能

    不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...

随机推荐

  1. Android最佳实践之UI篇

    http://sr1.me/way-to-explore/2015/03/25/best-practice-for-android-ui.html

  2. SQL Server 2008 R2 开启数据库远程连接

    今天要测试一个.net系统~因为配置的数据库是SQL Server~我就不得不安装SQL Server 2008 R2~现在我们就一起来看看SQL Server 2008 R2是如何打开远程连接端口1 ...

  3. 从逆向的角度去理解C++虚函数表

    很久没有写过文章了,自己一直是做C/C++开发的,我一直认为,作为一个C/C++程序员,如果能够好好学一下汇编和逆向分析,那么对于我们去理解C/C++将会有很大的帮助,因为程序中所有的奥秘都藏在汇编中 ...

  4. Win7下安装git

    1.下载并安装git for windows版本:msysgit http://msysgit.github.com/   成功安装后,即可使用了,右键一个目录后可以看到菜单选项: 选择Git Gui ...

  5. 使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  6. oracle/sqlserver 递归

    1.Oracle递归查询 2.SqlServer递归查询 with cte as ( select t.id,t.name,t.parentId from dbo.Department t where ...

  7. sublime text 3安装package console

    打开Packages目录,Preferences > Browse Packages 就可以进入这个目录. $ cd Packages/$ git clone https://github.co ...

  8. ruby -- 进阶学习(三)Strong Parameters在rail3.0和4.0中的区别

    今天coding的时候遇到一个未知的类型,于是用puts logo_params.class查了下数据类型,然后google了一下发现是 Strong Parameter Strong paramet ...

  9. [python]抽象方法

    抽象方法 我的理解抽象方法就是:父类的一个方法,继承的所有子类都必须要实现这个方法,否则报错. 举例说明 class Base(object): def _method(self): raise No ...

  10. redis在centOS的安装

    1.安装tcl支持 yum install tcl 2.安装redis我们以最新的2.8.9为例 $ wget http://download.redis.io/releases/redis-2.8. ...