元素特定的CSS选择器是坏的吗?

时间:2011-05-24 08:14:36

标签: html css css-selectors

p.error.error更好还是更差?

我已经读过特定于元素的选择器是坏的,只有在真正需要时才应该使用,但似乎没有人知道原因。我的意思是我明白.error更适合代码重用,但是有一些特定的原因我为什么不应该总是用元素来处理类?

6 个答案:

答案 0 :(得分:9)

CSS选择器从右到左阅读。因此,p.error还有一个额外的步骤.error。这可能会导致更小的设置 - 取决于您的标记。

然而,这是微观微观优化。除非我们谈论大量的选择器,否则不会有性能损失。

这是一篇关于CSS选择器的精彩文章,详细阐述了它们的评估方式:http://css-tricks.com/efficiently-rendering-css/

答案 1 :(得分:6)

.errorp.error更有效。

为了理解为什么效率更高,我建议您阅读this article css技巧。

答案 2 :(得分:2)

不,它不坏,但可能并非总是必要

Google的PageSpeed和YSlow等工具!将这些类型的选择器称为“过度合格”,也许这就是你在“{3}}

中听到”它不好“的部分

p#myid为例 - 无论如何,ID在页面上始终应该是唯一的,因此根本不需要使用p元素来限定它。当计算特异性时,ID已经具有最高权重,因此添加额外部分以尝试添加更多特异性是完全多余的。

然而,对于像你的例子这样的类名,有时候肯定需要添加限定符,因为你可能希望该类可以在不同的类型元素上重用,但具有不同的属性,具体取决于它是div还是例如,p,“限定符”然后使选择器稍微具体化

.error {background: red; margin: 5px;}
p.error {margin: 2px;}

上面的代码意味着您可以在任何元素上使用error类,它将具有5px边距,但是如果您在p元素上设置错误类,则第二个选择器实际上正在执行某些操作,它是覆盖第一个边距但仍然获得背景颜色

所以他们做了一份工作,但是当你没有必要时,你经常会看到太多人超过所有元素的资格......例如,如果你只是将.error类应用于{{1那么你就不需要第二个选择器了。

经验法则是让选择器从右侧开始尽快变得独一无二。

答案 3 :(得分:1)

拥有一个非常具体的选择器并不会导致性能不佳,但如果有很多声明适用于某个元素,那么性能就会受到影响。唯一的问题就是它增加号码。要下载的用于加载样式表的字节数。相信我,传递的HTML中的每个额外字符都是邪恶的,并且会降低页面加载速度。

在现代浏览器应用CSS级联期间,以下是每个网页元素的每个CSS属性发生的过程:

  1. 从所有来源收集该属性的所有声明。这包括默认浏览器样式和自定义用户样式,以及作者样式表。如果有多个,请继续执行2.

  2. 按重要性和来源按以下顺序(从最低优先级到最高优先级)对声明进行排序:

    • 用户代理样式表(默认浏览器样式)
    • 用户样式表(用户的自定义样式表)中的常规声明
    • 作者样式表中的常规声明(网页样式表;外部,嵌入和内联样式)
    • !作者样式表中的重要声明
    • !用户样式表中的重要声明

    优先级最高的人获胜。如果多个具有相同的优先级,则继续执行3.

  3. 按选择器特异性排序。具有最具体选择器的那个获胜者。如果没有明确的获胜者,请继续执行4.

  4. 来源中最后一个获胜!

  5. 如果级联没有在元素上设置CSS属性,那么浏览器将回退到使用元素父级的继承属性(这仅适用于某些属性),否则该属性设置为CSS默认值

    根据上面的过程,如果你使用了很多更具体的选择器,那么在至少3级深度之后会有一个选择。因此,越多越不。可能适用于元素的声明,性能越低。

    所以,你必须具体而言才有意义。

答案 4 :(得分:0)

作为一般经验法则,浏览器必须评估的选择器越少越好。

如果p.error用于多个代码,则

.error不一定比.error“更差”。例如div.error(见底部的脚注)。

但如果它只用于一个段落,那么p.error只会使浏览器更加努力,即

首先,它必须找到具有类属性error的所有元素,然后通过仅包含p的标记来过滤这些元素。

以下是Google页面速​​度网站Optimize browser rendering上的一些有趣内容。


脚注

但是,如果你需要在多个标签上使用一个类,那么最好只放入适用于那些标签的css样式,而不是试图将它分开。 e.g。

.error
{
   color:red;
}

h1
{
font-size:2em;
}

p
{
   font-size:0.8em;
}


<h1 class="error">Bad Heading!</h1>
<p class="error">bad!</p>

因此无论如何都不需要为类添加标签。

我希望这有帮助!

答案 5 :(得分:0)

原因是特异性。例如......

  • 按班级
  • 每次访问+1
  • 每次按标记访问+1
  • 每次访问ID +

因此,如果您有类和标签访问权限,则该样式的特异性为2(1 + 1)。

稍后,如果您尝试设置所有.error元素的样式,但p.error元素中的样式存在冲突,则更高的特异性将获胜。这可能会引起一些令人头疼的问题。这就是为什么你可能不想总是使用tag + class。

(话虽如此,特异性解决了比它创造的更多问题,并且通常被认为是非常棒的。)