CSS2 の CSS1 からの変更点
CSS2はCSS1に基づいて設計されており、CSS1に於いて正当なスタイルシートは概ねCSS2に於いても正当です。しかし、互換性の無い部分が幾つかあります。このディレクトリでは、変更点を大きく以下の3種類に分類して説明します。その他、細かな違いについては、リファレンスをご覧ください。
新しい機能
CSS1の機能に加えて、CSS2では以下の機能に対応しています。
- 'position'による、相対、固定、絶対位置指定。
- 新しい疑似クラス導入。:first-child、:hover、:focus、:langなど。
- セレクタの拡張。全称セレクタ、子供セレクタ、隣接セレクタ、属性セレクタの導入。
- 内容のはみ出し、切り抜き、そして可視属性の制御。
- 生成内容。カウンタと自動番号振り、マーカーなど。
- 表関連のプロパティの導入。
- 幅・高さの最大値・最小値指定。
- システム色とシステムフォントの導入。
- カーソルの制御。
- メディアタイプの概念。これに伴い、
UAは少なくとも1つのメディアタイプに対応しなければならな
くなりました。 - ページ媒体関連。@規則の導入と、ページボックスの概念や関連の疑似クラス、プロパティの導入。
- 全プロパティ共通の継承値'inherit'の導入。
- 新しいボックスの種類、つまりコンパクト、ランインボックスの追加。
- 'display'及び'vertical-align'に、表に関する新しい値の追加。
- 輪郭線の導入。
- 音声スタイルシート。
- 国際的汎用性を考慮した機能。リスト番号の種類、双方向書字、言語ごとの引用符、@charsetの導入。
- フォント選択機構の拡張。フォントの高レベルマッチング、加工、ダウンロードなど。また、システムフォントの概念が導入され、新しいプロパティ'font-size-adjust'が追加されました。
- その他、新しく導入されたプロパティ。
CSS1からの仕様変更
- CSS1では、:link、:visited、:activeが互いに排他的でした。CSS2では':active'と':link'、そして':active'と':visited'は共存可能になりました。
- 'font-size'に於いて、隣り合うキーワードの推奨スケーリング係数が1.5から1.2に削減されました。
- CSS1では、幾つかのプロパティ('padding'など)が親要素の大きさを参照するような値を取る事がありました。これは誤りで、そういったプロパティの値は常にブロック要素の大きさを参照します。CSS2では「コンテナブロック」という概念を導入する事によってこの修正を反映されています。
- 'display'と'position'と'float'の関係が明記されました。
- 'display'の初期値は、CSS1では'block'でしたがCSS2では'inline'になりました。
- 'font-size'の値を継承する時には、実効値では無く算出値が継承されます。
- !importantの意味変更。CSS1では、文書作成者のスタイルシートに記述された最重要指定のほうが、ユーザのスタイルシートに記述されたそれよりも優先しましたが、CSS2ではその優先度が逆になりました。
- "text/css"というMIMEタイプの記述が必須となりました。
- CSS1仕様の'list-style-position'の'inside'という値の説明は、黒丸の位置では無くテキストの左マージンに影響を与えるかのような解釈が可能でした。CSS2ではその解釈は除外されています。
- 'direction'の導入により、水平方向の計算方法が大幅に変更されました。
- HTML仕様側での代替スタイルシート概念の導入に伴い、UAには代替スタイルシートの選択機構が必須となりました。
取得出来ないCSSがあっても、取得出来た分だけでもレンダリングしなければいけな
くなりました。- CSS2では、色の値はsRGBでは無くデバイスが表現出来る色の全領域に対応させられます。
- ボックスの構造の部位の名称が幾つか変更されました。
- その他、仕様変更されたプロパティ。
CSS2とCSS1の字句解析を比較する
- CSS1では、ASCIIやISO-8859-1のような1バイト(1オクテット)文字しか使用出来ませんでしたが、CSS2にその制約は無くなりました。
- CSS1では、タブ文字(ASCIIコード9)を文字列中に記述出来ませんでしたが、CSS2では使用可能になりました。
- CSS1では、バックスラッシュに続く4桁の16進数によってしかUnicode文字の参照が出来ませんでしたが、CSS2では6桁の16進数を使用出来るようになりました。更に、空白類を用いてエスケープ文字列の区切りを明確に出来るようになりました。例えば「¥abcdef」という記述を考えてみると、CSS1では「¥abcd、e、f」の3文字として扱われますが、CSS2では「¥abcdef」の1文字として扱われます。
- CSS1ではエスケープ文字としての改行文字を文字列中に記述出来ませんでしたが、CSS2では使用可能になりました。
- CSS2では、実数値とそれに続く任意の識別子は、1つのDIMEN字句として(つまり識別子を未知の単位として)解析します。CSS1では、同じ記述を1実数値及び1識別子として解析する事になっていました。CSS1に従うと「font: 10pt/1.2serif」という宣言が「font: 10pt/12pt serif」と解析されますが、CSS2では数値に続く字句は単位として認識されますので「serif」の直前にスペースが必要です。
- CSS1では、クラス名先頭での数字の使用(.55ftなど)は、その数字が何かの寸法表現(.55inなど)で無い限り認められましたが、CSS2では前者のような例(.55ft)も未知の単位を持つ寸法表現として解析されます。CSS2で「.55ft」を正当なクラス名として用いるには、最初の数字をエスケープする必要があります(.¥55ft)。