IEと、Microsoft Edgeだけ形が崩れてしまったりする場合の対処法-CSS編
IEはホームページを制作する側からすると迷惑以外なにものでもない。とはいえ、無視し続けるわけにもいかないので、しぶしぶ対応するしかない。
IEに対してちゃんと動いたり表示されたりするようにする事をIEハックと言ったりするが、今回はCSSでIEハックする方法を5つ紹介。
JavaScriptを使ってIEハックする方法もあるが、今回はより簡単なCSSの方法を紹介。
1. CSSファイルの記述でIEハックする方法
例えば、リスト表示のされかたの違いを例に。
ul li {
margin-bottom: 5px; /* Chrome、FireFox等 */
margin-bottom: 10px\9; /* IE10以下 */
*margin-bottom: 15px; /* IE7以下 */
_margin-bottom: 20px; /* IE6 */
}
IE6 -> 下に20px空白
IE7 -> 下に15px空白
IE8 -> 下に10px空白
IE9 -> 下に10px空白
IE10 -> 下に10px空白
その他のブラウザ -> 下に5px空白
となる。
ただし、この場合はCSSを書く順番が重要。
順番を間違えると、例えば margin-bottom: 5px; を一番下に書いてしまったりすると全て5pxに統一されてしまう。
CSSは上から下に読み込むのが原則なので、注意したい。
2. CSSファイルの記述で:targetを使う方法
:target はターゲット擬似クラスと呼ばれ、本来は、リンクをクリックしたら、移動先のCSSを書き換えたりするものだ。
しかしIEだけ対応していないので、これを逆に利用する。
ul li:not(:target) {
margin-bottom: 10px\9; /* IE9, IE10, \9を消せばIE11も適応 */
}
これで、:target を適用できない場合にだけ、margin-bottom が効いてくる。
IE9 -> margin-bottom: 10px
IE10 -> margin-bottom: 10px
\9 を消すと IE11 -> margin-bottom: 10px
\9 を消すと Microsoft Edge -> margin-bottom: 10px
その他のブラウザ -> 何もなし
3. CSSファイルでmediaアンカーを使う方法
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
ul li:not(:target) {
margin-bottom: 10px\9; /* IE10(\9を消せばIE11にも適用) */
}
}
-ms-high-contrast の本来の意味は、Webの表示にハイコントラストモードを使っているかの判定を行う。
-ms-high-contrast なので、マイクロソフト(つまりIE)のハイコントラストモードを判定している。
つまり、IEの場合だけCSSを読み込ませる。
-moz-high-contrasなどでFireFoxのハイコントラストモードを判定することも可能。
IE10 -> margin-bottom: 10px
\9 を消すと IE11 -> margin-bottom: 10px
\9 を消すと Microsoft Edge -> margin-bottom: 10px
その他のブラウザ -> 何もなし
4. HTMLの条件分岐で違うCSSを読み込ませる方法
CSSでなく、HTMLに書く方法。
<!–[if lt IE 10]>
<style type="text/css">
ul li {
margin-bottom: 10px; /* IE9以下 */
}
</style>
<![endif]–>
<!–[if IE 6]>
<style type="text/css">
selector {
margin-bottom: 20px; /* IE6のみ */
}
</style>
<![endif]–>
HTMLの条件分岐で、IE6やIE9以下でない場合はコメントアウトされ、IEの時にはスタイルシートを読み込む。
<!–[if lt IE 9]>
<link rel="stylesheet" href="/css/ie9style.css">
<![endif]–>
[if IE 9] でIE9のみ。
[if lt IE 10] で「10よりも下」なのでIE9以下。となる。
ただし、IE10以上ではサポートされていない!
5. HTMLのmetaタグで、ブラウザの仕様を強制的に統一する方法
<head>内にmetaタグでブラウザの仕様を統一することができる。
ただし、CSSファイルやjsファイルの読み込みよりも上に記述する必要がある。
(CSSフィイルを読み込んだ後でブラウザ仕様を統一しても意味がない。CSSファイルを読み込む前にブラウザ仕様を統一しなければならない)
<meta http-equiv="X-UA-Compatible" content="IE=9">
これで、IE9以上を全てIE9モードで表示。
<meta http-equiv="X-UA-Compatible" content="IE=6; IE=9">
これで、IE9以上ではIE9モード、IE8, 7ではIE6モードで表示される。
全て日常的に使われている方法だが、1. 2. 3. は厳密に言うと全て「間違ったCSS記述法」であり、ブラウザの対応非対応を利用した方法だ。
今後、IE12やIEの最新版が出てきた時にどのような動きになるか読めないのが嫌なところだ。