FEATURE

July 8, 2006

CSSハック

CSSコーディングを行う際、ブラウザごとの表示の違いを調整するために、ブラウザが持っている「バグ」を逆手に取って利用する方法があります。俗にCSSハックと呼ばれているもので、中には本来CSSの書き方として適切なものでないものもありますし、何よりソースが長く複雑になるのであまり使いたくない。

しかし最もシェアが高く最もバグが多いブラウザが、ご存知Internet Fucking Explorer。使いたくないと言いつつもCSSハックの利用が必須とならざるを得ないという、皮肉な現状があります。

仕事で利用する機会も多いことですので、備忘録としてまとめてみました。

厳密には「ハック」と言えないものがあるのかもしれませんが、目的としてはブラウザ間の表示を統一する為の技術、ということでご理解ください。

IE 7ハック

Internet Explorer 7 7

Windows IE 7のみにスタイルを適用するハック。適用したいセレクタの前に「*:first-child+html」を付ける。CSS Validatorに通る。

*:first-child+html p { color:#FF0000; }

スターハック

Internet Explorer 4〜6, Mac 4〜5

Windows IE 4〜6、Mac IE 4〜5のみにスタイルを適用する場合に用いる。スターつまり*を利用することからこのネーミングになったものと思われる。利用法としては、適用したいセレクタの前に「* html」を付ける。書式上は正しいのでCSS Validatorに通るが、それにマッチする要素はHTML文書には出現し得ない。

* html p { color:#FF0000; }

スター7ハック

Internet Explorer 5.5〜6, Mac 5 Safari

Windows IE 5.5〜6、Mac IE 5、Safariのみにスタイルを適用する。適用したいセレクタの前に「html*」を付けるのだが、空白を含めないように注意したい。書式としては不正で、CSS Validatorに通らない。

html*p { color:#FF0000; }

Hollyハック

Internet Explorer Mac 5

Mac IE 5のみにスタイルを適用、あるいはMac IE 5のみ除外したい場合に用いる。適用したいスタイルを、それぞれ以下のコメント形式で囲めばよい。CSS Validatorに通る。

なお、Hollyハックは別名バックスラッシュ(\)ハックとも言われている。文字コードがShift JISのときにはバックスラッシュの代わりに「¥」を利用すればよい。

Mac IE 5のみにスタイルを適用

/* これ以降Mac IE 5のみに適用される \*//*/
p { color:#FF0000; }
/* これ以降Mac IE 5以外にも適用される */
Mac IE 5のみスタイルを除外

/* これ以降Mac IE 5には適用されない \*/
p { color:#FF0000; }
/* これ以降Mac IE 5にも適用される */

ハッシュハック

Internet Explorer 4〜6, Mac 5 Firefox Opera 7

Windows IE 4〜6、Mac IE 5、Firefox、Opera 7のみにスタイルを適用する場合に用いる。適用したいプロパティの前に「#」を付けて使う。CSSの書式としては不正で、CSS Validatorに通らない。

p { #color:#FF0000; }

アンダースコアハック

Internet Explorer 4〜6

Windows IE 4〜6のみにスタイルを適用する場合に用いる。適用したいプロパティの前に「_(アンダースコア)」を付けるだけだが、CSSの書式としては不正で、CSS Validatorに通らない。

p { _color:#FF0000; }

もし同様の処理をCSS Validatorに通るかたちで実現したいのなら、スターハックとHollyハックを用いて

/* hide from Mac IE \*/
* html p { color:#FF0000; }
/* */

とすればいい。

Caioハック

Netscape 4

Netscape 4のみを排除する。CSS Validatorに通る。

/* これ以降Netscape 4には適用されない /*/
p { color:#FF0000; }
/* これ以降Netscape 4にも適用される */

Fabriceインバージョン

Netscape 4 Opera 4〜5

Netscape 4、Opera 4〜5のみにスタイルを適用する場合に用いる。CSS Validatorに通る。

/* これ以降Netscape 4、Opera 4〜5のみに適用される /*//*/
p { color:#FF0000; }
/* これ以降全てのブラウザに適用される */

xmlns属性ハック

Firefox Safari Opera

属性セレクタをサポートするFirefox、Mozilla、Safari、Operaにのみスタイルが適用される。CSS Validatorにも問題なく通る。

html[xmlns] p { color:#FF0000; }

:root疑似クラスハック

Firefox Safari Internet Explorer Mac 5

:root疑似クラスをサポートするFirefox、Mozilla、Safari、Mac IE 5にのみスタイルが適用される。:root疑似クラスは策定中のCSS 3.0でサポートされる予定で、CSS 2.0では定義されおらずCSS Validatorではエラーとなる。

:root p { color:#FF0000; }

Safariハック

Safariにのみスタイルを適用させる。前者はスターハックとスター7ハックの複合技で、それぞれのハックの適用ブラウザの差を利用したものです。また後者はSafari用のハックとして単独で利用が可能です。いずれのハックもCSS Varidatorを通過しません。

他のブラウザについてもまったく同じことが言えますが、Safariのバージョンアップによりいずれのハックも崩壊する可能性があることを念頭に置いておくべきです。またSafariハックというネーミングはこちらで勝手に付けたものです。あしからず。

Safari

p { その他のブラウザ用のスタイル }
html*p { Safari用のスタイル }
* html p { その他のブラウザ用のスタイル }

Safari 2〜

html[xmlns*=""] body:last-child p { color:#FF0000; }
2007.04.27 IE 7ハックを追記

このブログのアクセスログを見る限りでもそうなのですが、そろそろIE 7の利用者数も増えてきましたのでIE 7用のハックを追記いたしました。決まったネーミングがあるようでしたら情報頂けると助かります。

2007.04.30 Safariハックに別の方法を追記

これまでのスターハックとスター7ハックの複合技に加え、単独で利用できるものを追記。

2007.07.13 SafariハックのCSS Validation情報を修正

コメントにてSafariハックのCSS Validation情報に誤りがあることをご指摘いただきました。後者の:last-childを使ったハックではCSS Validatorに通ると書きましたが、検証したところ「通りません」でした。上書きにて修正。

2007.07.17 Safariハックの対応バージョンを追記

Safariの:last-childを使ったハックはバージョン2以降のみに適用されることが判明。追記いたしました。

2008.05.13 スターハックの解説を修正

コメント欄にて誤りをご指摘いただいたのを受け、修正。可読性を保つため上書きとさせていただきました。

2008.11.10 :root疑似クラスハックの解説を修正

コメントにてCSS Validation情報に誤りがあることをご指摘いただきました。上書きにて修正いたしました。


COMMENTS

ADD YOUR COMMENT
  • Sizuken commented at November 10, 2006 7:40 PM

    「:root疑似クラスハック」の例示が「xmlns属性ハック」と同じものになっていますよー。

  • onopkoAuthor Profile Page commented at November 12, 2006 4:06 AM

    >Sizukenさん
    自分でも何度も見ているエントリーなのに気づいていませんでした…。ご指摘ありがとうございます!上書き訂正いたしました。

  • Safariハック commented at July 12, 2007 10:30 AM

    『:last-childは未知の疑似要素または疑似クラスです』

    Safariハックの後者もCSS Varidator通りませんでした。
    残念…。

  • onopkoAuthor Profile Page commented at July 13, 2007 2:41 AM

    :last-childを使ったSafariハックですが、あらためて検証したところ確かに通らないようですね。上書きにて修正をさせていただきました。情報をお寄せいただきありがとうございます。

  • Nokia commented at July 13, 2007 4:38 PM

    ついでに
    「html[xmlns*=""] body:last-child」のハックはSafari2以降と思われます。
    Safari1.3.2で検証してて変化ないなぁ~と…… orz
    上の単独で使えない方は対応してました。

  • onopkoAuthor Profile Page commented at July 17, 2007 2:34 AM

    >nokiaさん
    情報ありがとうございます。なるほどー、バージョン違いによる差ですか…。Safari単体にCSSハックを利用する機会自体多いとは思えませんが、これを利用すればバージョン別に異なるスタイルを適用させることもできそうですね。またまた修正させていただきました。

  • Cele commented at September 10, 2007 6:57 PM

    IEとIE以外で表示が違う問題で悩んでいたので助かりました。有用な情報ありがとうございました。

  • Linux commented at December 19, 2007 1:24 PM

    最近此処を知って、とても詳しく書いてあるので凄く勉強になっています。
    Internet Fucking Explorerには吹きました。

  • torisugari commented at January 31, 2008 11:20 PM

    /* safari only \*/
    html:\66irst-chile div{
    color: #cccccc;
    }
    /**/

    これでもsafariのみに適用させる事ができるようです。

  • onopkoAuthor Profile Page commented at February 3, 2008 10:13 PM

    >torisugariさん
    情報のご提供ありがとうございます。さっそく試してみたのですが、残念ながら僕の環境(Mac OS X 10.5.1 + Safari 3.0)では確認できませんでした。torisugariさんの環境はSafari 2.0でしょうか?

  • kikuichi commented at April 22, 2008 11:10 AM

    いつもとても勉強させていただいております。
    私はバリバリの初心者で日々CSSと戦う日々です。
    IE8はいったいどうなってしまうのでしょうか。

  • シマダ commented at May 12, 2008 3:33 PM

    スターハックが 「CSSの書式上は正しくない」 というのは間違いです。

    スターハックは正しい書式だが、 それにマッチする要素はHTML文書には出現し得ない。
    これが正しい説明です。

  • onopkoAuthor Profile Page commented at May 13, 2008 6:04 PM

    >シマダ様
    貴重な情報ありがとうございます。なるほど、書式が正しいのでValidatorに通るのですね。勉強になりました。追記にも書きました通り、上書きにて修正済みです。

  • ミキ・オキタ commented at September 26, 2008 10:15 AM

    :root疑似クラスハックですが、CSS Validatorに通りますか? 私が試したところ、エラー扱いになってしまったのですが・・・。

  • onopkoAuthor Profile Page commented at November 10, 2008 2:59 PM

    >ミキ・オキタさん
    レスが非常に遅れてしまいまして申し訳ありません。:root疑似クラスハックの件ですが、私の方でもエラーを確認いたしましたので修正させていただきました。ご指摘ありがとうございます。


ADD YOUR COMMENT.



AUTHOR

ONO TAKEHIKO a.k.a. onopko

東京のウェブ制作 aguije(アグイジェ)を拠点に活動しているウェブデザイナーです。ディレクション・デザイン・コーディング・Ajax・Flashオーサリングをはじめ、まだまだ未熟ながらワンストップなクリエイターになるべく精進中です。凝り性。



TRACKBACKS