[6] [DFN[[CODE(CSS)@en[[[:not()]]]]]] [[擬似クラス]]は[[否定]]を表します。

* 仕様書

[REFS[
- [7] [CITE@en[Selectors Level 3]] ([TIME[2011-09-29 22:16:17 +09:00]] 版) <http://www.w3.org/TR/selectors/#negation>
]REFS]

* 意味

[8] [CODE(CSS)@en[[[:not()]]]] は引数によって表されない[[要素]]を表します [SRC[>>7]]。

* 引数

[9] 引数には[[単純選択子]]をちょうど1つだけ指定できます。ただし [CODE(CSS)@en[[[:not()]]]]
自体を入れ子にすることはできません。 [SRC[>>7]]

[10] 引数は[[単純選択子]]1つであって、[[単純選択子列]]ではありません。

[EG[
[11] 従って、
[PRE(CSS bad example code)[
:not(.hoge.fuga)
]PRE]
... は認められていません。
]EG]

[EG[
[12] また、[[単純選択子列]]の場合とは異なり、暗黙の[[普遍選択子]]は存在しません。
従って[[普遍選択子]]に対する[[既定名前空間]]の適用の影響も、もちろんありません。例えば
[PRE(CSS example code)[
@namespace 'http://hoge/';
*|*:not(.foo)
]PRE]
... は [CODE(URI)[http://hoge/]] のすべての [[class属性]]が [CODE(CSS)[foo]] の[[要素]]以外''ではなく''、
''すべての[[名前空間]]''のすべての [[class属性]]が [CODE(CSS)[foo]] の[[要素]]以外を表しています。
]EG]

* 特異度

[13] [CODE(CSS)@en[[[:not()]]]] [[擬似クラス]]は他の[[擬似クラス]]と違ってそれ自体は[[特異度]]の計算に含まれません。
[[引数]]として指定された[[単純選択子]]は計算に含まれます。

* 歴史

** 選択子3

[REFS[
- [14] [CITE@en[CSS3 module: W3C Selectors]] ([TIME[2001-01-29 23:57:00 +09:00]] 版) <http://www.w3.org/TR/2001/WD-css3-selectors-20010126/#negation>
]REFS]

[15] >>14 で [CODE(CSS)@en[[[:not()]]]] が追加されました。この前の版まで、 [CODE(CSS)@en[[[:first-child]]]]
に対して [CODE(CSS)@en[[[:not-first-child]]]] など、一部の[[擬似クラス]]だけ否定形が別個に定義されていましたが、
[CODE(CSS)@en[[[:not()]]]] の導入によりそれらは削除されています。

* 実装

[1]
[[Firefox]] 2 は 
[PRE(CSS bad example code)[
*:not() { }
]PRE]

のように[[引数]]がないと、勝手に[[普遍識別子]]
[CODE(CSS)@en[[[*]]]] を補うようです。ですが、
[PRE(CSS bad example code)[
:not() { }
]PRE]

のように[[単純選択子列]]の唯一の構成要素が [CODE(CSS)@en[:[[not]]()]]
だと、不正な[[選択子群]]として無視するようです。
(前でも後でも、他の[[単純選択子]]や[[擬似要素]]が指定されていればおk。[[引数]]が指定されていれば唯一の[[単純選択子]]であってもおk。
[CODE(CSS)@en[:[[not]]():[[not]]()]] は''だめ''ですが、
[CODE(CSS)@en[:[[not]](*):[[not]]()]] や
[CODE(CSS)@en[:[[not]]():[[not]](*)]] ならおk。)
([[名無しさん]])

[2]
>>1 無視すると書きましたが、[[選択子]] (や[[選択子群]]) の最初の[[単純選択子]]が
[CODE(CSS)@en[:[[not]]()]] の場合は[[宣言ブロック]]ごと無視され、
[[選択子]]の2つ目以降かつ最後の[[単純選択子列]]が
[CODE(CSS)@en[:[[not]]()]] の場合にはその[[単純選択子列]]の存在だけが無視され、
[[選択子]]の2つ目以降かつ最後で''ない''[[単純選択子列]]が
[CODE(CSS)@en[:[[not]]()]] の場合にはその[[宣言ブロック]]全体が無視されます。
([[名無しさん]])

[3]
[[選択子]]仕様書では [CODE(CSS)@en[:[[not]]()]] は特別な[[字句]]
[CODE(CSS)@en[[[NOT]]]] として定義されています。
([[名無しさん]])

[4]
>>3 ですが、 [[Firefox]] 2 は特別扱いしていないようです。
[CODE(CSS)@en[[[not]](]] の部分は [CODE(CSS)@en[[[FUNCTION]]]]
と解釈しているようです。
[REFS[
- <http://suika.fam.cx/gate/2007/cssom/viewer?c=%3A%2F**%2Fnot(a)%20%7B%7D;h=;p=n;x=style-element>
([CODE(CSS example)@en[:/**/not(]])
- <http://suika.fam.cx/gate/2007/cssom/viewer?c=%3A%5Cnot(a)%20%7B%7D;h=;p=n;x=style-element>
([CODE(CSS example)@en[:\not(]])
- <http://suika.fam.cx/gate/2007/cssom/viewer?c=%3An%5C4f%20t(a)%20%7B%7D;h=;p=n;x=style-element>
([CODE(CSS example)@en[:n\4f t(]])
]REFS]

[5]
>>4 の例は[[字句]]的に [CODE(CSS)@en[[[NOT]]]] ではなく、
[CODE(CSS)@en[[[FUNCTION]]]] であるとしても (一応)
[[選択子]]仕様書の構文に適合しますが、これはそうではありません:
[REFS[
- <http://suika.fam.cx/gate/2007/cssom/viewer?c=%3A%2F**%2Fnot(%3Alink)%20%7B%7D%0A;h=;p=n;x=style-element>
]REFS]

[16] >>4, >>5 は [[Chrome]] も [[Firefox]] はいずれも [CODE(CSS)@en[[[:not()]]]]
であると解釈します。ただし >>4 の3つ目は [[Chrome]] で開くとブラウザが落ちます。
[TIME[2011-11-03T13:02:08.400Z]]

[17] [CODE(CSS)@en[[[not]]]] と [CODE(CSS)[[[(]]]] の間に[[注釈]]を入れるのは仕様上も
[[Firefox]] も [[Chrome]] も[[非妥当]]扱いです。
[REFS[
- [18] <http://suika.fam.cx/gate/2007/cssom/viewer?c=%3Anot%2F**%2F(a)%20%7B%20color%3A%20red%20%7D;h=%3Cp%3EThis%20paragraph%20must%20not%20be%20red.;p=n;x=style-element;i=html-div>
]REFS]

* メモ


[FIG(quote)[
[FIGCAPTION[
[19] [CITE@en[Safari 9.0]]
([TIME[2015-11-04 23:35:36 +09:00]] 版)
<https://developer.apple.com/library/safari/releasenotes/General/WhatsNewInSafari/Articles/Safari_9.html#//apple_ref/doc/uid/TP40014305-CH9-SW34>
]FIGCAPTION]

> The following CSS4 selectors are now fully supported by Safari.
> :not

]FIG]


[FIG(quote)[
[FIGCAPTION[
[20] [CITE@en[microformats2 parsing specification · Microformats Wiki]]
([TIME[2016-10-05 10:15:21 +09:00]])
<http://microformats.org/wiki/microformats2-parsing>
]FIGCAPTION]

> :not'''['''.h-*''']''' is not a valid CSS selector but is used here to mean:
> does not have any class names that start with "h-"

]FIG]


[21] [CITE@en['''['''selectors-4''']''' mention the specificity rules for special pseudo-classes · Issue #2129 · w3c/csswg-drafts]]
([TIME[2018-05-05 12:02:35 +09:00]])
<https://github.com/w3c/csswg-drafts/issues/2129>