CSS选择器性能分析
写了几篇关于js的博客,也是关于性能的,现在,我觉得有必要那css来认真分析一下了。之前只是看别人这么写就跟着写,但是没有去研究这样写或者是不是正确的写法,性价比怎么样,渲染的效率好么!这些都没有考虑。
那么,现在,我提出css的一些选择器的性能分析。
.wrapper ul li a{color:red;……}
.wrapper .list p.name{margin:10px ;……}
* {margin:;padding:}
……
这样写完了以后,渲染的效果至少呈现出来了,可是,要想到 css选择器从右向左的匹配规则
此时,我就想研究一下浏览器在将DOM tree 变成 render tree 的时候css规则是如何匹配的?于是,就在网上找了一些资料:
- Why do browsers match CSS selectors from right to left?
- Writing Efficient CSS: Understand Your Selectors
- 编写高效的 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选择器效率从高到低的排序如下:
- ID选择器 比如#header
- 类选择器 比如.promo
- 元素选择器 比如 div
- 兄弟选择器 比如 h2 + p
- 子选择器 比如 li > ul
- 后代选择器 比如 ul a 7. 通用选择器 比如 *
- 属性选择器 比如 type = “text”
- 伪类/伪元素选择器 比如 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规则时需注意以下几点:
- 嵌套层级最好不要超过3层
- 避免使用标签选择器,尽可能使用具体的类名
- 不要给关键选择器添加多余的规则
CSS选择器在性能提升上尽管相对于js等提升空间不大,但在大型项目中高效率的css选择器的性能优势就能得到展现
CSS选择器性能分析的更多相关文章
- CSS选择器 - 性能的探究及提升
[本博客为原创:http://www.cnblogs.com/HeavenBin/] 前言: 在工作中编写CSS样式表时随着选择器层数的增加总会看到选择器又丑又长的情况,利用工作之余研究从其命名再到 ...
- [转]关于浏览器css选择器性能优化
作为一个前端开发, 我觉得很有必要了解浏览器对css选择器的解析,因为这个关系到页面的渲染,高效的方式.避开开销大的方式这些无疑为网站加载缩短了时间. 最近在新的项目中陷入了一个误区,也是出于对jqu ...
- 如何提升 CSS 选择器性能
CSS 选择器性能损耗来自? CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间,所以优化选择器的原则是应尽量避免使用消耗更多匹配时间的选择器.而在这之前我们需要了解CSS选择器匹配 ...
- 提升 CSS 选择器性能的方法
CSS 选择器性能损耗来自? CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间,所以优化选择器的原则是应尽量避免使用消耗更多匹配时间的选择器.而在这之前我们需要了解CSS选择器匹配 ...
- 网站CSS选择器性能讨论
CSS选择符由一些初始化参数组成,这些参数指明了要应用这个CSS规则的页面元素.作为一个网站的前端开发工程师,应该避免编写一些常见的开销很大的CSS选择符模式,尽量编写高效的CSS选择符,从而加快页面 ...
- 看这一篇就够了,css选择器知识汇总
对大多技术人员来说都比较熟悉CSS选择器,举一例子来说,假设给一个p标签增加一个类(class),可是执行后该class中的有些属性并没有起作用.通过Firebug查看,发现没有起作用的属性被覆盖了, ...
- 编写高效的CSS选择器
高效的CSS已经不是一个新话题,也不是一个我非得重拾的话题,但是,它却是自我在SKY工作以后,真正感兴趣并始终关注的一个话题. 很多人或者忘记了,或者仅仅是没有意识到,CSS可以是高效的也可能导致低能 ...
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析
Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...
- CSS性能分析,如何优化CSS提高性能
不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...
随机推荐
- 让Windows 7变成WIFI热点
360要推便携路由器,个人觉得其主要目的是盯住了用户无线设备上的信息.因为如果用户移动设备都通过它这个路由器走的话,未加密的数据全部在他掌控之中. 其实Windows 7以上的系统是非常容易建立无线热 ...
- MSSQL获得表的字段名称及其参数
SELECT ColumnsName = c.name, [Description] = ex.value, ColumnType = t.name, [Length]=c.max_length FR ...
- 写给已有编程经验的 Python 初学者的总结
当我开始学习Python的时候,有些事我希望我一早就知道.我花费了很多时间才学会这些东西.我想要把这些重点都编纂到一篇文章当中.这篇文章的目标读者,是刚刚开始学习Python语言的有经验的程序员,想要 ...
- 获取ACCESS数据库中自增变量的值
/// <summary> /// 获取自增变量值 /// </summary> /// <returns>自增变量值</returns> public ...
- Apk去签名校验详解
某些apk为了防止重打包,使用了签名校验.所以在破解的时候我们需要破解签名校验.在定位签名校验位置时常用的关键词有sign,signature,checkSign,signCheck,getPacka ...
- [转载]Windows 2012 R2安装SharePoint 2013 手动安装工具软件
之前介绍过在window 2012中安装SharePoint 2013,这次,借着SharePoint 2013 sp1补丁发布之际,介绍下在window 2012 r2中安装SharePoint 2 ...
- Gulp.js - 简单、直观的自动化项目构建工具
Gulp.js 是一个简单.直观的构建系统.崇尚代码优于配置,使复杂的任务更好管理.通过结合 NodeJS 的数据流的能力,你能够快速构建.通过简单的 API 接口,只需几步就能搭建起自己的自动化项目 ...
- Web Service常识
1 问题的引出 位于服务器的程序需要在Web页面上显示一个订单列表,它需要访问业务对象服务器上的程序,通过它读取订单列表,业务对象服务器又要访问数据库服务器.当一台计算机上的程序调用另一台计算机上 ...
- C++ 多态的实现原理与内存模型
多态在C++中是一个重要的概念,通过虚函数机制实现了在程序运行时根据调用对象来判断具体调用哪一个函数. 具体来说就是:父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际 ...
- BABOK2主要概要输入输出图