これって使えたっけ?今だからこそ IE8 対応コーディングのポイントをおさらい

これって使えたっけ?今だからこそ IE8 対応コーディングのポイントをおさらい

こんにちは。Latinです。
今年は長めの夏休みが取れそうなので、旅行でも行こうと画策しております。

さて今回は、久々にコーディングネタです。
弊社の最近の案件では、対象ブラウザがIE8+という案件がほとんどになってきました。

「安心してください。IE10以上です。」

なんて言われたら嬉しい限りなんですが、まだまだ少ないのが実状です。

「悪夢のIE7対応」を考えなくて良くなっただけでもコーディングはだいぶ楽になりましたが、「IE8」は「IE8」でいろんなクセを持ってますよね。
今回はそんな今だからこそ、「IE8対応のポイント」をまとめてみます。

【IE8の仕様編】

HTML5に対応していない

HTML5のサイトで「IE8対応」が必要になってくる場合、ポピュラーな方法としては二つあります。

  • html5shiv.js などの拡張ライブラリを IE9 以下のIEで読み込ませる
  • HTML5要素自体にはスタイルを当てずに内包する要素にスタイルを当てる
// html5shiv.js をIE9以下に読み込ませる
<!--[if lt IE 9]>
<script src="/shared/public/js/html5shiv-printshiv.min.js"></script>
<![endif]-->

html5shiv.js を使った方法では、 header、footer などの代表的なHTML5要素を「レイアウト崩れしないように認識してくれる」のですが、あくまでもそれだけの拡張に留まります。
また、HTML要素を無理矢理書き換えて処理する為、好ましくないという考え方が強くなってきています。

// HTML5要素自体にスタイルを直接当てない
// NG
<header class="site-header">
<h1 class="site-name">バシャログ。</h1>
<!-- /.site-header --></header>

// OK
<header>
<div class="site-header">
<h1 class="site-name">バシャログ。</h1>
<!-- /.site-header --></div>
</header>

後者の方法では、従来通り div などを使ったマークアップとスタイリングを心がけ、HTML5に対応するモダンブラウザ向けにHTML5をマークアップしていく事で、IE8での表示も担保する、という方法になります。
最近はこちらの方が主流でしょうか。

レンダリングモードを meta タグで指定する事が可能に

何も指定しなかった場合、IE8でもIE7のレンダリングをしているんじゃないかというケースによく遭遇します。 その為のデバッグに費やす時間もバカになりません。
IE8 より meta タグでレンダリングモードを指定できるようになっていますので、無駄な苦労はこれで解消するはず。

<meta http-equiv="X-UA-Compatible" content="IE=Edge"></p>

【IE8で使えるモノ編】

よく使う table-cell と inline-block が使える

何かと重宝する display プロパティのこの二つの値。IE8でも使えます。

.box {
	display: table;
	width: 100%;
}

.box .column {
	display: table-cell;
	width: 50%;
}

.box .column .title {
	display: inline-block;
	vertical-align: middle;
}

box-sizing が使える

超絶便利な box-sizing ちゃん。この子が使えると随分捗りますよね!

.box {
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}

疑似要素「:before」、「:after」が使える

CSSでアイコンや吹き出しを追加したりと、イレギュラーな対応でも何かと応用が利く、これらの疑似要素も使えます。

ul li {
	position: relative;
}

ul li:before {
	display: block;
	position: absolute;
	top: 0;
	left: 0;
	content: "\f138";
	width: 1em;
	height: 1em;
	font-family: FontAwesome;
}

疑似要素「:focus」が使える

フォームのスタイリングに良く使いますが、この辺りが使えるとフォームのデザインも幅が出ていいですよね。

input[type="text"]:focus {
	background-color: yellow;
}

【IE8で使えないモノ・バグ編】

opacity の不具合

最近では、マウスオーバー時の画像をわざわざ作らず、opacity の操作だけでマウスオーバー効果を再現するケースも結構多いかと思います。
ただ、IE8 でも opacity 操作を実現させるためには、IEの独自プロパティである「filter」や「-ms-filter」などのプロパティを併記する必要があります。
また、透過PNGの opacity 操作をする際にはこれまた注意が必要で、背景が黒ずんでしまったりするケースがあります。
IE8のopacity操作には色々と注意が必要です。

.btn:hover {
	-ms-filter: "alpha(opacity=70)";
	filter: alpha(opacity=70);
	opacity: 0.7;
}

border-radius が使えない

ボタンや矩形の角丸を付ける為によく使う border-radius はIE8では未サポート。
ただし、IE8では「角丸の描画ができないだけ」ですので、致命的な表示崩れは繋がりにくいケースがほとんどです。
この辺りは Progressive Enhancement で、IE8での角丸描画を切り捨ててしまうだけで問題ないでしょう。

// IE8 NG
.btn {
	border-radius: 4px;
}

box-shadow、text-shadow が使えない

こちらもIE8未サポートですが、大きな表示崩れには繋がりづらい部分だと思います。
ここも Progressive Enhancement で。

// IE8 NG
.btn {
	-webkit-box-shadow: 2px 2px 2px black;
	box-shadow: 2px 2px 2px black;
}

background-size が使えない

こちらも最近の案件ではよく使うプロパティですが、IE8 では未対応。
対応させる為には jQuery プラグインなどを使うケースが多いでしょうか。

// IE8 NG
.box {
	background: url(/img/background.png) no-repeat 0 0;
	-webkit-background-size: 100% auto;
	background-size: 100% auto;
}

transition、transform、animation が使えない

動きを持たせたい場合など、リッチな見せ方をしたい場合によく使いますが、これらのプロパティはIE10+の対応となっています。
IE8、IE9対応が必須のようなら、CSSではなくJSを使ったアニメーション実装手段を検討した方が良さそうです。

// IE8 NG
.btn {
	-webkit-transition: all ease 0.2s;
	transition: all ease 0.2s;
}

疑似要素「:last-child」や「:nth-child(n)」は使えない

使えると非常に楽になるこれらの疑似要素ですが、残念ながら使えません。
どうしても使いたい場合は、JSライブラリを使って、使える疑似要素を拡張するなどの対応が必要です。

// IE8 NG
ul li:last-child {
	margin-right: 0;
}

ul li:nth-child(even) {
	margin-right: 0;
}

background: rgba(); が使えない

背景色と透過度を指定する際に使う「background: rgba();」も IE8 では効きません。
代替手段としては、IE8をCSSハックして透過PNGなどで代用するケースなどがあります。

// IE8 NG
.box {
	background: rgba(0,0,0,0.5);
}

IE8用に別のCSSをあてる方法

IE8の為だけに別のCSSを記述する必要がないというのが一番良いのですが、そうはいかないケースも出てくると思います。
その場合の実装方法はいくつかありますが、代表的なパターンをご紹介。

CSSハック

.hoge {
	color: blue9;
}

条件付きコメントでHTMLタグに「.ie8」を付与

HTML

<!DOCTYPE html>
<!--[if IE 8]>
<html lang="ja" class="ie8">
<![endif]-->
<html lang="ja">

CSS

.ie8 .hoge {
	color: blue;
}

まとめ

いかがでしたでしょうか。
私個人がそうなんですが、まだまだIE7対応に脳内を支配されていて、「あれ、これってIE8使えたっけ?」と思う事もしばしば。
みなさんもぜひ一度、この辺りで立ち返ってみてはいかがでしょうか。

参考

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