[1] [[CSS]] は、将来も含めたすべての[RUBYB[水準] @en[level]]で共通の[[文法]]を定めています。 現在の水準ではまだ使われていない構造の[[構文解析]]法 (読み飛ばす方法) も定められており、 これを[DFN[[RUBY[前方互換構文解析] [ぜんぽうごかんこうぶんかいせき] @en[forward‐compatible parsing]]]]規則といいます。 また、様々な出力[[媒体]]や実装の程度等を考慮して、 扱えない構造をどう扱うかも決められています。 ここでは、それら[Q[ある実装が扱えないもの]]をどう処理するかに関する [[CSS]] の規定について扱います。 [5] - [[CSS 2]] -- [CSECTION@en[3.3 Error conditions]] -- [CSECTION@en[4.2 Rules for handling parsing errors]] - [85] [[CSS 2007]] / [[CSS 2010]] -- [84] [CITE@en[Cascading Style Sheets (CSS) Snapshot 2007]] ([TIME[2011-05-12 23:25:26 +09:00]] 版) -- [86] [CITE@en[Cascading Style Sheets (CSS) Snapshot 2010]] ([TIME[2011-05-12 23:24:12 +09:00]] 版) - [2] [[ブロック]]内や [CODE(CSS)@en[@[[charset]]]]・[CODE(CSS)@en[@[[import]]]] ''以外''の[[妥当]]な[[@規則]]の後にある [CODE(CSS)@en[@[[import]]]] [[規則]]は、[[非妥当]]なので、[[無視]]します。 - [3] [[選択子]]で[[読点]]が使われている場合でも、 [[選択子]]のどこかに[[誤り]]があれば、[[文]]全体を[[無視]]するべきです。 - [4] [[非妥当]] (未知) な[[特性名]]を持つ[[宣言]]は[[無視]]しなければなりません。 , - [6] [[非妥当]] (未知) な[[値]]を持つ[[宣言]]は[[無視]]しなければなりません。 , -- [12] [[負]]の[[値]]を認めない[[特性]]で[[負]]の[[値]]が指定されたときは、 その[[宣言]]を[[無視]]します。 -- [14] 未対応の[[値]]は、[[非妥当]]な[[値]]同様に無視するべきです。 [SRC[, >>84, >>86]] -- [88] 複数の値が指定されていていずれかには対応していていずれかには対応していない場合であっても、 すべてを無視しなければ[['''なりません''']]。 [SRC[>>84, >>86]] - [7] 不正な[[宣言]]は[[無視]]しなければなりません。その場合、 [[逃避]]や括弧類の対応を見つつ、その[[宣言]]の終わりまで読み飛ばします。 - [8] [[非妥当]]な[[@鍵語]]が現れたら、 最初の[[セミコロン]]または[[ブロック]]までを読み飛ばします。 - [9] 括弧類が[[スタイル・シート]]の終わりで閉じられていないときは、 閉じられているものとして扱います。 - [10] [[文字列]]が[[行末]]で閉じられていないときは、 閉じられているものとして扱いますが、それが含まれる構造を無視します。 - [15] [[スタイル・シート]]の先頭にあって規定通りの方法で記述されたもの以外の [CODE(CSS)@en[@[[charset]]]] [[規則]]は、[[無視]]します。 - [16] [CODE(CSS)@en[@[[charset]]]] と実際の [[charset]] に齟齬があるときは、[[スタイル・シート]]を[[無視]]します。 - [17] 使用されている [[charset]] に対応していないときは、 [[スタイル・シート]]を[[無視]]します。 - [18] すべての[[スタイル・シート]]を入手できないときは、 入手できたものだけを使って処理します。 - [19] 対応していない[[媒体型]]に適用される[[規則]]は[[無視]]しなければなりません。 - [11] [[負]]の値に対応できないときは、 対応できる一番近い値とみなすべきです。 - [12] [[非妥当]]な [[URI]] や、アクセス不能・不適当な[[資源]]が[[参照]]されている場合の扱いは、 [[利用者エージェント]]依存です。 - [13] [[色]]の値が[[装置]]で表現できる範囲を超えているときは、 一番近い値にくりぬくべきです。 - [87] 実用できるレベルに達していないものについては、非妥当であるもの同様に扱い、[[無視]]しなければ[['''なりません''']]。 [SRC[>>84, >>86]] * メモ [57] [CODE(HTMLe)@en[[[style]]]] [[要素]]の最後が閉じられていない[[注釈]] ([[名無しさん]]) [58] [CODE(HTMLa)@en[[[style]]]] [[属性]]の最後が閉じられていない[[注釈]] ([[名無しさん]]) [59] >>57-58 >>9 の規則により、閉じられていない[[注釈]]は閉じられているものとして扱われるはずです。 [[WinIE 6]] と [[Firefox]] 2 は実際にそのように解釈しますが、 [[Opera]] 9 はその閉じられていない[[注釈]]が含まれる[[規則集合]]全体 (または [CODE(HTMLa)@en[[[style]]]] [[属性値]]全体) を無視するようです ([[CSSOM]] や [CODE(DOMa)@en[[[cssText]]]] にも現れません)。 ([[名無しさん]]) [60] >>57 に [CODE(CSS)@en[@[[media]]]] を加えてみた: ([[名無しさん]]) [61] >>60 [[WinIE 6]] は正しい解釈 (閉じられていない[[注釈]]だけを無視)。 [[Opera]] 9 はやはり閉じられていない[[注釈]]を含む[[規則集合]]を無視。 [[Firefox]] 2 は閉じられていない[[注釈]]を含む [CODE(CSS)@en[@[[media]]]] [[@規則]]全体を無視。 ([[名無しさん]]) [62] >>57, >>58, >>60 の閉じられていない[[注釈]]を閉じられていない[[ブロック]]に変えてみた: = = = [89] [[属性選択子]]や[[擬似クラス]]の引数も閉じられていなくても勝手に閉じられてよさそうに思いますが、 実際にはそうなっていません。 [REFS[ - [90] - [91] ]REFS] [63] >>62 [[WinIE 6]]: [CODE(CSS)[[[{]]]] を[[ブロック]]の始まりとみなさず、 無視する (対応する [CODE(CSS)[[[}]]]] があったとしても同じ)。 [[Firefox]] 2: 1 と 2 は正しい解釈だ ([CODE(CSS)[[[{]]]] から最後までを無視する) が、 3 はやはりなぜか [CODE(CSS)[@[[media]]]] [[@規則]]全体を無視する。 [[Opera]] 9: 1 と 3 は正しく解釈するが、 2 は[[属性値]]全体を無視する (対応する [CODE(CSS)[[[}]]] があっても同じ)。]] ([[名無しさん]]) [64] >>63 [CODE(CSS)[[[{]]]] を [CODE(CSS)[[['''[''']]]] や [CODE(CSS)[[[(]]]] に変えると、 [[WinIE 6]] や [[Firefox]] 2 は同じ結果、 [[Opera]] 9 は 2 も PASS になりました。 ([[名無しさん]]) [65] >>64 でも [[Opera]] 9 は が FAIL になります。 [CODE(CSS)[[['''[''']]]] でも同じです。 つまり、[[Opera]] 9 は [CODE(CSS)[[['''[''']]]] や [CODE(CSS)[[[(]]]] の対応関係をチェックしていません。 ([[名無しさん]]) [66] >>62-65 [[Opera]] 9 は [CODE(CSS)@en[[[{]]]] の対応もチェックしていないようです。 ;; でも [CODE(CSS)[[[{]]]] の前に他のものがあればちゃんと[[ブロック]]全体を無視します。 ;; ([[名無しさん]]) [67] >>66 の動作は [[WinIE 6]] と同じようです。 [[WinIE 6]] は >>66 の2つ目のテストを PASS します。 ([[名無しさん]]) [68] [[選択子]]中に [CODE(CSS)[[[;]]]] がある: [[WinIE 6]]、[[Firefox]] 2、[[Opera]] 9 も仕様通りの動作。 ([[名無しさん]]) [69] [CODE(CSS example)[@; p { ... }]] [[Firefox]] 2 と [[WinIE 6]] は [CODE(CSS)[[[@]]]] 以後全体を無視。 [[Opera]] 9 は [CODE(CSS)[[[@]]]] と [CODE(CSS)[[[;]]]] だけを無視。 ([[名無しさん]]) [70] >>69 の [CODE(CSS)[[[@]]]] の後に[[空白]]を入れてみた: [[Firefox]] 2 は [CODE(CSS)[[[@]]]] 以後全体を無視。 [[WinIE 6]] と [[Opera]] は [CODE(CSS)[[[@]]]] と [CODE(CSS)[[[;]]]] だけを無視。 ([[名無しさん]]) [71] - - ([[名無しさん]]) [72] >>71 [[Opera]] 9, [[WinIE 6]] はどちらも緑色。 [[Firefox]] 2 は前者は緑色、後者は黒色 ([CODE(CSS)[url(]] 以後全部無視)。 ([[名無しさん]]) [73] >>71-72 [[CSS 2.1]] の[[字句]]の定義通りに解釈すると、 [[引用符]]〜[[改行]]の直前は [CODE(CSS)[[[INVALID]]]] とみなされる。てことで [CODE(CSS)[[[INVALID]]]] 2連続の後 [CODE(CSS)[color: red !important;]] があるので、そこまで無視される。 これが、前者が緑色になる根拠。 ただ、 >>7 の[[引用符]]の対応を考慮しろという規定があるので、 赤色になるという解釈もできなくはない。 後者の場合、 [CODE(CSS)[[[url]](]] があるので、同じく >>7 の [CODE(CSS)[[[(]]]] の組を考慮しろという規定より、 どこにも [CODE(CSS)[[[)]]]] がないので、残り全部無視されるというのが一番正しい。この点は [[Firefox]] 2 が正しい。 ただし、 [CODE(CSS)[[[INVALID]]]] の規定よりも [CODE(CSS)[[["]]]] の対応関係の規定を優先すると解釈した場合、 [CODE(CSS)[[["]]]] も [CODE(CSS)[[[(]]]] も一応ちゃんと組になってはいるので、 [[赤色]]になるのが正しいということにもできなくもない。 ([[名無しさん]]) [74] ([[名無しさん]]) [75] >>74 [[Firefox]] 2 と [[WinIE 6]] は [CODE(CSS)[[[p]]]] を無視する (正しい) が、 [[Opera]] 9 は [CODE(CSS)[[[p]]]] が [CODE(CSS)[@[[media]]]] の外にあるとみなす。 ([[名無しさん]]) [76] ([[名無しさん]]) [77] >>76 [[Firefox]] 2 と [[Opera]] 9 はすべて無視する (正しい) が、 [[WinIE 6]] は [CODE(CSS)[[[q]]]] の[[規則集合]]とみなす。 ([[名無しさん]]) [78] ([[名無しさん]]) [79] >>78 [[WinIE 6]] と [[Opera]] 9 は 4つの[[規則集合]]、 [[Firefox]] 2 は2つの[[規則集合]]とみなします。 ([[名無しさん]]) [80] ([[名無しさん]]) [81] >>80 こちらは [[Firefox]] 2、[[Opera]] 9、[[WinIE 6]] 共に4つの[[規則集合]]として解釈します。 ([[名無しさん]]) [82] >>78-79 は [[Firefox]] 2 も4つの[[規則集合]]とみなします。 ([[名無しさん]]) [83] >>78-82 [[規則集合]]の定義のところで[[選択子]]は [CODE(CSS)[[[{]]]] の直前まで全部と書いてあるので、 4つの[[規則集合]]とみなすのが正解です。