Acid2 セーフな uuCSSBoost.js で、ヒャッハーな世界へようこそ

ブラウザのレンダリングの互換性テストといえば、Acid2, Acid3 が有名です。
モダンブラウザだと、Firefox3+, Safari2+, Opera9+, IE8の標準準拠モードが Acid2 をパスします。

さかのぼること 8ヶ月前

こんなことを語ってました。

  • いまやってること
    • CSSパーサーの実装

IE6, IE7ACID2をクリアさせようとすると、IEが理解できないCSSを自前でパースし、img src="data/image;base64,pngxxx" をデコードする必要があります。
pngデコーダを実装するためには zip のデコーダも実装する必要があるので、そこはあきらめ気味。外部のサイトで動作するPHPbase64を丸投げして画像を受け取る方法もありだと思ってたり。
ACID2をクリアするのは正直無理だと思ってますが、その過程で得られるものが欲しいのです。
http://d.hatena.ne.jp/uupaa/20081004/1223067012

多大な時間とコストを投資し、基礎固めから始めた自作CSSパーサー(uuCSSBoost.jsuuAltCSS.js)に実用性があるのか、Acid2 で試してみました。

Acid2 で IE6 や IE7 が散々なレンダリングになる理由は大きく3つ

理由1. CSSセレクタの解釈が間違っている。

  • セレクタ(.nose > div)が正しく理解されていない
  • 隣接セレクタ(.picture p + p)が正しく理解されていない
  • 属性セレクタ([class~=one])が正しく理解されていない
  • クラスセレクタの同時指定(.two.error.two)が正しく理解されていない
  • 不正な宣言(.parser { error: \}; })の解釈があやしい
  • 不正なセレクタ(* html .parser)に一致する要素がある。対IE6

理由2. 機能が不足している

  • position: fixed を IE6 は理解しない
  • max-width系を IE6 は理解しない
  • dataスキーム(data:text/css,.picture%20%7B%...)を IE6, IE7 が理解しない
    • 目玉が表示されないのは background: url(data:image/png;base64,...) だから
  • display: table, display: table-cell を IE6, IE7 は理解しない


理由3. レンダリングバグ

  • inherit が正しく理解されていない
  • 色の二重指定(.parser { background: red pink; })。IE6 では pink になる
  • 不正な識別子(.parser { border: 5em solid red ! error; }) の解釈があやしい
  • 他にも色々ありすぎて説明しきれない

基礎が無いのに応用が出来るはずも無く、掛け算ができないのに微分積分は無理な話です。

じゃあそれ、uuCSSBoost.jsuuAltCSS.js

CSSセレクタのバグと、不足している機能を補完した状態でレンダリングするとこうなります。

  • 「良くわかんねーけど、IE7.js ってのが既にあるし、パクリっぽい uuCSSBoost.jsuuAltCSS.js なんていらねーじゃん」
  • uuCSSBoost.jsuuAltCSS.jsIE7.js のようにレンダリングバグも修正しちゃえば? いーんじゃね?」

という考えをお持ちの方のために、IE8.js の結果も並べてみました。

より最新のスクリーンショットhttp://d.hatena.ne.jp/uupaa/20090706

オリジナル + uuAltCSS.js +IE8.js(IE7.jsでもほぼ同じ結果になる)
IE6
IE7
IE8
Firefox2.0.0.20 --
Firefox3.0.11 --
Opera9.27 --

# ただし、IE8.js はIE7以下に適用する(↓)のが正しい用法なので、IE8 に IE8.js を読み込ませるのは想定外の使い方らしいです。

<!--[if lt IE 8]>
<script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE8.js" type="text/javascript"></script>
<![endif]-->

uuCSSBoost.jsuuAltCSS.js は「CSSセレクタを解釈し要素にスタイルを割り当てる」機能と「欠落している」機能(dataスキーム等)を補完します。IE7.js と違い、レンダリングバグは基本的にケアしません。

反省会

  • IE8 と IE8.js の組み合わせは NG なんだね。でも IE8 の CSS セレクタって CSS3 準拠じゃないから :nth-child とか :last-child とか色々使えないんだけど、IE8.js は :nth-child が 使えるようになるって書いてある。
    • IE8 で nth-child を使ったデザインがしたい場合に IE8.js を導入すれば… となるけど、IE に IE8.js を組み込むと、スマイリーが崩れるんだね
      • ジレンマだね
  • uuCSSBoost.jsuuAltCSS.jsクロスブラウザ対応だよ。古いブラウザでも新しいブラウザでもレンダリングに悪影響を与えずに、CSS3セレクタを使ってWebページをデザインできるよ。
    • でも作りたてだから、色々あると思うよ。
  • Acid2 対応作業の過程で、dataスキームにも対応したよ。
    • IE6, IE7 で、<script src="data:text/javascript;base64,hogehoge"> とか、<link href="data:text/css,hogehoge"> とか使えるよ
    • data:image/gif とか、data:image/png とかはダメだよ。
<!doctype><html><head><title></title></head><body>
<script src="../uuAltCSS.js"></script>
<script src="data:text/javascript;base64,YWxlcnQoImhlbGxvIHdvcmxkIik7">
// alert("hello world");
</script>
<pre>
&lt;script src="../uuAltCSS.js"&gt;&lt;/script&gt;
&lt;script src="data:text/javascript;base64,YWxlcnQoImhlbGxvIHdvcmxkIik7"&gt;
// alert("hello world");
&lt;/script&gt;
</pre>
</body></html>
  • CSSパーサーは、ブラウザ毎のCSSの解釈の違いを吸収し、Web上にヒャッハーな世界を構築するために欠かせない鍵ですよ。
    • さぁご一緒に。