謎解きウェブ

なぜなにどうして。


CSSハック

text: ONO TAKEHIKO
July 08, 2006 at 03:34 PM

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; }

Post to Social Bookmarks

ブックマークに追加する

Archive


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

Comment 000871
sato | November 30, 2009 11:26 PM

html[xmlns]
なのですが、html[xmlns]>/**/body
まで記述しないと、IE7にもスタイルが適用されるのではないでしょうか?以前この記事にはhtml[xmlns]>/**/bodyについても説明があったような気がするのですが、勘違いだったらすいません。

Comment 000793
onopko Author Profile Page | November 10, 2008 2:59 PM

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

Comment 000785
ミキ・オキタ | September 26, 2008 10:15 AM

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

Comment 000315
onopko Author Profile Page | May 13, 2008 6:04 PM

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

Comment 000312
シマダ | May 12, 2008 3:33 PM

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

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

Comment 000309
kikuichi | April 22, 2008 11:10 AM

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

Comment 000278
onopko Author Profile Page | February 3, 2008 10:13 PM

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

Comment 000273
torisugari | January 31, 2008 11:20 PM

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

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

Comment 000250
Linux | December 19, 2007 1:24 PM

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

Comment 000231
Cele | September 10, 2007 6:57 PM

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

Comment 000206
onopko Author Profile Page | July 17, 2007 2:34 AM

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

Comment 000202
Nokia | July 13, 2007 4:38 PM

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

Comment 000201
onopko Author Profile Page | July 13, 2007 2:41 AM

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

Comment 000199
Safariハック | July 12, 2007 10:30 AM

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

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

Comment 000082
onopko Author Profile Page | November 12, 2006 4:06 AM

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

Comment 000080
Sizuken | November 10, 2006 7:40 PM

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


Author

WEB DESIGNER
ONO TAKEHIKO a.k.a. onopko

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

Contact Mea member of aguije

Emotional Cities

TODAY (ME)
LAST 7 DAYS

Flickr