IE6 は XHTML を XML として扱えませんでした

IE6XHTML を扱うときに 1 行目が文書型宣言でなければ、つまり書き出しが XML 宣言などになっていると旧バージョンの IE と同じ解釈をする後方互換モードで描画されてしまうという致命的なバグ。このことは言われて久しいのですが、というか、もう 5 年以上前から言われていたりするのです。さすがに IE7 では修正されていて問題になりませんけれど。

さて、標準モードと互換モードでは具体的に何が違うか、というとおもに CSS の解釈の仕方。標準モードでは概ね W3C の勧告どおりに解釈してくれるのですが、互換モードではボーダーやマージンなどの数値計算の基準や、背景の指定方法やセンタリングの方法などが IE 独自の基準で解釈されてしまうのです。

デザインにこだわらない人ならば IE でどう見えるかなんて無視しちゃってもいいんでしょうけれど、デザインにこだわりたいからこそ CSS を使っている、という場合も多いわけで、XML 宣言をしつつ標準モードで描画させたいという要求は、 XHTML 、特に Strict を選んだ人にとって避けられない苦渋の板ばさみ (ジレンマ)

さて、このサイトですが、基本は XML 宣言ありの文書型宣言あり。 XHTMLXML なので、 CSS の紐づけも XML のスタイルシート処理命令で。

IE などの、 XHTMLXML として解釈してくれない、というか要求される HTTP ヘッダの ACCEPT に application/xhtml+xml が含まれていない UA に対しては PHP によって text/html として処理させているのですが、それは XML として処理してくれなくてもいいよ、と言っているようなもの。なので、その場合は XML 宣言をせず、head 要素内で http-equiv 属性を持った meta 要素を追加しています。

あ、これの意味は別に text/html を head 内で改めて指定しているってわけじゃなく、文字化け防止のためです。どうも IE では文字コードが Shift_JIS 以外になっていると http-equiv で指定してやらないと文字化けしやすいみたいなので。この記述、 XHTML では本来不要なんですけどね。 IEXHTMLHTML として読むことしか知らないみたいなので仕方がありません。

XML の解釈ならそこそこいいのに、 HTML の要素名が入っていると勝手に HTML として解釈してしまう IE は、それでも XML のスタイルシート処理命令を読んでくれちゃったりするので迷惑です。 text/html (HTML) は text/xml (XML) でも application/xml (XML) でも、ましてや application/xhtml+xml (XHTML) でもないんだから、そんなもの読まなくてよろしい! と思っていてもその部分は勝手に読んでくれちゃったりするので迷惑です。

まあ、 XML 宣言の話は IE7 以降で解決したので、問題ではないのですがね。それでも信用できないので IE に対しては XML 宣言を省かせていただいております。

今も残る問題はやはり application/xhtml+xml への対応、これですな。

それにしても、互換モードと標準モードの差って、個人的には、 CSS の最初に margin: 0; padding: 0; とか入れてすべての値を 0 にしてから、横幅指定とかにせず、リキッド (可変) デザインにしておけば大したことないような気がするんですけどね……。あれって無駄に position: absolute; とかしちゃってピクセル単位で合わせようとするから悲惨な目に遭うのではなかろうか、と。