我正在尝试使用:not()
选择器更改某种类型的所有元素的属性(在示例中为 <p>
(,除了那些是具有特定类的任何元素的直接子元素(在示例中为 test
(的属性。
我的问题是,当每个<p>
元素都嵌套在不同数量的元素中时,我无法使其工作,如示例中所示。
我的问题基本上归结为以下行中的通配符:
body * :not(.test) p {
似乎我需要一个通配符,它不仅代表一个随机元素,而且代表未知数量的随机元素。CSS中存在这样的事情吗?(请注意,我无法在实际情况中编辑 HTML,或者除了 CSS 之外的任何内容(
JSFiddle 示例(Foo
应保持黑色(
body * :not(.test) p {
color: blue;
}
<div>
<span>
<tr>
<span class="test">
<p>Foo</p>
</span>
</tr>
<div>
<tr>
<li>
<p>Bar</p>
</li>
</tr>
</div>
<p>FooBar</p>
</span>
</div>
我正在尝试通过使用
:not()
选择器更改某种类型的所有元素(在示例中为<p>
(的属性,除了那些是具有特定类的任何元素(在示例中为.test
(的直接子元素的属性。
既然你说的是直接子运算器,你只需要添加子运算器(>
(:
body * :not(.test) > p
您在原始代码中使用了后代组合器:
body * :not(.test) p
这对于保持.test
p
子元素为黑色不起作用,因为p
也是其他(非排除(元素的后代,例如tr
和body
。因此,:not(.test)
尝试失败,因为它仅涵盖几种匹配可能性之一。
但是,当您从后代切换到只是子代时,在这种情况下,可能性缩小到只有一个匹配项。