CSSハックまたはCSSフィルタとは、ブラウザのバグやCSSへの対応状況の違いを利用して、特定のブラウザの場合のみCSSを適用させるために使用します。
メジャーブラウザ(IE,FireFox,Opera,Safari)以外や、今後の新しいブラウザでは意図しない結果を生じる可能性がありますので多用は避けるべきです。 通常、IE以外のブラウザは自動アップデート機能やユーザーの性質から、最新のブラウザに早い段階でアップデートされる傾向がありますので、特別な理由がない限り IEの旧バージョン向けの対応で十分と思われます。
条件分岐コメント は、Microsoft Internet Explorer 5 で導入された、IE ブラウザの種類とバージョンを特定する簡単で管理しやすい方法です。構文はコメント ベースなので、他のブラウザではステートメントは無視されます。これは、IE を対象とする * HTML フィルタなどのフィルタの代わりに使用するのに適しています。コードを見やすくするため、条件分岐コメントでは、IE 固有のスタイル シートへのリンクを設定することをお勧めします。
この方法のデメリットは、HTMLとして記述する必要があるため、サイトのHTMLファイルの量に比例して修正の量が多くなってしまうことです。しかし、SSIやプログラム等による出力であれば、そのデメリットを感じることはないでしょう。
以下に簡単に記述例を紹介します。
<!--[if IE ]><type="text/css" href="iestyles.css" ><![endif]-->
<!--[if IE 6]><type="text/css" href="iestyles.css" ><![endif]-->
<!--[if lte IE 6]><type="text/css" href="iestyles.css" ><![endif]-->
<!--[if gte IE 6]><type="text/css" href="iestyles.css" ><![endif]-->
<![if ! IE 6]><type="text/css" href="iestyles.css" ><![endif]-->
ここで紹介するCSSハックはCSSの構文チェックではエラーとなりません。また、今後も高い可能性で問題なく使用できると思われます。
基本的に最新バージョンよりも古いバージョンのブラウザ (変更が生じないか、または開発が終了したブラウザ) のみを対象とするCSSハックは使用しても問題の発生の確率は低いといえます。
対応ブラウザには、誤りがある可能性があります。例えば、IE8以下は将来IE9以下となる可能性を持っています。そのような可能性のあるものにはできるだけコメントを記載しています。
ハック | タイプ | 対応ブラウザ | CSS2バリデーション |
---|---|---|---|
スターハック | セレクタ | IE6以下,MacIE5以下 | Valid |
IE7スターハック | セレクタ | IE7 | Valid |
チャイルドセレクタハック | セレクタ | モダンブラウザ,IE7,MacIE5 | Valid |
コメントハック | セレクタ | IE6,IE7を除くすべて | Valid |
ファーストチャイルドハック | セレクタ | IE8,MacIE5,Opera9以下 | Valid |
インポータントハック | プロパティ | IE6 | Valid |
* html Selector { ... }
バグを利用しています。この方法は IE のみに適用されていましたが、IE 7 以降では無視されます
*:first-child+html Selector { ... }
バグを利用しています。
html > body Selector { ... }
IE6以下では実装されていない機能を利用しています。将来のバージョンも含まれる可能性があります。
html>/**/body Selector { ... }
バグを利用しています。将来のバージョンも含まれる可能性があります。
html:first-child Selector { ... }
バグを利用しています。別の記述でhtml:\66irst-child Selector { ... }
も同じ動作をしますが、使用しない方が良いでしょう。将来のバージョンも含まれる可能性があります。
Property: Value !important; Property: Value;
バグを利用しています。セレクタ内で!important指定があるプロパティの後に、同じプロパティがあると、IE6では先に記載された!important指定が無視されます。他のブラウザでは!importantの指定が有効となるので、注意してください。
ここで紹介するCSSハックは、次の5つのいずれかもしくは複数に該当するため、非推奨としています。種類の把握や、危険を認識した上で使用することを前提として紹介します。 対応ブラウザには、誤りがある可能性があります。例えば、IE8以下は将来IE9以下となる可能性を持っています。そのような可能性のあるものにはできるだけコメントを記載しています。
ハック | タイプ | 対応ブラウザ | CSS2バリデーション |
---|---|---|---|
2スターハック | セレクタ | IE6以下,MacIE5以下 | Invalid |
アンダースコアハック | プロパティ | IE6以下 | Invalid |
隣接セレクタハック | セレクタ | IE6以下を除くすべて | Valid |
オーウェンハック | セレクタ | IE6以下を除くすべて | Valid |
属性セレクタハック | セレクタ | IE6以下とMacIE5を除くすべて | Valid |
スター+ハック | セレクタ | IE7,MacIE | Valid |
スター7ハック | セレクタ | IE7以下,MacIE5 | Invalid |
ハイフンハック | プロパティ | IE6以下 | Invalid |
スラッシュハック | プロパティ | IE7以下 | Invalid |
ハッシュハック | プロパティ | IE7以下 | Invalid |
アスタリスクハック | プロパティ | IE7以下 | Invalid |
!ieハック | プロパティ | IE7以下 | Invalid |
!important!ハック | プロパティ | IE7以下 | Invalid |
全角スペースハック | プロパティ | IE7以下 | Invalid |
タイトル属性ハック | その他 | IE7以下,MacIE5以下 | Valid |
タイトル属性ハック | その他 | IE8以下,Opera10,MacIE5以下 | Valid |
コメントハック | セレクタ | MacIE5を除くすべて | Valid |
コメントハック | セレクタ | IE6,IE7,MacIE5を除くすべて | Invalid |
コメントハック | セレクタ | IE6,IE7,MacIE5 | Invalid |
ルートセレクタハック | セレクタ | IE8以下,MacIE5を除くすべて | Invalid |
ファーストオブタイプハック | セレクタ | IE8以下,MacIE5,Firefox3以下を除くすべて | Invalid |
否定Lang疑似クラスハック | セレクタ | IE8以下,MacIE5を除くすべて | Invalid |
ノットターゲットハック | セレクタ | IE8以下,MacIE5を除くすべて | Invalid |
構造的な疑似クラスハック | セレクタ | IE8以下,MacIE5,Safari3以下を除くすべて | Invalid |
否定Nth Child疑似クラスハック | セレクタ | IE8以下,MacIE,Opera10以下を除くすべて | Invalid |
モズエニーリンクハック | セレクタ | IE7,FireFox,MacIE5 | Invalid |
モズエニーリードオンリーハック | セレクタ | IE7,FireFox1.5以上,MacIE5 | Invalid |
モズブロークンハック | セレクタ | IE7,FireFox3.0以上,MacIE5 | Invalid |
モズドキュメントハック | セレクタ | FireFox | Invalid |
コメントモズエニーリンクハック | セレクタ | FireFox,MacIE5 | Invalid |
エンプティハック | セレクタ | Firefox 1.5,2.0 | Invalid |
safariハック | セレクタ | safari | Invalid |
xmlns属性セレクタハック | セレクタ | Opera10,Safari3のXHTML | Invalid |
ウェブキットハック | セレクタ | webkit(chrome,safari,他) | Invalid |
Mac IEスターハック | セレクタ | MacIE5 | Valid |
インポートハック | その他 | MacIE5を除くすべて | Valid |
メディアタイプ混合ハック | セレクタ | MacIE5を除くすべて | Valid |
ホーリーハック、バックスラッシュハック | セレクタ | MacIE5を除くすべて | Valid |
ホーリーハック、バックスラッシュハック | セレクタ | MacIE5 | Valid |
ホーリーハック、バックスラッシュハック | セレクタ | IE8,MacIE5 | Valid |
* html*Selector { ... }
バグを利用しています。スターハックとスター7ハックを組み合わせたものです。
_Property: Value;
バグを利用しています。IE7で修正されました。IE7以降はカスタムプロパティとして処理されますが、適用はされません。
head + body Selector { ... }
IE6以前では実装されていない機能を利用しています。将来のバージョンも含まれる可能性があります。
head:first-child + body Selector { ... }
IE6以前では実装されていない機能を利用しています。将来のバージョンも含まれる可能性があります。
html[xmlns] Selector { ... }
IE6以前では実装されていない機能を利用しています。XHTMLの場合の必須属性を使用しています。将来のバージョンも含まれる可能性があります。
*+html Selector { ... }
バグを利用しています。また、Operaの古いバージョンも対象となるようです。
html*Selector { ... }
IE7以下では間にスペースがあると仮定されるバグを利用しています。htmlと*の間にスペースがないことに注意してください。将来のバージョンも含まれる可能性があります。
-Property: Value;
バグを利用しています。IE7で修正されました。
/Property: Value;
バグを利用しています。IE8は含まれません。
#Property: Value;
バグを利用しています。IE8は含まれません。
*Property: Value;
バグを利用しています。IE8は含まれません。将来のバージョンも含まれる可能性があります。
Property: Value !ie;
IE7以下では!importantの代わりに無効な識別子が指定された場合、識別子は無視されプロパティは有効となります。その他のブラウザではプロパティは無効となります。ただし!importantとはなりません。ie以外の識別子でも同様ですが、ieで動作する意味を込めて!ieと記述します。将来のバージョンも含まれる可能性があります。
Property: Value !important!;
IE7以下では指定されたプロパティが!important指定されたものとして扱われます。その他のブラウザではプロパティは無効となります。将来のバージョンも含まれる可能性があります。
Property: Value;
バグを利用しています。プロパティの前に全角スペースを記述します。
<link rel="stylesheet" type="text/css" href="test1.css" media="all" title="test1">
<link rel="stylesheet" type="text/css" href="test2.css" media="all" title="test2">
バグを利用しています。タイトル属性が指定された2つの外部CSSがある場合、通常、2つめのCSSは読み込まれませんが、IE7以下では読み込みます。
<style type="text/css" title="test1"> ... </style>
<style type="text/css" title="test2"> ... </style>
バグを利用しています。タイトル属性が指定された2つのスタイルタグがある場合、通常、2つめのは無視されますが、IE8以下では適用されます。将来のバージョンも含まれる可能性があります。
Selector/* */ { ... }
Selector/**/ { ... }
Property/**/: Value;
Property/* */: Value;
Property/**/:/**/Value;
バグを利用しています。5つの方法のいずれも同じ動作となります。将来のバージョンも含まれる可能性があります。
html~/* */body Selector { ... }
バグを利用しています。将来のバージョンも含まれる可能性があります。
/**/ html* Selector { ... }
バグを利用しています。
:root Selector { ... }
対応していない機能を利用しています。CSS2ではInvalidですが、CSS3よりサポートされる予定です。将来のバージョンも含まれる可能性があります。
body:first-of-type Selector { ... }
対応していない機能を利用しています。CSS2ではInvalidですが、CSS3よりサポートされる予定です。将来のバージョンも含まれる可能性があります。
html:not([lang*=""]) Selector { ... }
対応していない機能を利用しています。将来のバージョンも含まれる可能性があります。
html:not(:target) Selector { ... }
対応していない機能を利用しています。将来のバージョンも含まれる可能性があります。
body:nth-of-type(1) Selector { ... }
対応していない機能を利用しています。将来のバージョンも含まれる可能性があります。
html:not(:nth-child(n)) Selector { ... }
対応していない機能を利用しています。将来のバージョンも含まれる可能性があります。
Selecter , x:-moz-any-link, x:only-child { ... }
Firefox固有の機能を利用しています。将来のバージョンも含まれる可能性があります。
Selecter , x:-moz-read-only, x:only-child { ... }
Firefox固有の機能を利用しています。将来のバージョンも含まれる可能性があります。
Selecter , x:-moz-broken , x:only-child { ... }
Firefox固有の機能を利用しています。将来のバージョンも含まれる可能性があります。
@-moz-document url-prefix() { Selector { ... } }
Firefox固有の機能を利用しています。将来のバージョンも含まれる可能性があります。
html>/**/body Selector, x:-moz-any-link { ... }
Firefox固有の機能を利用しています。将来のバージョンも含まれる可能性があります。
body:empty Selector { ... }
Firefox 1.5 と 2.0ではbody:emptyはbody要素が選択されます。このセレクターはCSS2では構文エラーとなりますが、CSS3ドラフトではエラーとはなりません。将来のバージョンも含まれる可能性があります。
/* \*/html:\66irst-child Selector {} /* */
ホーリーハックとファーストチャイルドハックを利用しています。将来のバージョンも含まれる可能性があります。
html[xmlns*=""] body:last-child Selector{ ... }
バグを利用しています。将来のバージョンも含まれる可能性があります。
@media screen and (-webkit-min-device-pixel-ratio:0){ Selector {}}
Webkit固有の機能を使用しています。将来のバージョンも含まれる可能性があります。
* html>body Selector { ... }}
バグを利用しています。将来のバージョンも含まれる可能性があります。
@import'style.css';
@import"style.css";
@import 'style.css';
@import url('style.css');
MacIE5ではいずれの記述方法も無視されます。
@media all { Selector { ... } }
対応していない機能を利用しています。MacIE5では無視されます。
/* \*/ Selector { ... } /* */
バグを利用しています。MacIE5では\*はエスケープされるため無視されます。
//* \*//*/ Selector { ... } /* */
バグを利用しています。
/*\*/ html:\66irst-child /**/ Selector{ ... }
バグを利用しています。将来のバージョンも含まれる可能性があります。