“使用高效的CSS选择器”规则发生了什么变化?

时间:2014-09-02 07:34:20

标签: html css performance css-selectors pagespeed

Google PageSpeed提出了一项建议,要求网络开发人员Use efficient CSS selectors

  

避免匹配大量的低效键选择器   元素可以加快页面渲染速度。

     

详情

     

当浏览器解析HTML时,它会构造一个内部文档树   表示要显示的所有元素。然后匹配   根据各种样式表中指定的样式的元素   标准CSS级联,继承和排序规则。在Mozilla的   对于每个元素,实现(以及可能还有其他的)   CSS引擎搜索样式规则以查找匹配项。引擎   从最右边开始,从右到左评估每条规则   选择器(称为"键")并移动每个选择器直到它   找到匹配项或丢弃规则。 ("选择器"是文档   规则应适用的元素。)

     

根据该系统,引擎必须评估的规则越少   更好。 [...]。之后,对于包含大量的页面   元素和/或大量CSS规则,优化定义   规则本身也可以提高性能。关键   优化规则在于定义特定的规则   可能并避免不必要的冗余,以允许风格   引擎快速查找匹配而无需花时间评估规则   那不适用。

此推荐已从当前Page Speed Insights rules中删除。现在我想知道为什么这个规则被删除了。在此期间,浏览器是否能够有效地匹配CSS规则?这个建议是否有效?

3 个答案:

答案 0 :(得分:7)

这是thorough article(2014年初的日期)

我引用的是 Benjamin Poulain ,一位WebKit工程师,对CSS选择器性能测试有很多话要说:

  

在光栅化器中花费了大约10%的时间。大约21%的时间花在了上面   在第一个布局上。大约48%的时间花在解析器和DOM上   树的创造〜花费在风格分辨率上的8%〜花费了5%   收集风格 - 这是我们应该测试和什么   应该占用大部分时间。 (剩下的时间分布在很多人身上   许多小功能)

他继续说道:

  

“我完全同意预先优化选择器是没用的,但是   出于完全不同的原因:

     

实际上不可能预测最终的性能影响   通过检查选择器来选择给定的选择器。在引擎中,   选择器被重新排序,拆分,收集和编译。要知道   给定选择器的最终性能,您必须知道   收集选择器的桶,如何编译,以及   最后DOM树是什么样的。

     

各种引擎之间的所有这些都是非常不同的   整个过程更难以预测。

     

我对Web开发人员优化选择器的第二个论点   是他们可能会让事情变得更糟。大量的   关于选择器的错误信息大于正确的跨浏览器   信息。有人做正确事情的机会很大   低。

     

在实践中,人们发现CSS的性能问题并开始   逐个删除规则,直到问题消失。我想是的   正确的方法,这很容易,并将导致正确   结果“。

有一些方法,例如BEM,它们将CSS建模为尽可能平坦,以最小化DOM层次结构依赖性并分离Web组件,以便它们可以在DOM中“移动”并且无论如何都可以工作。

答案 1 :(得分:6)

2011年2月,Webkit核心开发人员Antti Koivisto made several improvements在Webkit中进行CSS选择器性能。

  

Antti Koivisto教授CSS样式选择器跳过兄弟选择器和更快的排序,这带来了一些小的改进,之后他获得了两个更棒的补丁:一个可以为树构建启用祖先标识符过滤,将样式中的剩余时间减半匹配典型的页面加载,以及简单选择器的快速路径,在某些网站上加速匹配另外50%。

Nicole Sullivan的

CSS Selector Performance has changed! (For the better)更详细地介绍了这些改进。总之 -

  

根据Antti的说法,直接和间接相邻组合器仍然可能很慢,但是,祖先过滤器和规则哈希可以降低影响,因为这些选择器很少会匹配。他还说,webkit仍有很大的空间来优化伪类和元素,但无论它们比使用JavaScript和DOM操作尝试做同样的事情要快得多。事实上,虽然仍有改进的余地,但他说:

     

“在审核中使用几乎从样式匹配的角度看,一切都会很好。”

虽然浏览器在匹配CSS选择器方面要快得多,但值得重申的是CSS选择器仍然应该进行优化(例如,保持尽可能平坦)以减少文件大小并避免特异性的问题。

答案 2 :(得分:0)

也许是因为为CMS或框架做CSS现在更常见,因此很难避免使用通用的CSS选择器。这样可以限制样式表的复杂性。

此外,现代浏览器在渲染CSS方面非常快。即使IE9上有大量的样式表,也不觉得渲染速度很慢。 (我必须承认我在一台好电脑上测试过。也许有基准测试。)

无论如何,我认为你必须编写非常低效的CSS来放慢Chrome或Firefox ......

Which CSS selectors or rules can significantly affect front-end layout / rendering performance in the real world?

的表现中有2年的帖子

我喜欢他的一句话结论:在#34;范围内的任何事情,是的,这个CSS有意义"没关系。