:not()是匹配不符合括号内条件的同级元素的结构伪类选择器,仅支持简单选择器,不能嵌套复合选择器或伪元素,其特异性不降低,常用于默认样式排除例外。
什么是
,它真能“排除”元素?
是一个结构伪类选择器,作用是匹配**不符合括号内条件的所有同级元素**。它不是“隐藏”或“删除”,而是让 CSS 规则跳过被排除的元素——这点常被误解为“不生效”,其实是选择逻辑没覆盖到目标。
关键限制:括号里只能填**简单选择器**(如
、
、
),不能写复合选择器(如
)或伪元素(如
)。Chrome 105+、Firefox 103+、Safari 15.4+ 支持完整语法;旧版 Safari 对属性选择器在
中的支持较弱。
常见错误写法与修正
这些写法会直接报错或失效:
→ 错误:逗号分隔多个选择器不被支持。应改写为
→ 错误:空格是后代选择器,
不接受。应写成
→ 错误:伪类链式调用不合法。可拆为
,但语义已变(排除的是既非 invalid 又非 focus 的元素)
用
模拟
,比如
→ 当前所有浏览器都不支持,
和
不能嵌套
真正实用的
场景
它最自然的用武之地是“默认样式 + 排除例外”,而不是强行构造复杂逻辑:
立即学习
“
前端免费学习笔记(深入)
”;
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
给所有按钮加统一边框,但去掉带
的:
表单中所有必填字段标红星,但跳过隐藏域:
列表项默认有下划线,最后一项除外:
(注意这里
是合法的,因为它是单一简单伪类)
禁用状态下不触发 hover 效果:
和
、
混用时的优先级陷阱
的权重跟它内部的选择器一致,但容易被忽略的是:它**不降低整体选择器特异性**。比如:
而下面这行看似更“宽松”,其实特异性更高(因为
内部的
拉高了整个选择器):
结果就是后者会覆盖前者,即使你本意是“补充规则”。实际项目中,除非明确需要叠加特异性,否则避免在
里混用
或
。
真正难处理的,从来不是语法对不对,而是当你在多层嵌套、多人协作的 CSS 文件里看到
这种写法时——它已经失去了可读性,也失去了维护价值。
:not():not().error[disabled]:checkeddiv p::before:not():not()li:not(.first, .last)li:not(.first):not(.last)button:not([type="submit"] [type="reset"]):not()button:not([type="submit"]):not([type="reset"])input:not(:invalid:focus)input:not(:invalid):not(:focus):not():has()div:not(:has(p)):has():not():not()class="icon"button:not(.icon) { border: 1px solid #ccc; }input:not([type="hidden"]):required + label::after { content: " *"; color: red; }nav a:not(:last-child) { border-bottom: 1px solid #eee; }:last-childbutton:not(:disabled):hover { opacity: 0.8; }:is():where():not()form input:not([type="hidden"]) { /* 特异性 = 0,1,1 */ }:is()#idform :is(input, textarea):not(:is([type="hidden"], #ignore)) { /* 特异性 = 0,2,1 */ }:not():is():where()div:not(.skip):not([data-ignore]):not(:has(> .excluded))