ちょっとしたメモ

CSS2.1の勧告候補と検討事項リスト

CSS2.1がようやく(再度)勧告候補にこぎつけた。今度こそは草案差し戻しなどということなく進んでいくだろうが、テストケースや実装確認もあるので、年内はCRに留め置くということだ。このCSS2.1は、PDF版で405ページ。1998年のCSS2勧告は338ページだから、単純に分量だけでも2割増で、記述の修正なども含めると、実はかなり大きな違いがある。バグ修正やブラウザの実装に合わせただけのものではなく、よりモデルを厳密に定義したり詳しく説明しているので、CSSに関心がある人は、そろそろ2.1の内容を確認しておくのがよいかも。

今回の勧告候補は、昨年11月の草案をおおむね引き継いでおり、かなり安定しているといえるが、多少の修正や明確化もある。11月草案との違いが検討事項リストの形で示されているので、主なものを確認しておこう(以下、項目名の数字は検討事項番号、リンク先は検討事項リストの対応するセクション)。

2. 新しい整形コンテクストを形成するブロックの、floatがある場合の挙動

次のような浮動ボックスと切り揃えボックス(overflowがvisible以外のボックス)を考える。

(例)

<body style="width: 300px">
  <div style="float: left; height: 100px; width: 100px"/>
  <div style="overflow: hidden" id="test">
    Text
  </div>
</body>

仕様10.3.3の定義によれば#testの幅は300pxとなり、9.5に「新しいブロック整形コンテクストを形成する要素(切揃えボックスなど)のマージン・ボックスは、その要素自身が属するブロック整形コンテクスト内の他の浮動ボックスと重なってはいけない」と定められているので、このボックスは浮動ボックスの下に配置されるはずだが、9.4.1に「floatがあるときボックスの幅を狭めてもよい」という記述があいまいなため、現在の実装はすべて#testの幅を200pxにして浮動ボックスの隣に配している、という問題。

勧告候補では、次のように変更して対応している:

  • 9.4.1の記述から9.5へのリンクを設定
  • 上記9.5の「マージン・ボックス」を「枠ボックス」に修正
  • パラグラフの最後に「当該要素のボーダー・ボックスを10.3.3で定義される幅より狭めてもよい。CSS2ではUAがどのような場合に当該要素を浮動ボックスの横に置くか、あるいはどれだけ幅を狭めるのかは定めない」という記述を追加
3. 重なり合ってしまうような不正なテーブルセルの伸張の扱い

仕様17.5の例に示されるような不正なセルの伸張については、CSS2ではその扱いを定義しないと明記。たとえば次のような例。

(例)

<table>
<tr><td>1 </td><td rowspan="2">2 </td><td>3 </td><td>4 </td></tr>
<tr><td colspan="2">5 </td></tr>
</table>
4. min/max-width/heightとアスペクト比

CSS 2.1の最終草案再びでも取り上げた最大/最小幅(高)とアスペクト比の問題については、仕様の記述はそのままに(内在アスペクト比と違ってしまう場合がある)して、「この点について仕様は明記しているが、利用者の期待に反する場合がある。CSS3のimage-fitプロパティで対応できる」という注を追加することに。

7. SVGとの関連

先に勧告になってCSS2を引用しているSVG1.0/1.1に準拠した文書が、外部スタイルシートを使っていることによって不正なものにならないよう、全てのプロパティ値と@keywordについて保証せよというリクエスト。CSS3でSVGモジュールを作ることで合意したとされている。

8. 範囲外のRGB値の扱い

0~255の範囲外のRGB値は切り詰めるという記述を、「切り詰めるか、出力デバイスの対応範囲が分かっていればそれにマップする」と変更し、注を追加。

11. 空の行ボックス

仕様10.8に従うと、空のインライン要素も行ボックスを生成し、マージンなどを持つことになるが、これにブラウザが対応しようとするとかえっておかしなことになるという問題。

9.4.2に、「テキストを持たず、マージンなどのあるインライン要素も持たず、そのほか画像などもない行ボックスは、高さ0として扱い、マージンの折り畳みに際しては無視する」という趣旨のパラグラフを追加。

