css:not(),选择器和选择后代

Asi*_*sim 5 css

可以说我有:

            <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”的元素)。

Jon*_*Jon 6

规范说,你可以有任何简单的选择里面:not,其中

一个简单的选择器可以是类型选择器,通用选择器,属性选择器,类选择器,ID选择器或伪类。

所以是的,您不能有子代选择器:not(X Y)。还有一个问题是,在使用后代选择器时,您只能表示正数(“当X的祖先包括Y时”)而不能表示负数(“当X的祖先包括Y时”);

最实用的解决方案是反转 CSS逻辑,以便您要表达的否定词变为肯定词:

.ds .para { background:gold; }
.para { background: green }
Run Code Online (Sandbox Code Playgroud)

看到它在行动


Ale*_*lov 4

类为“para”的元素(不包括类为“ds”的元素的直接子元素)为:

*:not(.ds) > .para
Run Code Online (Sandbox Code Playgroud)

  • 不会像现在这样工作。其层次结构中的任何其他元素都将与它匹配。它只适用于“&gt;”。 (3认同)