尽管css选择器效率问题已经不是什么新鲜问题,可是我以为仍是有必要拿出来认真分析一下。以前只是看到别人这么写我也跟着这么写,并无想清楚问什么要这样写?这样写真的能提升页面渲染效率吗?尽管本身技术不怎么样,但仍是须要拿出一种打破砂锅问到底的决心来深究一下css选择器效率问题,经过本身写个demo亲自实践来加深一下对这个问题的理解。
事情的通过是这样子的,在以前的博文CSS选择器总结中介绍了各类不一样的css选择器,顿时以为css的世界很精彩,能够有不少种不一样的写法,想怎么写就怎么写,因而就有了这种代码css
.wrapper ul li a{color:red;……} .wrapper .list p.name{margin:10px 0;……} * {margin:0;padding:0} ……
写完这样样式后,自我感受还不错,至少页面能呈现出来。但是直到有一天忽然发现html
CSS选择器从右向左的匹配规则web
个人世界瞬间崩塌了,由于根据阅读习惯在编写CSS的时候也会天然而然是从左向右逐渐细化。顿时很想搞清楚浏览器在将DOM tree变成render tree的时候css规则是如何匹配的?因而查了这么些资料:浏览器
看了这么多个人理解是从右往左匹配会首先过滤掉一大批不符合规则的样式,从而使得效率更高。举个例子app
.wrapper .list a .demo{……}
若是从左往右匹配会先找到.wrapper,而后再找到里面不少的.list,在往里找直到找到那个.demo,查找的越深,过滤掉的也就越多,在这个查找的过程当中会有不少没用的样式也被遍历过,这里就致使匹配的效率很低。
若是从右向左匹配会首先过滤掉不是.demo的元素,在依次往上查找,越往上过滤掉的也就越少,这样效率明显比从左往右匹配要高不少
弄明白了从右向左匹配的规则那么咱们要如何写才能让浏览器更快的匹配到呢?
浏览器在面对众多的CSS样式代码时并非毫无规则的一个一个匹配,而是先将样式规则分为四个主要类别:ide
并引入关键选择器的概念(选择器最后的那部分)性能
.wrapper ul li a{color:red;……} /* 关键选择器为a */ .wrapper .list p.name{margin:10px 0;……} /* 关键选择器为.name */
根据关键选择器属于哪类再在这一类中查找,从而达到更快匹配的目的。那么问题来了,怎样写才能达到高效呢?
CSS选择器效率从高到低的排序以下:网站
以上引用自Steve Souders的Even Faster网站
在实际使用中咱们尽可能选择高效一点的选择器,可是有一点很难避免那就是组合选择器的使用,通常都会用到。在使用组合选择器时咱们须要注意一下几点:ui
原本想写几个demo展现出不一样选择器的效率的,可是很差演示,你们能够看看CSS selector performance
这篇文章中介绍了20中不一样的选择器的执行效率问题。code
结合本身的实践经历,在编写CSS规则时需注意如下几点:
CSS选择器在性能提高上尽管相对于js等提高空间不大,但在大型项目中高效率的css选择器的性能优点就能获得展示
原文连接:http://www.jesse131.cn/blog/2016/12/05/HTML-CSS/CSS_selector_performance.html