为什么#选择器的特异性比什么都小?

Dav*_*lix 10 css css-selectors css-specificity

大胆的大写锁定TL; DR:

我知道选择器的具体情况如何确定,我认为它使用了飞溅的假设,我可以用有效的理论关系来支持我的不满,请不要回答解释W3计算规则的具体情况,请仔细阅读问题 < - 阅读.

这让我困扰了一段时间,当我为某些HTML编写一个类似于下面的样式时:

...
<div id="outer">
    <span id="inner"></span>
    <span></span>
    ...
</div>
...
Run Code Online (Sandbox Code Playgroud)

为什么特异性规则会使选择器"#outer span"比"#inner"更具体?ID是唯一的,所以当我说"#inner"时,我只能指一个元素,为什么它不那么具体?我理解确定特异性的规则,我只是想知道这是故意的还是偶然的,如果有人知道如何向编写css标准的人提出这个问题.

我应该注意,我确实理解我可以使用#outer #inner来确保最大的特异性,但这似乎首先打败了ID的目的.当我编写模板时,这也是一个有问题的解决方案,我不确定一个ID是否会在另一个内部.我不是在找一个解决方法,只是一个理论答案.

我的问题是理论,完全基于集合逻辑.虽然我有,如果你为n个可能的项目中的1项定义一个规则,那么具体到你能去的那个吗?为什么CSS选择器的创建者会制定一个规则,可以定义n个可能项目的m个项目,其中m是n的子集,作为更具体的规则?

我的想法是#id将等同于按名称识别1个项目,而#id elm将根据名称与项目的关系来识别组.调用命名项比具有命名关系的未命名组更具特异性是完全违反直觉的.

Sco*_*ttS 9

我认为"为什么"的想法更像是"代际"或"权威"观点.如果#Parent(任何一代人回来)说我的所有符合资格"x"(在你的情况下span)的孩子将获得"y"(无论css属性)的继承,那么单个人#Child想要什么并不重要#Parent如果父母另有说明,它需要得到它的权限.

在编辑时添加:内联style将是反叛的孩子,以及!important破解父母.编辑:我保持这个幽默,但我不认为它反映了这个想法以及我后面的声明.

在评论中添加编辑问题:给定:

#outer span ...
#inner (which is a span element)
Run Code Online (Sandbox Code Playgroud)

然后帮助确保#inner选择我建议:

body span#inner (*edit:* just span#inner works *edit:* if defined later)
Run Code Online (Sandbox Code Playgroud)

或给身体一个身份和

#bodyId #inner
Run Code Online (Sandbox Code Playgroud)

当然,这些仍然可以被覆盖.涉及的"世代"越多,由于代际共识就越难以改变行为(如果伟大的爷爷和爷爷和父母都达成一致,那么孩子可能不会逃避做自己的事情) .

我不得不在以后的编辑中重写这一部分. 鉴于此HTML:

<div id="grandparent">
  <div id="parent">
    <div id="child"></div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我之前曾说过" #parent div拥有更大的权威#grandparent div.两者都具有世代权威,实际上是一个'平等'的代际权威,但第一个是'更接近'的一代"胜利.其中的错误是,"更接近"世代并不重要,而是最后获得权威.在权力相等的情况下,自己指定的最后一个是获胜者.

我相信我仍然可以坚持这样的观点:考虑到这一点,像#child [id]这样的选择器(它超过了之前的两个选择器)将其属性视为对更大权限的权限,以便对自己控制的权限进行规则.拥有#已经授予它权限,但是如果前一代还带有另一个选择器授予更多权限,则不足以覆盖前一代的#.

所以#grandparent div胜过#child但不是div#child 如果它是最后一次获得权威[加上这个],而不是#child[id]因为[id]#child为规则本身增加了更大的权威.如果等于选择性,则最后一个被授予权限获胜.

同样,style设置样式属性本身的属性实际上更像是对自己进行统治的最高权限,假设更多的东西!important不会消除它.

作为总结发言回答"为什么"是这样(而不是在"设置"理论线),我认为这是不是准确或者真的连特异性(虽然这是使用的术语),因为实际上然后人们所期望#ChildsName成为这个问题的最后一个独特的发言权,因为没有更具体的需要说.然而,相反,虽然文档可能没有这样说,但"选择性"实际上是在授予权限的基础上构建的.谁拥有最"权利"来统治这一要素,并给予"平局",谁是最后一个获得这些权利的人.

  • 我认为更像是使用#Parent赋予它世代权限,而#Child单独行动没有父母权限(自我权限),只要父母没有另外说明就可以这样做.换句话说,你,作者不是父,#Parent容器是.如果你,"局外人"想要命令#Child做什么,如果父母已经制定了可能相互矛盾的其他规则,你必须通过父母权限来做. (2认同)