【问题标题】:Are there any performance (or otherwise) differences concerning attributes vs. classes? [duplicate]关于属性与类是否有任何性能(或其他)差异? [复制]
【发布时间】:2015-11-03 22:51:18
【问题描述】:

我很好奇添加类与向元素添加属性以动态设置它们的样式。

将 CSS 属性应用于满足特定参数的某些元素的约定通常是通过将类应用于该元素来完成的。例如,如果我单击一个按钮,则可以说该按钮处于活动状态 - 我可以选择在单击时对其应用自定义类,如下所示:

$(".button").click(function(){
    $(this).addClass("active");
});

CSS 很简单:

.button.active {
    transform: scale(1.5);
}

我的方法不同,我很好奇两者之间是否存在明显差异。我将属性应用于元素而不是类,如下所示:

 $(".button").click(function(){
     $(this).attr("active", true);
 });

使用这样的 CSS:

.button[active] {
    transform: scale(1.5);
}

我想知道我是否有任何理由不应该这样做,即这是一个不好的约定或其他什么,以及此方法是否存在任何性能差异。主要是好奇,但也想知道使用像 $(".button[active]") 这样的查询是否会比 $(".button .active") 的性能差。

【问题讨论】:

  • 为了它的价值:active 不是有效的 HTML 属性。您需要改用data-active。此外,.button .active 选择.button.active 子元素,而.button[active] 选择具有active 属性的.button 元素——您需要使用.button [active]
  • @JamesDonnelly 我明白了!所以我不能随便使用自定义属性名称吗?哦,我的错!我会改正的
  • 是HTML元素的一个属性
  • @Zimmi 不过,它们在 JavaScript 端的访问方式不同。
  • 您通常可以避免使用自定义属性名称(每个浏览器都应该可以很好地处理它们),但是 HTML 验证器会对您大喊大叫,因此遵循将 data- 放在前面的标准只是一个好习惯的属性。它确保您的任何属性都不会最终导致发生奇怪的事情(即假设您使用“active”属性,并且将来会在 html 规范中添加“active”属性。突然间,您的“active”属性可能会有一些奇怪的副作用。)并让您轻松查看哪些属性是您的自定义属性。

标签: javascript jquery html css


【解决方案1】:

Mozillas Writing efficient CSS tl;dr 为此:

  1. 属性选择器是通用选择器

通用规则

所有其他规则都属于这一类。

例子

[hidden="true"] {…} /* A universal rule */`
* {…}     /* A universal rule */
tree > [collapsed="true"] {…} /* A universal rule */
  1. 不要使用通用选择器。

避免通用规则

确保规则不属于通用类别!

但是有activediscussiononcssselectors

最有趣的是,CSSLint 出于性能原因考虑disallowing unqualified attribute selectors

因此,我会坚持使用已被证明具有高性能的类选择器(当一如既往地未被滥用时;))

【讨论】:

    【解决方案2】:

    有人为similar 堆栈溢出问题的答案创建了性能测试。

    http://jsperf.com/id-vs-class-vs-tag-selectors/2

    看起来类选择器比属性选择器快得多,尽管数量显然取决于浏览器。

    【讨论】:

    • 哇,我进行了测试,属性显示的分数比使用类选择器慢 99%
    • 如果链接断开,这是我的浏览器生成的结果(我在 Fedora 22 64 位上使用 Chrome 43.0.2357.130)。 ID 是 1,458,439 ops/sec,标签是 762,970 ops/sec,类是 506,035 ops/sec,属性是 23,342 ops/sec,伪选择器是 992 ops/sec(哇,这太慢了)。所以你只能做大约 4.6 个属性匹配,同时你可以做 100 个类匹配(来源:23,342/506,035=0.046)。这是一个巨大的差异,没想到。
    • 我稍微改变了测试以使用原生的东西而不是 jQuery。 jsperf.com/byid-byclass-byattribute
    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 2021-05-29
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多