逻辑意图
下面是问题中最初发布的 CSS 选择器的细分。这是试图总结如何使用有效的 CSS 来表达这两个 CSS 规则(由@thgaskell 和@BoltClock 发起的讨论)。我将把具体问题留给其他海报。
第一条规则
input:not([type="text"],[type="password"],.someClass) {}
这是 CSS3 中的非验证选择器,目前可能不被任何已知浏览器支持。
选择器的逻辑意图是!(a or b or c)
,相当于!a and !b and !c
. 对于 CSS 选择器,逻辑and
操作需要链接,可以表示为:not(a):not(b):not(c)
.
因此,第一条规则可以用有效的 CSS 表示如下:
input:not([type="text"]):not([type="password"]):not(.someClass) {}
第二条规则
input:not(#someId[type="text"]) {}
这是 CSS3 中的非验证选择器,目前可能不被任何已知浏览器支持。
选择器的逻辑意图是!(a and b)
,相当于!a or !b
. 对于 CSS 选择器,逻辑or
操作需要使用多个选择器(每个操作数一个选择器),可以表示为:not(a), :not(b)
.
因此,第二条规则可以用有效的 CSS 表示如下:
input:not(#someId), input:not([type="text"]) {}
概括
逻辑and
运算需要链接每个操作数。
.a.b {} /* Matches elements with both classes */
/* (a and b) */
:not(.a):not(.b) {} /* Matches elements with neither class */
/* (!a and !b) == !(a or b) */
逻辑or
操作需要使用多个选择器(每个操作数一个选择器)。
.a, .b {} /* Matches elements with either class */
/* (a or b) */
:not(.a), :not(.b) {} /* Matches elements that don't have both classes */
/* (elements with none or only one of the classes) */
/* (aka: not both, nand, alternative denial */
/* (!a or !b) == !(a and b) */