DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 的免费积分!
CSS 中的 :not()
属性是一个否定伪类,接受一个 简单选择器 或选择器列表作为参数。 它匹配不包含参数中表示的元素。 传递的参数可能不包含其他选择器或任何伪元素选择器。
使用 选择器列表 作为参数的功能被认为是实验性的,虽然在撰写本文时,它的支持正在增长,包括 Safari(从 2015 年开始)、Firefox(从 2020 年 12 月开始)和 Chrome(从 2021 年 1 月开始)。
/* the X argument can be replaced with any simple selectors */
:not(X) {
property: value;
}
在这个例子中,我们有一个无序列表,在 <li>
上有一个类。
<ul>
<li></li>
<li class="different"></li>
<li></li>
</ul>
我们的 CSS 将选择所有 <li>
元素,除了 具有 .different
类别的元素。
/* Style everything but the .different class */
li:not(.different) {
font-size: 3em;
}
您也可以使用伪类来实现相同的效果,伪类被认为是 简单选择器。
p:not(:nth-child(2n+1)) {
font-size: 3em;
}
但是,如果我们使用伪元素选择器作为参数,它将不会产生预期结果。
:not(::first-line) { /* ::first-line is a pseudo element selector and not a simple selector */
color: white;
}
复杂选择器
这些 比基本 :not()
选择器更新。
/* select all <p>s that are not descendants of <article> */
p:not(article *) {
}
多嵌套一点,就会变得有点令人费解。 例如
h2:not(:where(article *, section *)) {
...
}
/*
<article>
<h2> No match! </h2>
</article>
<section>
<h2> No Match! </h2>
</section>
<aside>
<h2> Match! </h2>
</aside>
*/
可视化示例
特异性
:not
伪类的特异性是其参数的 特异性。 与其他伪类不同,:not()
伪类不会增加选择器特异性。
否定不能嵌套,因此 :not(:not(...))
不允许。 作者还应注意,由于伪元素不被认为是 简单选择器,因此它们不能作为 :not(X)
的参数。 使用属性选择器时要小心,因为一些属性选择器没有像其他属性选择器那样得到广泛支持。 将 :not
选择器与其他 :not
选择器链接是允许的。
浏览器支持
:not()
伪类已在 CSS 选择器级别 4 规范 中更新,以允许参数列表。 在 CSS 选择器级别 3 中,它只能接受单个简单选择器。 因此,浏览器支持在级别 3 和级别 4 草案之间略有不同。
简单选择器
IE | Edge | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|---|
9+ | 全部 | 全部 | 全部 | 12.1+ | 全部 |
Android Chrome | Android Firefox | Android 浏览器 | iOS Safari | Opera Mobile |
---|---|---|---|---|
全部 | 全部 | 全部 | 全部 | 全部 |
选择器列表
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。 数字表示浏览器从该版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
88 | 84 | 否 | 88 | 9 |
移动设备/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 127 | 9.0-9.2 |
感谢您介绍 :not() 选择器,并且像往常一样提供了有用的示例!
不过,我想指出,图片中
p:not(:nth-child(2n+1))
的示例有些模棱两可,可能会造成误导,至少没有明确的参考。该示例在查看您的演示页面时成立,其中<div class="f">
块的第一个子元素是<header>
元素,但任何没有查看演示页面的人可能会期望第二个和第四个元素被选中/显示为白色背景——因为示例选择器实际上是说:_选择任何_<p>
_元素,该元素不是奇数子元素_,而图片显示的是被选中的两个奇数元素。在图片“:not() 的各种用法的可视化表示”中,您不应该指向 2 和 4 个方框吗?
2n+1 是奇数。所以当你说 :not(odd) 应该导致目标为偶数。
我错了吗?
感谢这篇精彩的文章。但是,我想知道是否有一种方法可以识别我的 html 页面中的单个元素,该元素“不会”采用通用样式/css?“not”的作用是指定所有其他元素,而“不”指定参数中的元素。我只想要相反的效果。
<style>
.div-class p{font-weight: bold;}
.div-class p:not(.no-style){font-weight: normal;}
</style>
<div class="div-class">
<p>这应该为粗体。</p>
<p class="no-style">这应该不是粗体。</p>
</div>
我希望具有“no-style”类的“p”具有正常字体粗细。目前情况正好相反。我希望我已经说明白了。
谢谢,
@Pratip:只需使用直接的 css
您_不_想要具有该类的段落,但您_确实_想要具有 no-style 类的段落
一百万年后,但你也可以这样做
p:not(.no-style) { font-weight: bold }
太棒了,我不知道我要用它多少次。
关于类选择器是“简单选择器”的有效性......
正则表达式类选择器是否被认为是“简单的”?
我可以创建这样的选择器(使用任何特定且正确的语法)吗......
请注意,我之所以问,是因为此指定的规则不起作用(无法编译 SASS 3.3)。
考虑到 css 一直以来都很糟糕地指定了一个(非常基本的)规则引擎,我认为不是......但认为值得问一问。
.foo:not([class*=bar]){}; 也可以使用/ful!
只想指出
:not
确实可以根据规范进行链接html|*:not(:link):not(:visited)
§6.6.7 http://www.w3.org/TR/css3-selectors/#negation
我正在使用
它应该可以工作吗?
是的,它可以工作。
.foo:not(.bar, .baz, .qux)
在 CSS 中不起作用。
您可能正在使用 SCSS/SASS,它将其转换为
.foo:not(.bar):not(.baz):not(.qux)
我遇到的最大问题是,每次添加 :not 时,它的特异性都会增加
你说得对,Bernard Skibinski!
在简单的搜索博客中使用您的示例,而不是数据库。
http://codepen.io/anon/pen/bdaaRm
请原谅我的英语。
该死......这个 :not 伪元素是反向创建的......
这......
li::before{content:”●”}
li::before:not(.menu-item){content:none}
与......相同
li::before{content:”●”}
li.menu-item::before{content:none}
我认为这个元素制作得很好......以下是一个示例
li::before, li::before:not(.menu-item) {content:”●”}
这应该是 :not() 的工作方式!
最后一个示例表明......每个 li 元素都将具有 {content:”●”},除了 .menu-item..
但我仍然看到相同的结果......我已经尝试了无数种方法,但无法使其工作......如果我错了,请告诉我 :)
此规则
li::before, li::before:not(.menu-item) {content:”●”}
表示“每个 li 以及每个不是 .menu-item 的 li 都应该具有内容 ●”。
我认为您需要这样
li::before:not(.menu-item) {content:”●”}
感谢您的帮助,我非常感谢 :) 但是正如我所说,
li::before:not(.menu-item) {content:”●”} (与)相同
li::before(.menu-item) {content:none} (并且这个更短)
我想要按照您最初所说
“每个 li 以及每个不是 .menu-item 的 li 都应该具有内容 ●”
但它对我来说不起作用......
查看此处的“错误用法”部分:http://callmenick.com/post/the-css-not-selector
:not() 选择器不适用于 :before 之类的伪元素。尝试改为这样编写
这是一个很好的方法,我认为我还没有尝试过......
但它仍然不起作用,无论如何,谢谢 :)
顺便说一下,这篇文章很不错,简洁易懂!
你好! 你好吗?
我很好,谢谢!
再见
另一个有用的选择(尤其是在设置你期望被类覆盖的默认值时)是:not([class])。它只在元素没有分配任何类的情况下对元素进行样式化。 :)
我认为这里遗漏了一些东西
我最近了解到,你实际上会因为“参数特异性继承”的问题而被困住
.foo:not(#bar)
将具有 0,1,1,0 的特异性。换句话说,你现在已经赋予了一个类 ID 的特异性。
有人可能会这样做并不太可能。但是,我今天遇到的一个用例是
你根本不会期望这种结果。至少我不会。但它发生了,因为
:not()
继承了特异性。所以我有一个特异性为 0,0,2,0 的规则集覆盖了特异性为 0,0,1, 3 的规则集。这里有一些关于这种现象的文档证明
http://codepen.io/paceaux/pen/mEoAxg
故事的寓意是,“你传递给
:not()
的参数应该比它所链接到的参数特异性更低。我正在使用代码将图标添加到外部链接。
我的问题是
如何更改此代码,以便任何包含 < img > 的链接都不会显示外部图标?
例如:< a >< img >< /a >
@ ryan
你可以使用这个。它等同于 - 任何 href 属性以“.jpg”、“.gif”、“.png”结尾的 a 标签。只需添加或删除你需要的任何图像文件类型。
如何在以下情况下应用:not
这应该加粗。
这应该加粗。
这应该加粗。
这不应该加粗。
我想使用 .menu 类设置相同的背景颜色,但同时我不想将相同的颜色应用于 hidden-menu 类。
谢谢,
我想知道为什么
.container > *:not(.someclass:first-child){ background:red }
不起作用,而...
.container > *:not(:first-child){ background:red }
起作用。
只在 FF 中尝试过,但这应该起作用,不是吗?
尝试 container > *:not(.some class):not(:first-child),你应该在链接 not 而不是在 not 内链接选择器时获得更好的运气
我认为“:not()”选择器确实会增加特异性。
这是来自 2020 年的 MDN 页面。
这在内容中也有所体现。并不是说特异性没有改变,而是特异性是由其参数中最高特异性决定的。
如果有人像我一样挣扎,这里有一个链接的例子
我试图这样做
我不知道逗号分隔的:not 选择器是无效的。
这应该添加到文章的特异性部分。
它是有效的 CSS。这之前也让我很困惑,但你必须像 CSS 一样思考,把它读作
:not(.someClass)
,它在技术上允许.anotherClass
,然后进一步读作:not(.anotherClass)
,它允许.someClass
。通过将它们组合在一行中,你是在说“不是 .someClass 并且不是 .anotherClass”,而不是其中一个或另一个(这基本上会互相抵消)。我很少看到有人提到
:not()
的用处,因为它可以保留你可能事先不知道值的元素的原始样式。当你将实用程序类应用于可能具有任何显示类型的元素时,这很有用。基本上,不是这样...
...我们可以隐藏父元素没有悬停时的元素,而无论何时悬停,下面的规则都会变得无效,它所附加的元素将采用其正常的显示值。现在你的表格将不会像上面的例子那样设置
display:block
。我在这里使用display:block
,因为这似乎是显示/隐藏元素时最常见的属性(none
和block
)。