假设您想在元素没有特定类时选择它。 这就是 :not()
选择器 的作用。
body:not(.home) {
}
但是,如果您要避免多个类,该怎么办?
:not()
没有逻辑组合符(如 and
或 or
),但您可以链式使用它们,这实际上等同于 and
。
body:not(.home):not(.away):not(.page-50) {
}
:not()
选择器本身不会添加任何特殊性,但内部内容会添加,因此 :not(.foo)
添加的权重与 .foo
相同。
很快,
:not
选择器也将能够接受一个要匹配的选择器列表。由于这与链式使用它们的行为相同,因此我们可能预计构建工具将来会自动在它们之间进行转换。
感谢您的信息!
感谢……我不知道这可行,现在正在尝试。
我认为不言而喻,但是拥有链式的 (:not) 似乎在逻辑上令人困惑。 如果检查了 2 个 :not,那么每个类都将被允许。 但是,此伪类显然在其中添加了一层额外的逻辑,以确保 :not 链式使用能够自觉地识别声明中的先前类。
好吧,无论如何,了解这些知识总归是有好处的!
您还应该提到,通过 选择器 4 规范(链接),我们可以在 :not() 函数中传递选择器列表。 例如
:not(h1, h2, h3)
在第一次阅读时,我发现 and/or 部分有点令人困惑,但这实际上是使用逻辑“and”来表示“or”:not(A or B) <=> not(A) and not(B)。 这也意味着您可以使用类似的构造将所有“or”(在 CSS 中用“,”表示)替换掉。
foo, bar { color: orange; }
与以下内容等效(除了特殊性)
:not(:not(foo):not(bar)) { color: orange; }
不确定这在任何上下文中是否有用(选择器列表可能不允许?)。
Kyle,它实际上不需要知道。 它们只是通过逻辑 and 链式使用。
当然,使用尚未广泛使用的级别 4 选择器(
body:not(.home, .away, .page-50)
)将更简单。天哪,我讨厌做反对者,但是 Can I Use :not() 确实让任何希望破灭。 我完全期望 IE11 不支持它(并且我有很多这样的用户),但即使是 Edge、Chrome 和 Firefox 也还没有支持。
这似乎是一个 Safari 独有的选择器……
需要明确的是,您只在谈论花哨的用逗号分隔的
:not(a, b, c)
样式。常规的
:not(a):not(b):not(c)
样式在所有地方都受支持。CSS3 选择器 :not() 受到广泛支持(包括 IE9+)。
只有 Saffari 支持列表参数,例如 :not(a, b, c)。
你吓死我了! 这只适用于 :not() 的选择器列表参数,也就是 :not(.a, .b, .c) 的东西。 直接使用 :not(.a) 就没问题,:not(.a):not(.b):not(.c) 也是可以的。
这只适用于多个选择器的列表,:not() 的基本实现可在大多数浏览器中使用。
能够在 :not() 中链式使用选择器尚未得到完全支持,但 :not() 本身是 https://caniuse.cn/#feat=mdn-css_selectors_not
我认为您可能在查看
:not() 的选择器列表参数
,它只在 Safari 中有效。 但:not
本身是 CSS3 选择器列表 的一部分,似乎在所有平台上都显示为绿色。因此,您可以在任何地方使用
:not()
,但我们现在可能要避免在选择器列表中使用它,如下所示。:not()
选择器中的选择器列表是 选择器 4 规范 的一部分。:not() 长期以来一直受到所有浏览器的支持。 没有理由不使用它。
我可以理解这将有多强大,但我有点犹豫要不要开始使用它。 这是否与使用
!important
存在同样的危险,因为您正在覆盖级联?在 CSS-Tricks 的首页上,我看到它在一些 a 标记上成功地使用了(网站看起来很棒)。 但是我不确定是否想覆盖像这样的东西,其中选择器(和属性)经常被覆盖。
a:not(.button):not(.commentPreviewButton):not(.comment-reply-link):focus, a:not(.button):not(.commentPreviewButton):not(.comment-reply-link):hover {
background: -webkit-gradient(linear,left top,right top,from(#ff8a00),to(#da1b60));
background: linear-gradient(to right,#ff8a00,#da1b60);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
-webkit-box-decoration-break: clone;
box-decoration-break: clone;
text-shadow: none;
}
我想我得看看代码,也许在他们的代码库中它更简单?
编写这篇文章时,我甚至没有想到那段特定的代码,但它提出了一个相当好的观点。 我无法控制
commentPreviewButton
和comment-reply-link
类。 它们来自 WordPress 核心或插件。 我可能可以编写过滤器来控制它们,但这是一种我宁愿不处理的技术债务。 我会选择在 CSS 选择器中接受技术债务,因为这是我的个人技能。 该选择器帮助我实现目标,即定位大多数链接,但避免一些根据类名指定的链接。是的,我认为我应该部分收回我对 !important 的看法——因为它不是不受控制的覆盖。 至少 :not 要求您指定。 它在这里的使用方式很有意义,尤其是在您无法控制某些环境(如 WordPress)的环境中,正如您所说。 但这可能更多的是例外而不是规则。
我在现实中遇到了别人的代码,他们不理解这个概念——更糟糕的是,在知名 CMS 的管理生产代码中。 代码是这样的:
……这简直是疯了。 如果存在第二个规则,则第一个规则是不必要的。 而第三条规则只会让你想知道这个世界将会变成什么样。
请谨慎使用 CSS 提供给您的力量。 在应用规则之前,请确保您了解这些规则。
AND 是链式使用的。 OR 是通过新的选择器实现的。