【发布时间】:2015-11-24 06:49:41
【问题描述】:
【问题讨论】:
-
body :not(.foo) li怎么样? -
body :not(.foo) li不工作
标签: css css-selectors
【问题讨论】:
body :not(.foo) li 怎么样?
body :not(.foo) li 不工作
标签: css css-selectors
它不起作用,因为您没有指定它是不能具有该类的确切元素。包含li 元素的ul 元素没有该类,因此与选择器的:not(.foo) 部分匹配。
确保:not(.foo) 部分仅适用于正确的元素,例如通过准确指定元素相对于列表元素的位置:
:not(.foo) > ul > li { background: red; }
<ul>
<li>11</li>
</ul>
<div class="foo">
<ul>
<li>22</li>
</ul>
</div>
【讨论】:
body 元素中(如示例中所示),则可以使用 body > :not(.foo) li。
我猜 css 选择器使用 OR 或 ORELSE 关系。因此,当您使用像 :not(.foo) li 这样的选择器时,会发生类似的事情:
statement1:首先它会检查:实际元素的标记名是li吗? (true)statement2_1:在第二位它会检查:最近的父母班不是.foo吗? (true)statement2_2:在下一个地方,它会检查下一个父类:下一个父类不是.foo (false)
理论上,以下语句的计算结果是:statement1 AND (statement2_1 ORELSE statement2_2)true AND (true ORELSE false) => true AND true = > true
如果你只是尝试其他方式怎么办:
li{
background-color: red;
}
.foo li{
background-color: initial;
}
<ul>
<li>11</li>
</ul>
<div class=foo>
<ul>
<li>22</li>
</ul>
</div>
【讨论】:
:not 伪类可以单独使用,不必附加到另一个选择器。 developer.mozilla.org/en-US/docs/Web/CSS/%3Anot
:not(.foo) li 选择器通过首先将元素与li 匹配来评估,如果匹配,则检查它是否具有匹配:not(.foo) 的父元素。由于最近的父 ul 匹配,它永远不会考虑 div。