jquery 选择器与 css3 选择器的性能

Posted

技术标签:

【中文标题】jquery 选择器与 css3 选择器的性能【英文标题】:Performance of jquery selectors vs css3 selectors 【发布时间】:2012-02-08 07:02:41 【问题描述】:

我对 css3 使用选择器(或一般的简单 css 选择器)相当陌生,我对这些 css 选择器与 jquery 或 javascript 选择器的性能比较感到好奇?

假设你有这样的事情:

css 版本

#someID > div:nth-child(2n)  some css .... 

jquery 版本(编辑)

$("#someID").children(":nth-child(even)").css( some css ....);

尽可能使用 css 选择器通常更快,还是使用 jquery 选择器来调整与一个元素或一组元素相关的 css?主要是当集合变得相当大时。我会假设只有少数几个项目不会有太大的性能差异?

谢谢!

【问题讨论】:

第一个子选择器 ">" 在任何一种情况下都是猪。 这些选择器示例不匹配。第二个示例选择 ID 为 someID 的元素,它是偶数子元素,而第一个示例选择 div,它是 #someID 的偶数子元素。 是的,我想我确实搞砸了 jquery 版本......试图把它放在一起快速。 您的编辑完全改变了问题...$("#someID").children(":nth-child(even)") 执行 两个 选择。 @Matt:我的意思是 jQuery 使用了两个独立的选择器,一个用于过滤选择另一个子的结果。这与您的 CSS 选择器形成对比,后者仅从右到左进行评估,> 组合器链接这两个部分。 【参考方案1】:

jQuery 的选择器引擎与 CSS 共享大部分语法,有效地扩展选择器标准。这意味着您可以将大多数有效的 CSS 选择器(使用 some exceptions)传递给 jQuery,它会很好地处理它们。

jQuery 为支持选择器 API 的现代浏览器优化了有效的 CSS 选择器,方法是将它们直接传递给 document.querySelectorAll()。这意味着您的 jQuery 选择器将与等效的 CSS 选择器具有几乎相同的性能,唯一的开销是 $().css() 和选择器 API 调用。

对于不支持选择器 API 的浏览器,很明显 jQuery 会非常慢,因为它必须自己完成所有繁重的工作。更重要的是,它只会在我上面链接的异常以及浏览器不支持的任何其他 CSS 选择器上失败。

然而,尽管如此,jQuery 总是会变慢,因为浏览器必须运行脚本并对其进行评估,然后才有机会应用和计算您的样式。

毕竟,老实说,即使您有数百个项目,这也不算多——浏览器获取标记的时间可能比渲染样式的时间要长。如果你需要做样式,并且 CSS 支持它,为什么不使用 CSS 呢?这就是最初创建该语言的原因。

【讨论】:

就此而言,CSS3 选择器并不比所谓的“简单”CSS2 和 CSS1 选择器更“高级”或“复杂”。【参考方案2】:

纯 CSS总是会更快,因为它是在浏览器中完成并经过优化的!

缺点是您使用的浏览器可能不支持某些选择器。见http://caniuse.com/#feat=css-sel3

【讨论】:

【参考方案3】:

对我来说,如果我使用 jquery 意味着我想对其施加一些影响,比如

$("#someID:nth-child(even)").css( some css ....).fadeIn('slow');

除此之外,您最好使用 CSS 本身,但无论如何我们几乎看不到它的区别,至少对于一个小范围的系统而言。

我发现这个网站比较了来自不同 javascript 框架的选择器功能,而 jquery 做得很好。

javascript framework selector test

【讨论】:

以上是关于jquery 选择器与 css3 选择器的性能的主要内容,如果未能解决你的问题,请参考以下文章

伪类选择器与伪元素选择器的区别

CSS 正则表达式 id 选择器与类选择器的性能

CSS-属性&&选择器

jQuery选择器

jquery 类选择器与合格的类选择器

css3属性选择器总结