:not()select器在Safari和Chrome / Firefox之间行为不一样
我很难弄清楚为什么下面的代码在Safari中呈现蓝色,而在Chrome和Firefox中呈现为红色。
em:not(div) { color: red } em:not(p div) { color: blue }
<p> <em>FOO</em> </p>
https://jsfiddle.net/hzcLpf9L/
显然,它看起来像铬和Firefox不支持:not()
CSSselect器中有多个级别。 (可能的错误?)
我非常喜欢:not()
select器,我用Safari开发,所以当我在Chrome上发现我的网站时,我几乎心脏病发作。 为什么这种奇怪的行为发生任何解释将不胜感激。
Safari最近发布了:not()
4级版本 ,它允许复杂的参数select器,使之与jQuery迄今为止的非标准实现一致 。 请参阅发行说明 (链接到与实施不匹配的较早版本的草稿 – 实施将在2015年前后进行)。 当前版本:not()
只允许一个简单的select器作为参数,所以像p div
这样的复杂select器在今天的浏览器中是不能工作的。
一个复杂的select器是一个由一个或多个复合select器组成的expression式,由诸如后代, >
, ~
和+
等组合器分隔。 复合select器是一个或多个简单select器的序列。 div
是一个复合select器,由一个简单的select器组成, p div
是一个复合select器,由两个复合select器(每个由一个简单的select器组成)由一个后代组合器分开。
目前还不清楚这种方式何时会在其他浏览器中出现,尽pipe在这一点上:not()
的新规范不太可能发生变化 – 目前的4级定义是不容易的,如果原始的WebKit应变足够大要实现它,那么在进入其他菌株(包括Blink)之前真的只是一个时间问题。
经过FPWD几乎等了五年的等待,我们可能最终会很快看到select器4的CR。 考虑我抽水。
从规格 :
否定伪类:not(X)是一个函数表示法,它将一个简单的select器 (不包括否定伪类本身)作为参数。 它代表了一个没有被其论证所代表的元素。
和规范中的其他地方 :
一个简单的select器是一个typesselect器,通用select器,属性select器,类select器,IDselect器或伪类。
Chrome和Firefox的行为是正确的。 后代组合子可能不会出现在一个简单的select器中(因此,a:不是伪类)
这可能在select器级别4中改变。当前编辑器的草稿允许更复杂的select器。 您似乎遇到了一个实验性的实现。