CSS伪类:not()可以嵌套使用吗,如何嵌套?

星伟姑娘_7103

星伟姑娘_7103

2026-07-20

536人浏览

原创

:not() 不支持嵌套,因参数必须为简单选择器,:not(:not(.active))等写法语法非法,现代浏览器直接忽略整条规则;排除多个类应使用多:not()串联,如button:not(.primary):not(.danger)。

css伪类:not()可以嵌套使用吗,如何嵌套?

:not() 嵌套写法直接无效,浏览器会忽略整条规则

不是“不推荐”,而是语法非法 —— :not(:not(.active)) 这类写法在 Chrome 100+、Firefox 95+ 等现代浏览器里会被当作无效选择器直接丢弃,开发者工具中该 CSS 规则会灰掉,像被注释了一样;document.querySelector(':not(:not(.x))') 返回 null,连控制台警告都不会触发。

根本原因在于::not() 的参数必须是「一个简单选择器」(simple selector),而 :not(.active) 本身已是函数式伪类,属于复合结构,不能作为另一个 :not() 的参数。

  • :not(.a) ✅ 合法:参数是类选择器
  • :not([disabled]) ✅ 合法:参数是属性选择器
  • :not(:hover) ✅ 合法(Level 3 支持):参数是伪类
  • :not(:not(.a)) ❌ 无效:参数本身是函数,违反简单选择器约束
  • :not(.a:not(.b)) ❌ 无效:内部含伪类嵌套,解析失败

想排除多个类?用多:not()串联,不是嵌套

要选“既不是 .primary 又不是 .danger”的按钮,得写成 button:not(.primary):not(.danger),而不是 button:not(.primary, .danger)(后者在 Level 3 不合法,Level 4 才支持逗号分隔)。

注意:多个 :not() 是“且”关系,不是“或”。li:not(.first):not(.last) 排除的是同时不含这两个类的 li;如果某个 li 同时有 .first 和 .last,它仍会被排除 —— 因为它满足任一 :not() 的否定条件(即“不是 .first”为假,“不是 .last”也为假,整条链失效)。

CSS婚礼策划服务机构宣传网站模板
CSS婚礼策划服务机构宣传网站模板

CSS婚礼策划服务机构宣传网站模板是一款适合提供婚礼策划和婚庆服务机构宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。

下载
  • ✅ 正确写法:a:not(.skip):not([data-ignored])
  • ⚠️ 容易误解:a:not(.skip, [data-ignored]) —— Level 3 下语法错误;Level 4 虽支持,但需确认目标浏览器兼容性(Safari 15.4+、Chrome 102+)
  • ❌ 错误目标:a:not(.skip):not(:not([data-ignored])) —— 第二个 :not() 嵌套,整条无效

Level 4 的 :not(selector, selector) 不是嵌套,是参数扩展

所谓“CSS Selectors Level 4 支持多参数”,指的是 :not() 的括号内可接受逗号分隔的选择器列表,例如 :not(.a, .b, :disabled)。这仍是单层结构,不是嵌套 —— 它等价于逻辑“非(.a 或 .b 或 :disabled)”,浏览器内部按 OR 合并后取反。

但要注意兼容边界:

  • 这个语法在 Safari 中直到 15.4 才完整支持,旧版 Safari 会静默忽略整条规则
  • :not(div, p) 合法,但 :not(div p) 依然非法(含空格的组合选择器不被允许)
  • 优先级不变::not(.a, .b) 的 specificity 仍是 0-1-0,和 :not(.a) 一样

替代嵌套的真正可行方案

当你要表达“排除带 A 类但不带 B 类的元素”这类复杂逻辑时,:not() 无能为力 —— 它无法做条件组合判断。此时只能换思路:

  • 加 wrapper 类,把作用域收窄,比如用 .form-body input:not([disabled]) 替代试图在全局筛“非禁用且非隐藏”
  • 用更具体的选择器覆盖,例如先写 input { border: 1px solid #ccc; },再写 input[disabled], input.hidden { border: none; }
  • JS 动态加 class 控制,尤其涉及状态联动(如 :hover + :focus 组合排除)时,CSS 本身已超出能力范围

最常被忽略的一点::not() 的匹配发生在样式计算阶段,它不感知 DOM 变化时机。比如 div:not(:has(> img))(需 :has() 支持)看似能动态排除,但若图片是 JS 异步插入,首次渲染时该 :not() 就已固化结果,后续不会重算。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

4456

6

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

977

5

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.28

1838

6

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

2023.08.01

3486

7

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

2023.08.10

6985

11

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

2023.08.10

5931

7

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

2023.08.21

2017

9

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

2023.08.22

2831

5

css禁止点击事件
css禁止点击事件

实现css禁止点击事件的方法有使用CSS的pointer-events属性和使用JavaScript禁用点击事件。本专题为大家提供点击事件相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2453

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.9万人学习

CSS教程
CSS教程

共754课时 | 96.8万人学习