[class$=" "] 和 [id*=" "] 有啥特殊性?

Posted

技术标签:

【中文标题】[class$=" "] 和 [id*=" "] 有啥特殊性?【英文标题】:What specificity does [class$=" "] and [id*=" "] hold?[class$=" "] 和 [id*=" "] 有什么特殊性? 【发布时间】:2015-06-15 22:17:48 【问题描述】:
[class$=" "]
[class*=" "]
[class^=" "]

以上所有内容(以及 ID 等效项)似乎都不遵循标准 CSS 特异性权重规则。

我制作了一个 Codepen 来展示它们是多么奇怪和矛盾。 http://codepen.io/mildrenben/pen/myYLmG

标记

<div id="wrap">
  <div class="container">
    <p> #idName is more specific than [id*="idName"]. But .className and [class*="className"] seem to be the same specificty.</p>
  </div>
</div>

CSS

#wrap 
  border: solid 5px green;


[id*="wrap"] 
  border: solid 5px red;


.container 
  background: red;


[class*="container"] 
  background: yellow;


p 
  font-family: sans-serif;
  padding: 6px;

谁能澄清这些选择器所具有的特异性权重?

谢谢

【问题讨论】:

specificity.keegan.st 的特异性计算器似乎表明它们与类的权重相同,我猜它们可以作为 pseudo-classes @Liam — 它们是属性选择器。伪类类似于:hover 谢谢@Quentin,我不确定 【参考方案1】:

#idName[id*="idName"] 更具体。但是.className[class*="className"] 似乎是同一个特性。

是的。这就是the spec says they should be。

统计选择器中 ID 选择器的数量 (= a)

统计选择器中类选择器、属性选择器、伪类的个数(=b)

你有一个 id 选择器、两个属性选择器、一个类选择器和一个类型选择器。

【讨论】:

值得补充的是,无论所讨论的属性如何,属性选择器的特异性总是相同的,因为选择器不对属性的文档语言语义做出任何假设。 id 属性恰好映射到 html 中的 id 选择器,这就是为什么 #idName[id=idName] 将匹配相同的 HTML 元素。【参考方案2】:

CSS特异性权重有四个部分,例如:0,0,0,0

id: 0,1,0,0 类、属性、伪类:0,0,1,0 元素,伪元素:0,0,0,1 “+”或“*”或“>”:0,0,0,0

例如

example1:  #header .container[name="1"] div    
example2:  #header div div div div div div div p p p h2::before   

example1_specificity = id + class + attribute + element = 0,1,2,1
example2_specificity = id + pseudo-class + element*11  = 0,1,1,11

特异性将从左到右比较四个部分,直到一个大于另一个,所以 example1_specificity 更大

专一性相同时,一个接一个获胜 !important 将赢得任何特异性 0,0,0,0 特异性将赢得继承

希望对你有帮助

【讨论】:

以上是关于[class$=" "] 和 [id*=" "] 有啥特殊性?的主要内容,如果未能解决你的问题,请参考以下文章

proxy-target-class="true" 和 proxy-target-class="false"

如何使用 type="radio" 和 class="btn-check" 从数据库中回显我的数据?

jquery 动态添加class属性

关于JQuery的add class方法和attr方法联系和区别?

id 和 class 有啥区别?

FIRApp 链接器错误 ["_OBJC_CLASS_$_FIRApp"]