IEにのみCSSを適用させるCSS Hack、「スターハック」を紹介!

スターハック

CSS Hack Labは現在、製作段階のWEBサイトです。製作途中のページやリンク切れ等が多数存在します。
また、テスト等をしっかりと行っていない部分もまだ存在します。
なお、ページ移動も頻繁にしていますので、URLは何度も変わる可能性があります。
以上のことを理解の上でサイトを観覧してください。

スターハックとは・・・

スターハックStar Hack)は、(Macを含むすべての)IEのみにスタイルを適用します。セレクタの始めに「* html 」を付けるだけなので、CSS Validatorに通ります。

* html selector{
  propaty:value;
}
スターハック・ブラウザ変化表
IE標準モードWindows IE 6以前・Mac IEすべてサンプル
IE互換モードWindows・Mac IEすべてサンプル

なお、IE7は、後方互換モードになるようにDOCTYPE宣言をするとハックが適用されますが、標準モードでDOCTYPE宣言をすると、ハックは適用されません。

スターハックをもっと詳しく・・・

スターハックのしくみ

<通常のブラウザ>
* htmlって何だ?」
↓
htmlには親要素が無い!」
↓
「適用しない!」

「* html」には、全称セレクタ(アスタリスク)が含まれています。このことから、「* html」は「任意の要素の子孫であるhtml要素」となります。

ですが、html(xhtml)だと、ルート要素は必ずhtml要素になるから、html要素が何かの要素の子孫になることは絶対にありえません。なので、IE以外のブラウザはこのハックを適用しないのです。

しかしIEはhtmlに親要素があると解釈しちゃうため、このハックを適用しています。(理由は次からの章にあります)

なんでhtml要素に親要素があるの?:予想1

<IEの考え方:予想1>
* htmlって何だ?」
↓
htmlのことか!」
↓
「適用しよう!」

なぜhtml要素に親要素があると解釈する理由に「IEのお行儀が悪いだけ」なんて言われているのをどっかで見ました。でも、どこが行儀悪いのでしょうか?

普通、「* div{ }」と「div{ }」のどちらのセレクタも同じ意味を持ちます。つまりIEは、あってもなくても変わらないからセレクタの先頭に「* 」(全称セレクタ)があっても無視っていう決まりができているのかなぁ・・・?と私は思います。

もし、本当にセレクタの先頭の「*」を無視しているのであれば、かなりお行儀が悪いですが、もう一つの仮説だと、まだマシだと思います。

なんでhtml要素に親要素があるの?:予想2

<IEの考え方:予想2>
* htmlって何だ?」
↓
DOCTYPE宣言(の子孫の)htmlのことか!」
↓
「適用しよう!」

もう一つ、予想を立ててみました。個人的にはこっちの方が可能性が高い気がします。(あくまでも「気がする」だけです。単なる直感です。過信しないでください。)

それは、DOCTYPE宣言を要素として見ているのではないか、ということです。「本来記述しなければならないもの」ですから、もし記述されていなくても省略されていると考えて、「html要素の親要素はDOCTYPE宣言」になっている可能性が考えられると思います。

ちなみに、この説では、スター+ハックも説明できます。スター+ハックの「*+html」は、何かの要素の直後にhtml要素がある、となります。(直下ではなく、直後です!)この「何かの要素」がまたもやDOCTYPE宣言と考えられます。

そして、スター+ハックでのIE7は、標準モードのみ適用、スターハックでのIE7は標準モードのみ適用です。すなわち、IE7は後方互換モードだとDOCTYPE宣言の子要素がhtml要素になり、標準モードだとDOCTYPE宣言の弟要素がhtml要素になる、と考えられるのです。

名称について

どーでもいい話ですが、このハック名は、星型に例えられる「*」を使っているから「スター」。そのまんまですね。似たようなハックに「スター7ハック」があります。

でも、名前から効果がすぐに分かるようにするには、「IEハック」なんていう名称も悪くない気がします。(少しかっこ悪いネーミングですが・・・)

ちなみに、英語圏ではStar Html Hackって言われているそうです。日本語サイトでは、ほぼすべて「スターハック」とHtmlが省略されているので、当サイトでも「スターハック」を使用しています。

関連ページ

似たようなハック

理解を深めるページ

<< CSS Hack ライブラリー(一覧ページへ)

▲ TOP

MEMO

2008,1,1
Labの公開と一緒にこのページをアップしました!