CSS 选择器性能损耗来自?

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

  #header > a {font-weight:blod;}

  我们中的大多数人都是从左到右的阅读习惯,会习惯性的设定浏览器也是从左到右的方式进行匹配规则,推测这条规则的开销并不高。

  我们会假设浏览器以这样的方式工作:寻找 id 为 header 的元素,然后将样式规则应用到直系子元素中的 a 元素上。我们知道文档中只有一个 id 为 header 的元素,并且它只有几个 a 元素的子节点,所以这个CSS选择器应该相当高效。

  事实上,却恰恰相反,CSS选择器是从右到左进行规则匹配。了解这个机制后,例子中看似高效的选择器在实际中的匹配开销是很高的,浏览器必须遍历页面中所有的 a 元素并且确定其父元素的 id 是否为 header 。

  如果把例子的子选择器改为后代选择器则会开销更多,在遍历页面中所有 a 元素后还需向其上级遍历直到根节点。

  #header a {font-weight:blod;}

  理解了CSS选择器从右到左匹配的机制后,明白只要当前选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和规则匹配的选择符,或者因为不匹配而退出。我们把最右边选择符称之为关键选择器。

  如何减少 CSS 选择器性能损耗?

  Google 资深web开发工程师 Steve Souders 对 CSS 选择器的执行效率从高到低做了一个排序:

  1.id选择器(#myid)

  2.类选择器(.myclassname)

  3.标签选择器(div,h1,p)

  4.相邻选择器(h1+p)

  5.子选择器(ul < li)

  6.后代选择器(li a)

  7.通配符选择器(*)

  8.属性选择器(a[rel="external"])

  9.伪类选择器(a:hover, li:nth-child)

  根据以上「选择器匹配」与「选择器执行效率」原则,我们可以通过避免不恰当的使用,提升 CSS 选择器性能。

  1、避免使用通用选择器

  .content * {color: red;}

  浏览器匹配文档中所有的元素后分别向上逐级匹配 class 为 content 的元素,直到文档的根节点。因此其匹配开销是非常大的,所以应避免使用关键选择器是通配选择器的情况。

  2、避免使用标签或 class 选择器限制 id 选择器

  BAD

  button#backButton {…}

  BAD

  .menu-left#newMenuIcon {…}

  GOOD

  #backButton {…}

  GOOD

  #newMenuIcon {…}

  3、避免使用标签限制 class 选择器

  BAD

  treecell.indented {…}

  GOOD

  .treecell-indented {…}

  BEST

  .hierarchy-deep {…}

  4、避免使用多层标签选择器。使用 class 选择器替换,减少css查找

  BAD

  treeitem[mailfolder="true"] > treerow > treecell {…}

  GOOD

  .treecell-mailfolder {…}

  5、避免使用子选择器

  BAD

  treehead treerow treecell {…}

  BETTER, BUT STILL BAD

  treehead > treerow > treecell {…}

  GOOD

  .treecell-header {…}

  6、使用继承

  BAD

  #bookmarkMenuItem > .menu-left { list-style-image: url(blah) }

  GOOD

  #bookmarkMenuItem { list-style-image: url(blah) }

  思考

  作为一名前端工程师,应该具有「提升 CSS 选择器性能」的意识,但实际应用中,是否需要完全贯彻这些原则呢?这是一个探索「追求高性能」与「可维护性」两者平衡的问题。

  对于「淘宝」,每个页面的 DOM 元素超过1000个以上的网站来说,通过限制 CSS 选择器,改善性能是具有实际意义的。但对于普通网站,我更倾向于保证「语义化」和「可维护性」的前提下,提升 CSS 选择器性能。

  (编辑:雷林鹏 来源:网络)

提升 CSS 选择器性能的方法的更多相关文章

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

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

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

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

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

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

  4. CSS选择器性能分析

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

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

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

  6. 如果要做优化,CSS提高性能的方法有哪些?

    一.前言 每一个网页都离不开css,但是很多人又认为,css主要是用来完成页面布局的,像一些细节或者优化,就不需要怎么考虑,实际上这种想法是不正确的 作为页面渲染和内容展现的重要环节,css影响着用户 ...

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

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

  8. 编写高效的CSS选择器

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

  9. CSS选择器使用

    今天要对CSS选择器的使用方法做一个全面的总结(几乎全部是从这篇文章摘抄的 https://blog.csdn.net/qq_39241986/article/details/82185697) CS ...

随机推荐

  1. mysqld.sock

    sudo  service mysql start https://dev.mysql.com/doc/refman/5.7/en/problems-with-mysql-sock.html B.5. ...

  2. mysql数据库表插入单条数据/批量插入数据

    1.创建表格 reate table trade( id int(4) not null primary key auto_increment, product varchar(30) null, p ...

  3. Java中Collections和Collection的区别

    java.util.Collection Collection 层次结构 中的根接口.Collection 表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许 ...

  4. An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

    与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider: TCP ...

  5. 《Redis官方文档》用Redis构建分布式锁

    用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简 ...

  6. 玩玩nmap

    ---恢复内容开始--- [root@miyan ~]# nmap -v Starting Nmap 7.12 ( https://nmap.org ) at 2016-04-04 15:34 CST ...

  7. NIO服务端和客户端通信demo

    代码转自 https://www.jianshu.com/p/a9d030fec081 服务端: package nio; import java.io.IOException; import jav ...

  8. python之路 前段之html,css

    一.HTML 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏 ...

  9. Node单线程与异步编程的初步理解

    最近学习了一些关于node的单线程与异步的知识,想拿过来和大家分享下: var async = require('async') //并行无关联,等待事件为最长时间请求过程.如以下两个任务执行时间 c ...

  10. Spring 之 @ComponentScan以及mock Spring MVC

    [ @ComponentScan] 纠正:可以成功 Autowired 的原因是我在另外一个 config 文件中扫描了根包,这会顺带扫描所有该包的子包 还有,,上面的写法容易出错,建议这样写, @C ...