CSS优先级逻辑

时间:2012-08-20 20:56:37

标签: html css css-selectors css-specificity css-cascade

在此示例中:

http://jsfiddle.net/Ja29K/

<style>
  /* Default links */
  a {
    color: #0F0; /* Green */
  }

  /* Header links */
  #header a {
    color: #F00; /* Red */
  }

  /* Login link */
  #login {
    color: #00F; /* Blue */
  }
</style>

<header id="header">
  <p><a href="#">header link</a> is red</p>
  <p><a id="login" href="#">login link</a> is not blue</p>
</header>

登录链接必须是蓝色是不合逻辑的?

我知道声明具有相同的起源和相同的重要性,因此需要对它们进行评分(选择器的特异性)。

为计算选择器特异性,我为每个选择器创建了一个表:

A =内联样式的数量:0
B = ID数:0
C =班级数:0
D =元素数量:0

所以登录元素有3次与他的颜色相关的碰撞: a #header a #login

元素(A,B,C,D)

a (0,0,0,1)= 1
#header a (0,1,0,1)= 101
#login (0,1,0,0)= 100

选择器“#header a”获胜,因为它得分最高。

但是

如果我们将选择器“#login”更改为“a#login”,我们将具有:
a#login(0,1,0,1)= 101
选择器“#header a”丢失,因为绘制赢得了声明的最后一个。

所以,我无法理解的是:

由于“#header a”选择器引用了许多元素而ID选择器(例如#login)只引用了一个元素,我们想要将ID选择器声明应用于该元素是对的,对吧?我真的无法理解这个CSS优先级逻辑,因为我认为ID选择器必须基本上是最具体的东西,就像内联样式一样。

P.S。:对不起我的英语不好:)

6 个答案:

答案 0 :(得分:4)

不,根据选择者的逻辑,它不是。

#header a#login更具体。如果您将#header a选择器缩减为#header,则标题选择器和登录选择器将具有相同的特异性,并且将使用上次表达的规则(按您的顺序从登录中获取颜色) 。如果通过向其添加标记名称来增加登录选择器的特定性,情况也是如此。

答案 1 :(得分:1)

从哪个选择器定位最少的元素,而不仅仅是最重要的元素,您无法看到“特异性”。

当然,通过区分诸如#header aa#login之类的内容,规则会变得更加复杂。然而,这只会给整个系统增加更多的困惑 此外(c / w)最有可能被滥用如下:header#header a - 这增加了更高的特异性,但也可以针对更多元素。

在我看来,这不会给系统带来更多的价值,只会让它变得更复杂。

编写CSS时,应始终尽量保持规则尽可能短的性能问题。如果您需要覆盖规则,您仍然可以添加另一个idclass - 除了正常的级联之外,这实际上已经绰绰有余了。

答案 2 :(得分:1)

您似乎熟悉特异性的概念,即thouroughly described as part of w3 css specs。从algorythm的角度来看,规则声明中的选择器特异性值是平面加权的或非位置。这意味着#header aa#login具有相同的特异性,这意味着如果一个元素符合两个规则的条件,则后者优先。

就个人而言,与选择器达成协议需要花费更长的时间,因为选择器具有语义特异性但没有计算价值。例如,ul liul>li具有相同的权重,即使后者“感觉”更具体!

我发现任何具有函数式编程背景的人都会更容易将特异性比较为四字节值(这实际上与主要浏览器中的实现方式相近 - consequently overflowing the value when 256+ selectors of the same weight are used:)

答案 3 :(得分:0)

它只是针对特异性 - 更具体,它会对你有用:

header a#login {
 color: #00F; /* Blue */
}​

答案 4 :(得分:0)

OP,也许你可以想到CSS首先处理第一个参数(#header和#login),然后才处理它,然后处理第二个参数(“#header a”中的a)。

所以在第一个过程中,它变为红色,然后变为蓝色,但在第二个过程中,由于第二个参数中的“a”,它被覆盖为红色。

答案 5 :(得分:0)

修复此问题只需将#login更改为a#login,让DOM知道此命令特定于链接。

#header a#login更具体,因为它指向DOM中的特定元素,而不仅仅是随机ID。