: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器。 您似乎遇到了一个实验性的实现。