CSS 选择器 `:enabled` 与 `not(:disabled)` 有区别吗

Is there a difference in CSS selectors `:enabled` vs `not(:disabled)`

使用 CSS3 选择器 :enablednot(:disabled) 在行为或浏览器支持方面是否存在差异?

我希望它们在功能上是相同的,因为它们都是 CSS3 选择器,浏览器支持也应该是相同的。

是的,有区别 — :not(:disabled) 可以匹配 既不是 :enabled 也不是 :disabled 的元素。这些是 enabled/disabled 语义根本不适用的元素,例如 divpul

spec 证实了这一点:

What constitutes an enabled state, a disabled state, and a user interface element is language-dependent. In a typical document most elements will be neither :enabled nor :disabled.

有趣的是,对于 :checked 却不是这样——没有对应的 :unchecked 伪 class,尽管并非所有元素都具有 checked/unchecked 语义。请参阅我对 this question.

的回答

如果您使用类型选择器(例如 inputselecttextarea)或 class 选择器,你可能不必担心这个。不过,使用 :enabled:not(:disabled).

更有意义

浏览器对大多数 3 级伪 classes 的支持确实是相同的 — 没有已知的浏览器仅支持 :enabled:disabled。然而,根据 MDN,它看起来像 Opera 9.0 和 Safari 3.1 don't support :not(), although they do support :enabled and :disabled,并且 IE7 支持一些其他功能,如子字符串匹配属性选择器和通用兄弟组合器 ~,但有一些问题和一点点在 IE8 中更好。