12. contentプロパティの無効なURI

contentプロパティの値になるURIが不適切(画像がない)なときには無視すべしという記述が削除された件について、反対意見が出たが、場合によってはあえて警告を出したいこともあるという理由から、仕様の変更はなし。CSS3ではcontentプロパティ値をカンマ区切りとして、最初の値(たとえばURL)が使えないときに次の値を使うといった対応が予定されている。

13. 埋め込みSVGは仕様の対象外?

仕様書3.1におけるreplaced elementとrendered contentの定義で埋め込みSVGはどうなるのかという疑問。対応は:

  • replaced elementの定義におけるCSS formatterというあいまいな用語をCSS formatting modelに変更
  • rendered contentで「整形された内容はソース文書の外部から得られる」という記述を「置換要素の内容がどう整形されるかはこの仕様では定めない」と変更
17. -0は負でない数字か

-0はnon-negativeなのかどうかが定義されていないため、「-で始まらない数字がnon-negative」とみなすアプリケーションが出てくると混乱するという指摘。仕様4.3.1に「-0は0と同等で、負数ではない」という規定を追加。

19. U+10FFFF以上のUnicodeはどうする?

範囲外のUnicodeエスケープの扱いが未定義で、扱いもUAによって異なるという指摘。仕様4.1.3に、「範囲外のUnicodeエスケープは置換文字(U+FFFD)に変換してよい。表示が必要な場合は、"missing character" glyphを使ってよい」という規定を追加。

21. 浮動ボックスが切揃えボックスなどと並ぶとき、重なってはいけないのはマージン・ボックス?

枠ボックスが合理的なので、issue 2とセットで9.5を修正。

24. 改ページの優先順位

優先順位の変更を仕様に反映していなかったので、13.3.3を修正。

25. 改ページにおける枠、マージンなどの扱い

改ページが要素の途中で生じるときに、枠やマージンをどうするかが定義されていなかったので、13.3.1に「改ページがボックスを分割するとき、そのボックスのマージン、枠、パディングはその箇所で視覚的な影響を持たない」と追加。

29. clipとoverflowの関係

次のような、親要素より子要素の幅が大きいけれども切り詰められているケースで、スクロールバーは表示されるべきなのかという問題。仕様は溢れが生じると解釈でき、現在のUAはスクロールバーを表示する。

(例)

#parent{overflow: auto; position: relative; height: 100px; width: 100px}
#child {background: blue; position: absolute; width: 200px; height: 200px;
        clip: rect(0pt, 50px, 50px, 0pt);}
...
<div id="parent">
 <div id="child"></div>
</div>

仕様11.1.2に「切り落とされた内容は溢れを生じない」と追加して、スクロールバーを表示しないものとされた。(『セオリー・オブ・スタイルシート』のpp.133-134の説明も見直しの必要ありか)

30. マージン折り畳みとクリアランス

仕様9.5.2のクリアランスの定義と8.3.1の折り畳みの定義が循環参照になって矛盾を生じているという指摘。9.5.2のクリアランスの定義を場合分けして詳細化。

31. HTML vs. XHTML

仕様11.1.1や14.2で、body要素のoverflowbackgroundの扱いがHTMLとXHTMLでは異なるように定義されているのは、望ましくないのではないかという指摘。とりあえず仕様本文はそのままで、Features at riskにこの項目を加え、「HTMLにおけるBODYの例外措置はXHTML1におけるBODYにも拡張されるかもしれない」と記述。これはいろいろと影響をはらむ問題だ。

33. ブロックレベル要素の最後の子要素におけるclear

仕様8.3.1でのクリアランスを持つ要素のマージン折り畳みの記述と、10.6.3の高さの算出に関する記述が矛盾してしまうという指摘。10.6.3のSimilarly... 以下を修正。

34. マージン、枠、パディングのボックス

マージン・ボックス、枠ボックス、パディング・ボックスという用語が未定義で用いられていたので、8.1に定義を追加(『セオリー・オブ・スタイルシート』のp.57に少し関係あり)

35. background-positionの定義

background-positionプロパティが例示による定義で不明確という指摘。14.2の定義部分を書き換え修正。

関連メモ:
at