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 ...
随机推荐
- ubuntu 修改默认root及密码
安装完Ubuntu后忽然意识到没有设 置root密码,不知道密码自然就无法进入根用户下.到网上搜了一下,原来是这麽回事.Ubuntu的默认root密码是随机的,即每次开机都有一个新的 root密码.我 ...
- cocos2dx在ubuntu下配置声音引擎
声音引擎库和cocos2dx的库是分开的我们要使用的时候不得不重新修改一下makefile,首先我们要找到声音引擎库的位置,在cocos2dx的 根目录下有一个lib文件,看一下是否存在libcoco ...
- android手机出现sqlite3 not found的解决方法
解决方法如下: 1.如果/system目录为不可读写的,需要挂载为读写: C:\Users\easteq>adb shell root@android:/ # mount -o remount, ...
- Android 2.1 和 Android 4.4 工程目录超详细对比及详解
在搭建Android开发环境及简单地建立一个HelloWorld项目后,本篇将通过HelloWorld项目来介绍Android项目的目录结构.本文的主要主题如下: 1.1.HelloWorld项目的目 ...
- [转]不定义JQuery插件,不要说会JQuery
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写("#"),("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人,直 ...
- install keepalived on RedHat/CentOS to provide IP failover for web cluster
Contents [hide] 1 Introduction 2 Our Sample Setup 3 Install Keepalived 4 Install Kernel Headers 5 C ...
- JS手动触发事件,转载
1. createEvent(eventType)参数:eventType 共5种类型: Events :包括所有的事件. HTMLEvents:包括 'abort', 'b ...
- Keypress – 超强大!捕获键盘输入的 JavaScript 库
Keypress 是一个强大的 JavaScript 库,用于捕获键盘输入.这是一个有非常特殊的功能的输入捕获库,它是很容易掌握和使用,并且不依赖第三方库.在网站开发中,经常会碰到需要处理键盘输入的场 ...
- 奥特曼小分队之四(Work Breakdown Structure)
写在前面的话:游戏介绍http://www.cnblogs.com/atmxfd/p/5415107.html 需求 我们的游戏是一款基于局域网的游戏,用户只需将服务端和客户端置于同一局域网下即可使用 ...
- [Tool] WireShark基本使用
Wireshark(前称Ethereal)是一个网络封包分析软件. 在windows平台上,Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换. [参数设置]: 抓包参数(Cap ...