【问题标题】:Relationship between !important and CSS specificity!important 和 CSS 特异性之间的关系
【发布时间】:2011-08-13 21:15:12
【问题描述】:

the CSS specificity specification,没有提到!important规则值多少“点”。

什么时候覆盖另一个?如果一个接着一个声明会发生什么?哪个规则被宣布为更重要?有什么规律吗?

looks of it 开始,!important 适用于开始时具有更多特异性点的内容。但是,如果我声明一个与类堆叠在一起并且嵌套很深的 id 会发生什么?它会覆盖在另一个用!important 标记的不太明确的规则中设置的规则吗?

【问题讨论】:

  • 确保您写的是property: value !important,而不是important!(如您的问题标题)或property: value; !important(如your first demo)。在your second demo 中,您写了div#green,它正在寻找<div id="green">,它在您的演示中不存在。 我的观点是,在担心!important 的细微差别之前,您需要确保了解更多基本问题。

标签: css css-specificity


【解决方案1】:

Specificity 在 CSS 中只涉及 选择器,而不涉及它们的相关声明。 !important 适用于声明,因此它本身对特异性没有任何作用。

但是,!important 会影响 级联,即当多个相同的属性声明适用于某个元素时,该元素的样式的整体计算。或者,as Christopher Altman succinctly describes

  1. !importantspades card。它胜过所有的特异性点。

但不仅如此:因为它会影响整个级联,如果您有多个 !important 选择器,其规则包含匹配相同元素的 !important 声明,则选择器特异性将继续适用。同样,这仅仅是因为有多个规则适用于同一个元素。

换句话说,对于同一样式表中具有不相等选择器的两条规则(例如,相同的用户样式表、相同的内部作者样式表或相同的外部作者样式表),具有最具体选择器的规则适用。如果有任何!important 样式,则规则中具有最具体选择器的样式获胜。最后,由于您只能拥有重要或不重要的东西,因此您可以尽可能地影响级联。

以下是!important 的各种用途及其应用方式的图示:

  • !important 声明总是覆盖没有它的声明(IE6 和更早版本除外):

    /* In a <style> element */
    #id {
        color: red !important;
        color: blue;
    }
    
  • 如果一条规则中有多个 !important 声明具有相同级别的特异性,则后面声明的一个获胜:

    /* In a <style> element */
    #id {
        color: red !important;
        color: blue !important;
    }
    
  • 如果您在两个不同的地方声明相同的规则和相同的属性,!important 遵循级联顺序,如果两个声明都很重要:

    /* In an externally-linked stylesheet */
    #id {
        color: red !important;
    }
    
    /* In a <style> element appearing after the external stylesheet */
    #id {
        color: blue !important; /* This one wins */
    }
    
  • 对于以下 HTML:

    <span id="id" class="class">Text</span>
    

    如果你有两个不同的规则和一个!important

    #id {
        color: red;
    }
    
    .class {
        color: blue !important;
    }
    

    !important 总是获胜。

    但是当你有多个!important:

    #id {
        color: red !important;
    }
    
    .class {
        color: blue !important;
    }
    

    #id 规则有一个更具体的选择器,所以一个获胜。

【讨论】:

  • 只是为了澄清你的第 3 段,“对于两个具有不相等选择器的规则......”。只有当有超过 1 条规则,针对同一个元素,并带有 !important 声明时,特异性才会发挥作用。否则,!important 声明每次都会获胜,无论具体性如何。
  • 我曾经认为内联样式属性会覆盖包括!important在内的所有属性。
【解决方案2】:

我的想法是这样的:

  1. !important 是一个spades card。它胜过所有的特异性点。对于您的具体问题,!important 将覆盖一个 bazillion id/classes。

  2. !important 重置级联。因此,如果您在另一个!important 下方使用!important,则第二个实例规则。

那里有一个更技术性的答案,但这就是我对!important 的看法。

另外请注意,如果您使用的是!important,您需要退后一步检查您是否做错了什么。 !important 表示您正在处理 CSS 级联。在极少数情况下,您应该使用!important

【讨论】:

  • 克里斯托弗奥特曼是正确的。看起来你在分号的错误一侧有 !important 错误......另外,你的第二个选择器根本没有选择 div ......它只是从那个选择器继承,这就是第一个选择器被使用的原因.
  • +1 最后一点——如果你经常使用!important,那么你可能做错了什么。
  • @zirak - 怎么样?您的第二个 CSS 选择器正在寻找一个 id="green" 的 div,这在您的示例中不存在。您到底想(但未能)证明什么?
  • 好的,把 id#green 改成 id#id。它不会变成红色。这就是我不明白的原因。
  • 如果在 id 和 class 之间添加一个空格,那么它将变为红色。它保持绿色的原因是因为div#id.classdiv#id 更具体。 Here is a link 到一个很好地解释了特异性的网站。我以前曾在 Stack Overflow 上看到过它的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多