IE7 の日本語版もリリースされ、ぼちぼち使い始める人たちも増えてきそうな今日この頃。
IE7 からは今まで Firefox 等に比べて遅れていた CSS への対応も進み、サイト制作者にとってはうれしい限りなのですが、実際 IE7 のCSS レンダリングはいかがなものか、簡単に検証してみました。
今回検証したのは、IE7 におけるボックスモデルの取り扱いと、セレクタへの対応状況。
まずはボックスモデルの検証ですが、用意したのは下記の XHTML と CSS。
<ul> <li class="first_list">First element of list</li> <li class="second_list">Second element of list is a bit longer to illustrate wrapping.</li> </ul>
ul { margin:0; padding:10px 0; background:#fc9; } ul li.first_list { margin:10px auto; padding:10px; width:200px; background:#ff9; } ul li.second_list { margin:10px 20px; padding:10px; width:200px; background:#ff9; border:2px dotted #099; }
これを Firefox で表示したときにどうなるかというと、
しっかりと正しいボックスモデルの解釈がなされてますね。
1つ目のリストは、width 指定の 200px に padding の左右 10px 分が足されて、220px 幅に、その下のリストも border の左右合計 4px が足されて 224px 幅になっています。また、 下側のリストでは、border の後ろ側にもしっかりと背景色が適用されているのがわかります。
では IE7 で表示させてみましょう。
2点おかしいところがあるのがわかると思います。
まず 1つ目は、2つのリスト <li> とその親要素である <ul> との間の間隔。 <ul> の上下に 10px の padding があり、内包される <li> には上下に 10px の margin が指定されているので、正しくは上の Firefox での表示のとおり、20px の間隔ができないといけないわけですが、半分の 10px しか間隔がありません。
次に、border の背後に背景色が反映されていません。ボックスモデルと背景の解釈が微妙に違っているわけです。
試しに IE6 で表示させると、
ボックスモデルの解釈は IE6 から変わっていないことがわかります。ちなみに、上は XML 宣言を記述していない XHTML を表示させたもので、XML 宣言を記述し、互換モードにレンダリングモードが切り替わった状態で表示すると、
かなり悲惨なことになってますね...... 各リストの幅も、padding / border の値を含んで、200px になってしまっています。
IE7 ではXML 宣言を記述 (というよりも DOCTYPE 宣言より前に改行やデータがある場合に) すると下位互換モードにレンダリングモードが切り替わるって言うふざけた仕様が解消されていますので、IE6 よりは相当マシなんですが、それでもボックスモデルの解釈には不満が残る結果になってます。
ではお次。セレクタ関連の対応具合を検証してみます。用意した XHTML、CSS はそれぞれ下記。
<div id="selectors_sample"> <h3>sample</h3> <p>First element</p> <p>Second element of list is a bit longer to illustrate wrapping.<span lang="en-US">English</span></p> <p class="third sanban"><a href="css_rendering_test.shtml"><span title="third">Third</span> element</a></p> </div>
div#selectors_sample { padding:10px 0; background:#fc9; } div#selectors_sample h3 { margin:10px; font-size:120%; font-weight:normal; text-align:center; line-height:100%; } div#selectors_sample > p { margin:10px auto; padding:10px; background:#ff9; width:200px; } div#selectors_sample h3 + p { border:2px dotted #099; } div#selectors_sample p[class] { background:#fcf; } div#selectors_sample span[lang|="en"] { color:#f00; } div#selectors_sample span[title="third"] { font-weight:bold; } div#selectors_sample p[class~="third"] { border:1px solid #099; } div#selectors_sample a[href^="css"] { font-size:150%; } div#selectors_sample a[href^="css"]:after { content:" *link"; } div#selectors_sample p.third:hover { background:#f90; }
では、Firefox さんに表示してもらいましょう。
Excellent!
実のところ、E[foo^="warning"] は CSS3 で追加される属性セレクタですが、これもしっかり対応してることがわかります。
では、IE7 はどうかというと、
実はいい線いってるんですよ、IE7 も。セレクタに関しては、一部の擬似クラス / 擬似要素に対応していない (ここでは :after 擬似要素) だけで、その他のセレクタにはほぼ対応済みなんですね。E[foo^="warning"] にもちゃんと対応。p.third:hover の記述にもしっかり反応しますよ。
対応していない擬似クラス / 擬似要素は、
- E:lang
- E:focus
- E:before
- E:after
before / after 擬似要素は結構使うんで痛いんですけどね。
参考までに IE6 で表示させてみれば、IE7 の進化を体感できますよ。まずは XML 宣言なしの通常モード。
こっちは XML宣言あり、下位互換モード時。
どっちもボロボロ。
ということで結論。IE7 はボックスモデルの解釈は IE6 から変化なし (だと思う)。最大の改善は、互換モードへの切り替え仕様が変更になったところ。
また、セレクタへの対応具合に関しては 90点くらいは付けられる。けど IE7 のリリース時期を考えれば、もうちょっとがんばれ中の人ってところ。
もしなんか間違ってるところがあればツッコミください。
今回の検証に使ったソース、下記においてありますので、興味のある方はどうぞ。