可以说我有:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test for :not</title>
<link rel="stylesheet" type="text/css" href="Test.css" />
</head>
<body>
<div class="a">
<p class="para">This line should be green.</p>
</div>
<div class="a">
<p class="para">This line should also be green.</p>
<div class="ds">
<p class="para">This is another line that should be yellow</p>
</div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我想做的是选择所有带有class =“ para”的元素,但不包括那些具有class =“ ds”的元素的后代。我有这个CSS:
.ds { color: grey; border-style:solid; border-width:5px;}
.para {color:yellow;}
.para:not(.ds .para) {color:green; border-style:solid; border-width:5px;} //not working
Run Code Online (Sandbox Code Playgroud)
所以我假设我只能有简单的选择器作为:not(S)的一部分,而我不能有:not(XY)。我同时在Chrome(18.0.1025.162 m)和Firefox(10)中运行。有任何想法吗?
注意:请不要因为查询是更大问题的一部分,所以我有一些代码(以gwt为单位)正在从dom中选择元素列表(例如,带有class =“ para”的元素)。但是我发现了一个错误,该错误要求排除属于特定元素集的后代元素(例如,具有class =“ ds”的元素)。
该规范说,你可以有任何简单的选择里面:not,其中
一个简单的选择器可以是类型选择器,通用选择器,属性选择器,类选择器,ID选择器或伪类。
所以是的,您不能有子代选择器:not(X Y)。还有一个问题是,在使用后代选择器时,您只能表示正数(“当X的祖先包括Y时”)而不能表示负数(“当X的祖先不包括Y时”);
最实用的解决方案是反转 CSS逻辑,以便您要表达的否定词变为肯定词:
.ds .para { background:gold; }
.para { background: green }
Run Code Online (Sandbox Code Playgroud)
类为“para”的元素(不包括类为“ds”的元素的直接子元素)为:
*:not(.ds) > .para
Run Code Online (Sandbox Code Playgroud)