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

Posted

技术标签:

【中文标题】CSS 否定伪类 :not() 用于父/祖先元素【英文标题】:CSS negation pseudo-class :not() for parent/ancestor elements 【发布时间】:2011-10-28 09:16:19 【问题描述】:

这让我发疯了:

HTML:

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

CSS:

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

这不是写着“选择所有具有不是div 元素的祖先的h1 元素...?”因此,“你好世界!”不应该是红色的,但它仍然是。

对于上述标记,添加子组合器可以:

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

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

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

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

【问题讨论】:

附带说明,当您使用任何其他类型的选择器时,您可以立即删除*,即:not(div),就像您指定.class#id 时一样*. 【参考方案1】:

这不是写着“选择所有具有不是div 元素的祖先的h1 元素...?”

确实如此。但在典型的 html 文档中,每个 h1 至少有两个不是div 元素的祖先元素——而这些祖先元素正是bodyhtml

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

在Selectors 4 中,:not() 已得到增强,可以接受包含组合器的完整复杂选择器,包括后代组合器。这是否会在快速配置文件(以及 CSS)中实现仍有待测试和确认,但一旦实现,您能够使用它来排除具有某些祖先的元素。由于选择器的工作方式,为了可靠地工作,必须对元素本身而不是祖先进行否定,因此语法看起来会有些不同:

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

任何熟悉 jQuery 的人都会很快指出this selector works in jQuery today。这是 a number of disparities between Selector 3's :not() and jQuery's :not() 之一,Selectors 4 试图纠正它。

【讨论】:

有什么解决方案可以用 Selectors Level 3 做类似的事情吗? @Alexandre D.:如果有的话,我会提到的。正如我所说,你能做的最好的事情就是“将样式应用于所有 h1 元素并用 div h1 覆盖它们。”【参考方案2】:

&lt;html&gt; 元素不是&lt;div&gt;&lt;body&gt; 元素不是 &lt;div&gt;

因此条件“有一个不是&lt;div&gt; 的祖先”对于所有元素都为真。

除非您可以使用&gt;(子)选择器,否则我认为您不能做您想做的事情——这没有任何意义。在您的第二个示例中,&lt;article&gt; 不是 div,因此也与 *:not(div) 匹配。

【讨论】:

"所有元素" 除了html 当然因为它是一个根元素,在这里并不重要:)

以上是关于CSS 否定伪类 :not() 用于父/祖先元素的主要内容,如果未能解决你的问题,请参考以下文章

学习记录2

CSS基础

css CSS三角形或胡萝卜。非常适合在以下组合中使用:after,:在伪类之前,用于向菜单的父元素添加指示符。

CSS3 选择器

在 SASS 嵌套中使用 ":not" 伪类

CSS结构伪类选择器