link
要素やstyle
要素のmedia
属性をJavaScriptで変更する場合のIEの挙動
HTML5に関してこんな記事が。
- HTML5 + CSS3 で組む場合、IE8 以下では JavaScript 有効でないと表示が崩れる心配がある件を Media Queries で何とかしてみる(
jeffreyfrancesco.org
)
IE8以下はHTML5で登場した新要素を認識しないため、そのままでは新要素にスタイルを充てることができません。そのため、html5shiv (html5.js)(code.google.com
)などJavaScriptを使う方法がありますが、スクリプトを無効にしているユーザーには意味がありません。
そこでIE8以下がMedia Queriesに対応していないことを利用して、あえて認識しないようなmedia
属性を記述し、JavaScriptで改めて認識する形に書き換える手法が紹介されています。このようにすることで、スクリプトが有効な環境であれば、html5.jsなども読み込まれるのでHTML5の新要素が認識され、またスクリプト無効な場合はlink
要素やstyle
要素で指定したスタイルが一切適用されなくなります。
style
属性で個々に指定したスタイルは適用されますが。
中途半端にスタイルが適用されるくらいならいっそブラウザのデフォルトスタイルとユーザースタイルシートのみで、という方針の場合は導入を検討してもよいかもしれません。
ところが、実施に試してみると特定の場合においてうまくいかないことが分かりました。たとえば次のHTML。
<!DOCTYPE html>
<html lang="ja">
<head>
<title>style要素のmedia属性をJavaScriptで書き換えてみる</title>
<style media="all">
p {
color: #00f; /* 文字色青 */
background: #fff; /* 背景白 */
}
@media print {
p {
color: #f00; /* 文字色赤 */
}
}
</style>
<script>
document.getElementsByTagName("style")[0].media = "all";
</script>
</head>
<body>
<p>この文字は何色になるでしょう?</p>
</body>
</html>
style
要素にmedia
属性が指定してあり、これをスクリプトで書き換えています。テストのため書き換え前後の値はどちらも"all"で、実用上の意味はありません。スタイルの中身はp
要素の文字色を青にするものですが、印刷時(@media print
)のみ赤色になるようにしています。
ほとんどのブラウザではスクリプトの有効・無効にかかわらず、ディスプレイに表示される文字色は青になりますが、IE8以下でスクリプト有効な場合のみ、なぜか赤色になります。link
要素で外部スタイルファイルを読み込む場合や、media
属性の書き換えを setAttribute()
で行った場合も同様の結果でした。
一方で、@media print
を @media screen
と変えて印刷を行うと青色になります。つまり、このおかしな挙動はディスプレイ表示時において、Media typesの指定が無視される事象に思えます。