ウィンドウズ・インターネットエクスプローラ 7のCSSの実装についてのメモです。
インターネットエクスプローラ 7のCSSの実装を調べたところ、以下のようになっていました。
ウィンドウズ版の6.0までは、XHTML文書では冒頭に付いた<?xml ?>
処理命令などにより、後方互換の扱い(ボックスの幅や高さにボーダやパディングを含めるなど)になっていましたが、そのような問題は解消されているようです。
○○[title]セレクタを認識しているようです。
このため、属性セレクタを含める事で、IEでは都合の悪いプロパティ定義を回避すると言うテクニックは使えなくなります。
つまり、
○○{
IE向けのプロパティ定義}
○○, [version]
IE以外向けのプロパティ定義}
と言うテクニックは効かなくなります。
:before 疑似要素及び :after疑似要素を用いたプロパティが相変わらず無効になっております。
position: fixed;
の実装このプロパティは正常に機能しているようです。
擬似フレームなどを実現するには、このプロパティの実装が欠かせません。
_
」で始まるプロパティ名が無効になる事6.0までのIE独自実装に対応するため、この不正なプロパティ名を用いている方もいるかも知れませんが、このプロパティは認識されません。
この事により、IEでの問題点を回避するテクニックとして使えない事となります。
制作者が個人的に頭を抱えた問題点です。
マージン(要素の周りの余白)に関する実装はインターネットエクスプローラ 6.0と同じなのです。
しかも、この問題を回避するためのテクニックが一切使えなくなります。
折角、position: fixed;
が有効なのに、これが使えないのは惜しい限りです。
当面、マイクロソフト独自の注釈宣言でIE 7.0以降専用のスタイルを読み込ませる以外の対処は無さそうです。
従来は一行目のみに反映されたのですが、平成18年 4月24日リリース版以降では二行以上に跨る場合には全く反映されなくなりました。
つまり、改善されたどころか改悪されてしまったのです。
制作者は<em>要素に背景画像を用いているため、これも個人的には厄介な問題です。
状況に依っては、テキストの上端と要素の上ボーダ(上ボーダが無い場合は上パディングと上マージンの境界)に隙間が出来る場合があるようです。
inherit
値を認識しない(平成18年 2月 2日 追記)これも結構厄介な問題です。
*+html
の下位セレクタが有効(平成18年 8月25日 追記)一般に、HTML文書に於いて*+html
を満たす要素は存在しないため、これの下位要素も存在せず、従ってこのセレクタの下位セレクタでのプロパティ定義も意味を成しません。
しかしながら、インターネットエクスプローラ 7では、通常のhtml
セレクタと同じように扱われるので、これを用いる事に依り、インターネットエクスプローラ 7に対して独自のプロパティを与える事は可能のようです。
* html
の下位要素セレクタと言うものが有効なので、これとセットで利用する事もあると思われます。インターネットエクスプローラ 7のCSSの実装に関してざっと調査してみましたが、正直なところ、まだまだファイヤーフォックスやオペラの実装には遠く及びません。
恐らく、現時点では、属性セレクタなどインターネットエクスプローラ 6.0まででは実装していなかった機能を追加しただけで、肝心の実装分の不具合の修正にはまだ至っていないのではないかと思います。
しかも、今までの回避策が全然使えなくなるため、却って問題をもたらしているとさえ言えます。
ただ、全部直せと言っても無理でしょうから、制作者個人としては、
をお願いしたいところです。
しかしながら、CSSに関しての最終調整はもう終わったとの事で、これらの要望は実現しないと思われます。(平成18年 8月25日)
インターネットエクスプローラ 7に関しては、他にも幾つか問題があるようです。
content-type: application/xhtml+xml
を認識しませんつまり、XHTML ベーシックやXHTML 1.1 以降の文書を公開する場合は、少なくともIE 7以前に対してはcontent-typeを「text/html
」で配信しなければなりません。
実装していないIEが悪い、application/xhtml+xml
で配信すべきだ
と言う主張する者もいるようですが、それは閲覧を妨害する行為であり、アクセシビリティ上最悪の行為と言えます。これでは、一般人にとって非常に利用し難いのではないかと思います。
インターネットエクスプローラ 7のユーザエージェント文字列は、
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
でした(末尾の「.NET CLR 2.0.50727」は制作者が .NET 実行環境 2.0をインストールしている事によるものです)。
つまり、Mozilla/5.0 (ファイヤーフォックスなどのもじら系ブラウザやサファリが用いている)を名乗ったりはしないようです。
また、リクエストヘッダの ACCEPT フィールドも IE 6.0同様
image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
となっており、「application/xhtml+xml」「image/png」が含まれておりません(個人的にはどうでもいい事ですが…)。
制作者はアンチPNGで、PNG画像は絶対に利用しないので全く問題視しておりませんでしたが、インターネットエクスプローラ 6.0ではアドビ社の『フォトショップLE』などで作成したPNG画像が真っ黒になって表示出来ませんでした。
この点も改善されているようです。
現実問題として、執るべき対策を挙げておきましょう。
一番簡単なのはインターネットエクスプローラでのみ認識されるセレクタを活用する事でしょう。
html>/**/body
忌避したいセレクタ{
…}
@import "
忌避したいスタイルシート" screen, projection;
html>/**/body
忌避したいセレクタ{
…}
実際のところ、本質的にCSSの処理は大して変わっていないので、余り使う事は無いかも知れません。
position: fixed;
などに新機能が加わったので、その辺りで有用になるかも?または、属性セレクタを併用する手もあります。
○○#
△△[id="
△△"]
{
…}
○○.
△△[class="
△△"]
{
…}
この他、(無意味な)属性セレクタと同じグループのセレクタも、スタイル定義が適用されなくなります。
例えば以下の場合、インターネットエクスプローラ 6.x以前では、有効である筈のp.class
セレクタも無効になります。
p.class, [version] {
…}
*+html
適用したいセレクタ{
…}
* html
適用したいセレクタ{
…}
また、インターネットエクスプローラ 6.x以前に於いて、特定のプロパティのみ有効にしたい場合には、当該プロパティ名の前に_
をつけるという方法もあります(文法違反ですが)。
この他にも、マイクロソフト独自の注釈宣言を利用する方法もあります。