[1] [[WinIE 6]] は、[[選択子]]に構文的に未対応なものが含まれていると、[[選択子]] (の[[群]]) 全体、つまり [CODE(CSS)@en[[[selectorText]]]] を [CODE(CSS)@en[[[UNKNOWN]]]] に置き換え (て [[CSSOM]] の一部に含め) ます。 ([[名無しさん]]) [2] [[WinIE 6]] は、未対応の[[擬似クラス]]を [CODE(CSS)@en[:[[unknown]]]] に置き換え (て [[CSSOM]] の一部に含め) ます。 [PRE(CSS bad example code)[ a:xxxx, b { color: red } ]PRE] では、 [[CSS 2.1]] 的には[[宣言ブロック]]全体が無視されるべきですが、 [[WinIE 6]] では [CODE(HTMLe)@en[[[b]]]] が[[赤]]くなります。 ([[名無しさん]]) [3] [[WinIE 6]] は、未対応の[[擬似クラス]]を [CODE(CSS)@en[:[[unknown]]]] に置き換え (て [[CSSOM]] の一部に含め) ます。 [PRE(CSS bad example code)[ a:xxxx, b { color: red } ]PRE] では、 [[CSS 2.1]] 的には[[宣言ブロック]]全体が無視されるべきですが、 [[WinIE 6]] では [CODE(HTMLe)@en[[[b]]]] が[[赤]]くなります。 ([[名無しさん]]) [4] [[WinIE 6]] の [CODE(DOMa)@en[[[selectorText]]]] 決定[[算法]]: = [[字句化]]し、[[正規化]]する。例えば [[escape]] を[[復号]]する。 [CODE(charname)@en[[[NULL]]]] は除去する ([[CSSの字句化]]を参照)。 == ここで、 [CODE(CSS)@en[\:]] は [[escape]] されたままとする。 なお、 [CODE(CSS)@en[\00003a]] は [CODE(CSS)@en[:]] に[[復号]]するし、 [CODE(CSS)@en[\\\00003a]] と前者は同じではない。 = 前項で得られた[[字句]]列が、[[選択子群]]全体として ([[WinIE 6]] が理解できる) 構文に適合するかを調べる。適合しなければ、 [CODE(CSS)@en[[[UNKNOWN]]]] を返す。 == 前項で残した [CODE(CSS)@en[\:]] は、 [[型選択子]]中の先頭以外の場所に高々1回だけ出現できる。 それ以外に出現するなら不適合。 = 各[[単純選択子列]]について、 == [[普遍選択子]]があれば、除去する。 === [[普遍選択子]]が[[選択子群]]に含まれる唯一の構成要素なら、[[空文字列]]になる。 == [[型選択子]]が既知の [[HTML]] [[要素型名]]なら、[[大文字]]に変換する。 === ただし、 (少なくても) [CODE(HTMLe)@en[[[xml]]]] は[[大文字]]に変換しない。 === [CODE(HTMLe)@en[[[abbr]]]] は未知。 [CODE(HTMLe)@en[[[q]]]] は未知。[CODE(HTMLe)@en[[[isindex]]]], [CODE(HTMLe)@en[[[rt]]]], [CODE(HTMLe)@en[[[comment]]]] は既知、 [CODE(HTMLe)@en[[[rb]]]] は未知。[CODE(HTMLe)@en[[[image]]]] は [CODE(CSS)@en[[[IMG]]]] に変換される。 == [[クラス選択子]]が複数あれば、最後に指定されたもののみを残して除去する。 == [[識別子選択子]]が複数あれば、最後に指定されたもののみを残して除去する。 == 既知の[[擬似クラス]]が複数あれば、最後に指定されたもののみを残して除去する。 == 未知の[[擬似クラス]]や[[擬似クラス]] ([CODE(CSS)@en[[[:]]]] とその後に続く [CODE(CSS)@en[[[IDENT]]]] または [CODE(CSS)@en[[[:]]]] のみ) は未知なら[CODE(CSS)@en[:[[unknown]]]] に置き換える。 === 例えば [CODE(CSS)@en[::[[first-letter]]]] は [CODE(CSS)@en[:]] と [CODE(CSS)@en[:[[first-letter]]]] の連続とみなされ、前者は [CODE(CSS)@en[:[[unknown]]]] と解釈され、 それが後者により上書きされ、結局 [CODE(CSS)@en[:[[first-letter]]]] になる。 === ただし、 [CODE(CSS)@en[:]] が[[単純選択子列]]の末尾に来るのはこの[[算法]]全体の2項目の場合に該当し、[[選択子群]]全体が [CODE(CSS)@en[[[UNKNOWN]]]] となる。 === [[擬似要素]]は[[単純選択子列]]や[[選択子]]の末尾でなくても構わない。 == 以上で残ったものを、[[型選択子]]、[[クラス選択子]]、[[識別子選択子]]、既知の[[擬似クラス]]、未知の[[擬似クラス]]・[[擬似要素]]の順に並べる。 == 前項の結果を返す。 ([[名無しさん]]) [5] [[Firefox]] 1.5, 2 は [CODE(CSS)@en[@[[namespace]]]] が使われていて [CODE(DOMa)@en[[[selectorText]]]] の[[型選択子]]に[[名前空間接頭辞]]を付ける場合、 なぜか [CODE(CSS)@en[:[[not]]()]] [[擬似クラス]]にも[[名前空間接頭辞]]を付けます。 他の[[擬似クラス]]の場合にはつけないようですし、 [[括弧]]の中身にも関係無しに付けるようです ([[括弧]]の中に[[型選択子]]があれば、それにもちゃんと[[名前空間接頭辞]]をつけます)。 ([[名無しさん]]) [6] [[Opera]] 9 は[[普遍選択子]]が明示的または暗示的に用いられている場合 (明示的に用いられていても、それが唯一の{[[単純選択子]]|[[擬似要素]]}である場合以外、 [CODE(DOMa)@en[[[selectorText]]]] には現れません。) で、 [CODE(CSS)@en[@[[namespace]]]] が使われていて[[型選択子]]等に[[名前空間接頭辞]]を付ける場合、省略されている[[普遍選択子]]には [CODE(CSS)[|]] だけをつけます。例えば、 [PRE(CSS example code)[ @namespace 'http://www.example.com/'; .a {} ]PRE] だと [PRE(CSS example code illegal)[ |.a { } ]PRE] になります。 ([[名無しさん]]) [7] >>6 [[Firefox]] 2 も同じで、こちらは[[普遍選択子]]を省略しないので、 [PRE(CSS illegal example code)[ *|.a { } ]PRE] になります。 ([[名無しさん]]) [8] [[WinIE 6]] は、未対応の[[擬似クラス]]を [CODE(CSS)@en[:[[unknown]]]] に置き換え (て [[CSSOM]] の一部に含め) ます。 [PRE(CSS bad example code)[ a:xxxx, b { color: red } ]PRE] では、 [[CSS 2.1]] 的には[[宣言ブロック]]全体が無視されるべきですが、 [[WinIE 6]] では [CODE(HTMLe)@en[[[b]]]] が[[赤]]くなります。 ([[名無しさん]]) [9] [[Firefox]] 2 の [CODE(DOMa)@en[[[selectorText]]]]: - → [CODE(CSS)@en[*::]] - → [CODE(CSS)@en[a:]] - → [CODE(CSS)@en[*::b]] [CODE(charname)@en[[[COLON]]]] の扱いが謎。 ([[名無しさん]]) [10] → [CODE(CSS)@en[a::]] ([[名無しさん]]) [11] >>4 は不完全のようです。 >>9 を [[WinIE 6]] に与えると [CODE(CSS)@en[[[UNKNOWN]]]] になりますが、 >>10 を [[WinIE 6]] に与えると [CODE(CSS)@en[a\:]] になります。 ([[名無しさん]]) [12] >>11 は [CODE(CSS)@en[a\:b]] になります。 だと [CODE(CSS)@en[[[UNKNOWN]]]] になります。どうも、 [[WinIE 6]] は [CODE(CSS)@en[\:]] を1つの[[字句]]とみなしている (そして前後の[[空白]]を無視する) ようですね。 ([[名無しさん]]) [13] のように [CODE(CSS)@en[\:]] の後に[[注釈]]が入ると、[[子孫]][[結合子]]があるものとして扱うようです。 のように [CODE(CSS)@en[\:]] の前に[[注釈]]が入った時は[[注釈]]を無視するようです。 のように[[注釈]]の後に[[空白]]が入っても無視されますが、 のように[[注釈]]の前に[[空白]]が入ると[[子孫]][[結合子]]とみなされるらしく、 [CODE(CSS)@en[[[UNKNOWN]]]] になります。 ([[名無しさん]]) [14] >>5 の例 ([CODE(CSS example)@en[a:[[not]](a)]]): [CODE(CSS example invalid)@en[*|a*|:[[not]](*|a)]] ([[名無しさん]]) [15] [[HTML]] における[[大文字]]・[[小文字]] - [[WinIE 6]]: [[ASCII]] [[小文字]]を含む既知の [[HTML]] [[要素型名]]は[[大文字]]に[[正規化]]、[[擬似クラス]]名、 [[擬似要素]]名は[[小文字]]に[[正規化]] ([[ASCII]])、 [[識別子名]]や[[クラス名]]は変換なし - [[Opera]] 9: [[ASCII]] [[大文字]]を含む既知の [[HTML]] [[要素型名]]は[[小文字]]に[[正規化]]、既知の [[HTML]] [[属性名]]は[[小文字]]に[[正規化]] (こっちは [[Unicode]])、 [[擬似クラス]]は[[小文字]]に[[正規化]] (これも [[Unicode]])、 [[擬似要素]]も[[小文字]]に[[正規化]] (これは [[ASCII]])、 [[属性値]]や[[識別子名]]や[[クラス名]]は変換なし - [[Firefox]] 2: [[要素型名]]、[[属性名]]、[[擬似クラス]]名、 [[擬似要素]]名を[[小文字]]に[[正規化]] ([[Unicode]])、 [[クラス名]]や[[識別子名]]や[[属性値]]は変換なし ([[名無しさん]]) [16] [[Opera]] 9 は [CODE(CSS)@en[:[[lang]]()]] の[[引数]]部を括弧もろとも [CODE(DOMa)@en[[[selectorText]]]] には出しません。 [[Firefox]] 2 は[[大文字]]・[[小文字]]変換なし ([[名無しさん]]) [17] >>15 [[属性名]]の[[正規化]]では、[[要素型名]]との対応はチェックしていないようです。 [[XML]] [[文書]]内の[[スタイル・シート]]では、 [[Firefox]] 2 も [[Opera]] 9 も[[要素型名]]と[[属性名]]の[[大文字]]・[[小文字]]を保存するようです。 ([[名無しさん]]) [18] [[Opera]] 9 は[[単純選択子]]の順序を保存します。 [[Firefox]] 2 は = [[型選択子]]・[[普遍選択子]] = [[識別子選択子]] = [[クラス選択子]] = [[属性選択子]] = [[擬似クラス]] = [[擬似要素]] の順に並べ替えます。同じ種類の[[単純選択子]]同士の順序は保存するようです。 ([[名無しさん]]) [19] [[Firefox]] 2, [[Opera]] 9 とも、 [[擬似要素]]の前が [CODE(CSS)[[[::]]]] となっていた場合、 [CODE(CSS)[[[:]]]] に[[正規化]]します。 [[注釈]]、[[空白]]、[[escape]] はすべて除去します。 [[属性値]]はすべて [CODE(CSS)[[["]]]] [[区切り]]に[[正規化]]します。 ([[名無しさん]]) [20] [[Firefox]] 2, [[Opera]] 9 とも、[[選択子]]の区切りは [CODE(charname)@en[[[COMMA]]]] [CODE(charname)@en[[[SPACE]]]] に[[正規化]]します。 ([[名無しさん]]) [21] [[Firefox]] 2 は[[型選択子]]なき場合必ず[[普遍選択子]]をつけますが、 [[Opera]] 9 はそれ以外に[[単純選択子]]や[[擬似要素]]がまったくない場合を除き、 [[普遍選択子]]を除去します。 ([[名無しさん]]) [22] [[Opera]] 9 で [[HTML]] [[文書]]だと、なぜか15文字を超える[[属性名]]は[[空文字列]]に変換されてしまいます ([[XML]] [[文書]]ではそうならないので、[[小文字]][[正規化]]の部分がおかしい?)。 ([[名無しさん]]) [23] [[Opera]] 9 で [[HTML]] [[文書]]だと、なぜか15文字を超える[[属性名]]は[[空文字列]]に変換されてしまいます ([[XML]] [[文書]]ではそうならないので、[[小文字]][[正規化]]の部分がおかしい?)。 ([[名無しさん]]) [24] [[Opera]] 9 で [[HTML]] [[文書]]だと、なぜか15文字を超える[[属性名]]は[[空文字列]]に変換されてしまいます ([[XML]] [[文書]]ではそうならないので、[[小文字]][[正規化]]の部分がおかしい?)。 ([[名無しさん]]) [25] [[Firefox]] 2、[[Opera]] 9 共に、 [CODE(CSS)@en[@[[namespace]]]] がない場合、 [[名前空間接頭辞]]である [CODE(CSS)[|]] ([[空文字列]]) はそのまま保存され、 [CODE(CSS)[[[*]]|]] は除去されます。 [[要素型名]]はともかく、[[属性名]]で [CODE(CSS)[[[*]]|]] を除去すると意味が変わってしまうのですが、 どちらのブラウザも内部的には区別を保持したままのようです。 ;; ([[名無しさん]]) [26] >>25 訂正。どちらのブラウザでも、[[属性名]]の [CODE(CSS)[[[|]]]] ([[空文字列]]の[[名前空間接頭辞]]) は除去されます。 ([[名無しさん]]) [27] [[名前空間接頭辞]]の[[正規化]]については [CODE(CSS)@en[@[[namespace]]]] の項にも調べた結果があります。 ([[名無しさん]]) [28] [PRE(CSS example code)[ a[b] {} |a[|b] {} *|a[*|b] {} a|a[a|b] {} ]PRE] に対応する [CODE(DOMa)@en[[[selectorText]]]] がどうなるか? [CODE(CSS)@en[@[[namespace]]]] なし: - [[Opera]] 9: a[b], |a[b], a[b], ([[無視]]) -- 3つ目の[[属性]]の方は正しくない - [[Firefox]] 2: a[b], |a[b], a[b], ([[無視]]) -- 3つ目の[[属性]]の方は正しくない [[既定名前空間]]のみあり: - [[Opera]] 9: |a[b], |a[b], a[b], ([[無視]]) -- 1つ目の[[要素型]]、3つ目は正しくない - [[Firefox]] 2: a[b], |a[b], *|a[b], ([[無視]]) -- 3つ目の[[属性]]の方は正しくない [[名前空間接頭辞]] [VAR[a]] のみあり: - [[Opera]] 9: a[b], |a[b], a[b], a|a[a|b] -- 3つ目は正しくない - [[Firefox]] 2: *|a[b], |a[b], *|a[b], a|a[a|b] -- 3つ目の[[属性]]の方は正しくない [[既定名前空間]]も[[名前空間接頭辞]] [VAR[a]] もあり: - [[Opera]] 9: |a[b], |a[b], a[b], a|a[a|b] -- 1つ目の[[要素型]]、3つ目は正しくない - [[Firefox]] 2: a[b], |a[b], *|a[b], a|a[a|b] -- 3つ目の[[属性]]の方は正しくない ([[名無しさん]]) [29] [[Firefox]] 2 も [[Opera]] 9 も[[子孫結合子]]は [CODE(charname)@en[[[SPACE]]]] 1つに[[正規化]]します。また、その他の[[結合子]]は前後に [CODE(charname)@en[[[SPACE]]]] 1つずつに[[正規化]]します。 ([[名無しさん]]) [30] [[Firefox]] 2 も [[Opera]] 9 も[[子孫結合子]]は [CODE(charname)@en[[[SPACE]]]] 1つに[[正規化]]します。また、その他の[[結合子]]は前後に [CODE(charname)@en[[[SPACE]]]] 1つずつに[[正規化]]します。 ([[名無しさん]]) [31] [[Firefox]] 2 も [[Opera]] 9 も[[子孫結合子]]は [CODE(charname)@en[[[SPACE]]]] 1つに[[正規化]]します。また、その他の[[結合子]]は前後に [CODE(charname)@en[[[SPACE]]]] 1つずつに[[正規化]]します。 ([[名無しさん]]) [32] [[Firefox]] 2 も [[Opera]] 9 も[[子孫結合子]]は [CODE(charname)@en[[[SPACE]]]] 1つに[[正規化]]します。また、その他の[[結合子]]は前後に [CODE(charname)@en[[[SPACE]]]] 1つずつに[[正規化]]します。 ([[名無しさん]]) [33] >>21 の [[Opera]] 9 の動作は[[名前空間接頭辞]]の存在と独立なので、 [CODE(CSS example code)[@namespace 'x'; [a] ]] の [a] にも | だけがついて |[a] になってしまいます。 ([[名無しさん]]) [34] [[Firefox]] 2、 [[HTML]] [[文書]]では、 [CODE(CSS)@en[@[[namespace]]]] の有無と[[大文字]]・[[小文字]]の[[正規化]]は関係していないようです。 [[XML]] [[文書]]では全部保存されます。 [[Opera]] 9 では、 - [[HTML]] [[文書]]で、[[名前空間]]が指定されていない ([CODE(CSS)[*|]] と[[等価]]な) [[要素型名]] - [[HTML]] [[文書]]で、[[名前空間URI]] が [CODE(URI)@en[[[http://www.w3.org/1999/xhtml]]]] な[[要素型名]] - [[HTML]] [[文書]]で、[[名前空間URI]] が [CODE(URI)@en[[[http://www.w3.org/TR/REC-html40]]]] な[[要素型名]] - [[属性名]] であれば[[大文字]]・[[小文字]]を無視し、その他の場合には[[大文字]]・[[小文字]]を保存するようです。 ([[名無しさん]]) [35] >>28 の変化については、[[無視]]される[[非妥当]]な [CODE(CSS)@en[@[[namespace]]]] [[規則]]は考慮されないようです。 ([[名無しさん]])