父/祖先元素的CSS否定伪类:not()


76

这让我发疯:

HTML:

<div><h1>Hello World!</h1></div>

CSS:

*:not(div) h1 { color: #900; }

这不是读到“选择所有h1祖先不是div元素的元素吗?”。因此,“ Hello World!” 不应显示为红色,但仍然是。

对于上述标记,添加子组合器的工作原理是:

*:not(div) > h1 { color: #900; }

但是,h1如果它不是div元素的子元素,则不会影响元素。例如:

<div><article><h1>Hello World!</h1></article></div>

这就是为什么我想将h1元素表示为元素的后代而不是子div元素。任何人?


6
附带说明一下,当您使用任何其他类型的选择器时,都可以立即删除*,即:not(div),就像您指定.class#id不指定一样*
BoltClock

Answers:


85

这不是读到“选择所有h1祖先不是div元素的元素吗?”。

是的 但是在一个典型的HTML文档中,每个 h1人至少都有两个不是div元素的祖先,而这些祖先就是bodyand html

这是尝试使用来过滤祖先的问题:not():只是无法可靠地工作,尤其是当:not()不能被其他选择器(例如类型选择器或类选择器)限定时.foo:not(div)。只需将样式应用于所有h1元素并用覆盖它们,您将拥有更加轻松的时间div h1

选择器4中:not()已进行增强,可以接受包含组合器(包括后代组合器)的完整复杂选择器。这是否会在快速配置文件来实现的(因而CSS)仍有待检验和证实,但一旦得以实施,那么你可以使用它来排除某些祖先元素。由于选择器的工作方式,必须对元素本身(而不是祖先)进行取反才能可靠地工作,因此语法看起来会有些不同:

h1:not(div h1) { color: #900; }

任何熟悉jQuery的人都会很快指出,该选择器现在可以在jQuery中使用。这是选择器3:not()与jQuery之间的众多差异之一,选择:not()器4试图纠正这一差异


有什么解决方案可以对Selectors Level 3进行类似的处理吗?
Alexandre D.

1
@Alexandre D .:如果有,我会提到它。正如我已经说过的,您能做的最好的事情就是“将样式应用于所有h1元素,并用div h1覆盖它们”。
BoltClock

16

<html>元素不是<div>。该<body>元素不是<div>

因此,条件“祖先不是<div>”对于所有元素都是正确的。

除非您可以使用>(child)选择器,否则我认为您无法做您想做的事情-这真的没有意义。在您的第二个示例中,<article>不是div,所以也匹配*:not(div)


3
“所有元素”html当然除外,因为它是一个根元素,在这里并不重要:)
BoltClock
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.