了解 CSS 选择器优先级/特异性

Posted

技术标签:

【中文标题】了解 CSS 选择器优先级/特异性【英文标题】:Understanding CSS selector priority / specificity 【发布时间】:2011-05-03 14:37:49 【问题描述】:

我想了解 CSS 选择器如何处理属性冲突。如何选择一个属性而不是另一个属性?

div 
  background-color: red;


div.my_class 
  background-color: black;


div#my_id 
  background-color: blue;


body div 
  background-color: green;


body>div 
  background-color: orange;


body>div#my_id 
  background-color: pink;
<div id="my_id" class="my_class">hello</div>

选择器优先级如何工作?

【问题讨论】:

w3.org/TR/CSS2/cascade.html#specificity 【参考方案1】:

我将提供一个指向 CSS 2.1 规范本身的链接,以及浏览器如何 计算特异性:

CSS 2.1 Section 6.4.3:

选择器的特异性计算如下:

如果声明来自是'style'属性而不是带有选择器的规则,则计数1,否则为0(= a)(在HTML中,元素的“style”属性的值是样式表规则。这些规则具有没有选择器,因此 a=1、b=0、c=0 和 d=0。) 统计选择器中 ID 属性的数量 (= b) 统计选择器中其他属性和伪类的数量 (= c) 计算选择器中元素名称和伪元素的数量 (= d) 特异性仅基于选择器的形式。特别是,“[id=p33]”形式的选择器被算作属性选择器(a=0, b=0, c=1, d=0),即使 id 属性被定义为“ID " 在源文档的 DTD 中。

连接四个数字 a-b-c-d(在具有大基数的数字系统中)给出了特异性。

如果特异性相同,则CSS 2.1 Section 6.4.1 发挥作用:

    最后,按指定顺序排序:如果两个声明具有相同的权重、来源和特异性,则指定的后者获胜。导入样式表中的声明被认为在样式表本身的任何声明之前。

请注意,这里讨论的是何时定义样式,而不是何时使用。如果类.a.b 具有相同的特异性,则以样式表中最后定义的 为准。根据.a.b 的定义顺序,<p class="a b">...</p><p class="b a">...</p> 的样式将相同。

【讨论】:

迄今为止最好的解释:link 当您向下滚动到“计算 CSS 特异性值”部分时,它开始变得非常有趣。 但是当两个特异性值相同时会发生什么?它是否遵循首先定义的规则? w3.org/TR/CSS2/cascade.html#cascading-order 涵盖了这一点,特别是规则 4,它适用于特定性之后。我将编辑答案以包括打破平局。 @Boom :如果有多个相同的特异性规则,则应用样式表中出现的最后一个规则。希望这会有所帮助。【参考方案2】:
    元素 类选择器 ID 选择器 内联样式 !重要

按顺序,1 是最低的特异性,5 是最高的。 https://youtu.be/NqDb9GfMXuo 将显示详细信息以进行演示。

【讨论】:

【参考方案3】:

你感兴趣的是specificity。

Firebug 是一个很好的工具来帮助检查这一点。但其他浏览器也内置了用于检查应用的 CSS 规则的工具。

【讨论】:

Firebug 是否有特定的(没有双关语)工具来分析特异性?不仅仅是覆盖规则的删除线视图? @Pekka,不,它没有。不过对于这些类型的事情来说仍然是一个很好的工具。 @Pekka 在 HTML 选项卡的右侧,Calculated (?) 选项卡(在样式和外观之间)有另一个覆盖指令的删除视图。当您只对 ONE 属性感兴趣时,可能比您所指的 Style 中的那个更有用。【参考方案4】:

您可以在此处参考完整答案Mozilla documentation

从最具体的开始: id 选择器 > 类选择器 > 类型选择器(普通 h1、p 标签等..) !important 总是会获胜,但这被认为是一种不好的做法。请参阅上面的链接。

最好的方法是尝试一下:

  <!-- start class vs id -->
  <p class="class1" id="id1">.class vs #id: The winner is #id</p>

  <!-- upper vs bottom -->
  <p id="id2">the very bottom is the winner</p>

  <!--most specific is the winner -->
  <p id="id3">the most specific</p>

  <!--pseudo and target selector -->
  <h3>pseudo vs type selector</h3>

  <!-- !important is more important! -->
  <h1 id="very-specific">HI! I am very important!</h1>
  </body>

CSS:

#id1
    color: blue;


.class1
    color: red;


#id2
    color: yellow;


#id2
    color : green;


body p#id3
    color :orange;


body p
    color : purple;


body
    color : black;


h3::first-letter 
    color: #ff0000;



h3
    color: CornflowerBlue ; 


h1
    color: gray !important;


body h1#very-specific
    color: red;

Here's 一个测试用例。

【讨论】:

以上是关于了解 CSS 选择器优先级/特异性的主要内容,如果未能解决你的问题,请参考以下文章

了解特异性:在不使用 !important 的情况下实现所需的选择器结果 [重复]

嵌套 CSS 选择器而不增加特异性

根据选择器特异性排序 CSS

css选择器

可以重复类型选择器以增加特异性吗?

:not 伪类是不是增加了选择器的特异性?