有効なCSSを使用してIE7とIE8をどのようにターゲットにしますか?
-
03-07-2019 - |
質問
W3C準拠のCSSでIE7とIE8をターゲットにしたい。あるバージョンのCSSを修正しても、他のバージョンのCSSが修正されないことがあります。どうすればこれを達成できますか?
解決
HTMLとCSSを使用して、ハッキングなしでIEバージョンを明示的にターゲティングする
CSSをハックしたくない場合は、このアプローチを使用します。ブラウザ固有のクラスを<html>
要素に追加して、後でブラウザに基づいて選択できるようにします。
例
<!doctype html>
<!--[if IE]><![endif]-->
<!--[if lt IE 7 ]> <html lang="en" class="ie6"> <![endif]-->
<!--[if IE 7 ]> <html lang="en" class="ie7"> <![endif]-->
<!--[if IE 8 ]> <html lang="en" class="ie8"> <![endif]-->
<!--[if IE 9 ]> <html lang="en" class="ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><html lang="en"><!--<![endif]-->
<head></head>
<body></body>
</html>
その後、CSSでターゲットブラウザに非常に厳密にアクセスできます。
例
.ie6 body {
border:1px solid red;
}
.ie7 body {
border:1px solid blue;
}
詳細については、 http://html5boilerplate.com/ をご覧ください
CSSでIEバージョンをターゲットにする<!> quot; Hacks <!> quot;
さらに重要なのは、IEバージョンをターゲットにできるハッキングです。
<!> quot; \ 9 <!> quot;を使用します。 IE8以下をターゲットにします。
<!> quot; * <!> quot;を使用します。 IE7以下をターゲットにします。
<!> quot; _ <!> quot;を使用します。 IE6をターゲットにします。
例:
body {
border:1px solid red; /* standard */
border:1px solid blue\9; /* IE8 and below */
*border:1px solid orange; /* IE7 and below */
_border:1px solid blue; /* IE6 */
}
更新:IE10を対象に
IE10は条件ステートメントを認識しないため、これを使用して<!> quot; ie10 <!> quotを適用できます。 <=>要素のクラス
<!doctype html>
<html lang="en">
<!--[if !IE]><!--><script>if (/*@cc_on!@*/false) {document.documentElement.className+=' ie10';}</script><!--<![endif]-->
<head></head>
<body></body>
</html>
他のヒント
条件付きコメントを調べて、問題が発生しているIE用に別のシートを作成することをお勧めします。
<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="ie7.css" />
<![endif]-->
質問への回答
IE8以下を除くすべてのブラウザーを選択する完全に有効な方法は、:not()
擬似クラスを使用することです。 IEバージョン8以下では:first-child
がサポートされていないため、それを含むセレクターは無視されます。これは、次のようなことができることを意味します。
p {color:red;}
p:not([ie8min]) {color:blue;}
これはまだ完全に有効なCSSですが、IE8以下では異なるスタイル(およびOpera <!> lt; 9.5およびSafari <!> lt; 3.2)をレンダリングします。
その他のトリック
これは、完全に有効なCSSブラウザー固有のすべてのセレクターのリストです。1つだけの古代のブラウザーを選択するものなど、非常に冗長と思われるもの( 1 、 2 ):
/****** First the hacks that target certain specific browsers ******/
* html p {color:red;} /* IE 6- */
*+html p {color:red;} /* IE 7 only */
@media screen and (-webkit-min-device-pixel-ratio:0) {
p {color:red;}
} /* Chrome, Safari 3+ */
p, body:-moz-any-link {color:red;} /* Firefox 1+ */
:-webkit-any(html) p {color:red;} /* Chrome 12+, Safari 5.1.3+ */
:-moz-any(html) p {color:red;} /* Firefox 4+ */
/****** And then the hacks that target all but certain browsers ******/
html> body p {color:green;} /* not: IE<7 */
head~body p {color:green;} /* not: IE<7, Opera<9, Safari<3 */
html:first-child p {color:green;} /* not: IE<7, Opera<9.5, Safari&Chrome<4, FF<3 */
html>/**/body p {color:green;} /* not: IE<8 */
body:first-of-type p {color:green;} /* not: IE<9, Opera<9, Safari<3, FF<3.5 */
:root p {color:green;} /* not: IE<9, Opera<9.5 */
body:not([oldbrowser]) p {color:green;} /* not: IE<9, Opera<9.5, Safari<3.2 */
クレジット<!> amp;ソース:
2015年時点でのより完全なリスト:
IE 6
* html .ie6 {property:value;}
または
.ie6 { _property:value;}
IE 7
*+html .ie7 {property:value;}
または
*:first-child+html .ie7 {property:value;}
IE 6および7
@media screen\9 {
.ie67 {property:value;}
}
または
.ie67 { *property:value;}
または
.ie67 { #property:value;}
IE 6、7、および8
@media \0screen\,screen\9 {
.ie678 {property:value;}
}
IE 8
html>/**/body .ie8 {property:value;}
または
@media \0screen {
.ie8 {property:value;}
}
IE 8標準モードのみ
.ie8 { property /*\**/: value\9 }
IE 8,9および10
@media screen\0 {
.ie8910 {property:value;}
}
IE 9のみ
@media screen and (min-width:0) and (min-resolution: .001dpcm) {
// IE9 CSS
.ie9{property:value;}
}
IE 9以降
@media screen and (min-width:0) and (min-resolution: +72dpi) {
// IE9+ CSS
.ie9up{property:value;}
}
IE 9および10
@media screen and (min-width:0) {
.ie910{property:value;}
}
IE 10のみ
_:-ms-lang(x), .ie10 { property:value\9; }
IE 10以降
_:-ms-lang(x), .ie10up { property:value; }
または
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
.ie10up{property:value;}
}
IE 11(以上)。
_:-ms-fullscreen, :root .ie11up { property:value; }
Javascriptの代替
Modernizr
Modernizrは、ページのロード時に迅速に実行され、機能を検出します。それから 結果でJavaScriptオブジェクトを作成し、クラスをクラスに追加します html要素
ユーザーエージェントの選択
Javascript:
var b = document.documentElement;
b.setAttribute('data-useragent', navigator.userAgent);
b.setAttribute('data-platform', navigator.platform );
b.className += ((!!('ontouchstart' in window) || !!('onmsgesturechange' in window))?' touch':'');
以下をhtml
要素に追加します(例):
data-useragent='Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)'
data-platform='Win32'
非常にターゲットを絞ったCSSセレクターの許可:例:
html[data-useragent*='Chrome/13.0'] .nav{
background:url(img/radial_grad.png) center bottom no-repeat;
}
脚注
可能であれば、ブラウザのターゲティングを避けます。特定した問題を特定して修正します。 プログレッシブエンハンスメント および グレースフルデグラデーション 。そのことを念頭に置いて、これは実稼働環境で常に入手できるとは限らない「理想的な世界」のシナリオです。上記はいくつかの優れたオプションを提供するのに役立つはずです。
帰属/エッセンシャルリーディング
IE8には互換モードがあるため(IE7と同じページを表示できます)、IE8でIE7コードが機能しないことを心配する必要はありません。ただし、IEのさまざまなバージョンをターゲットにしたい場合、しばらくの間行われている方法は、条件付きコメントまたは CSSルールの開始IE7以下を対象とする場合はa * 。または、サーバー上のユーザーエージェントに注意を払い、その情報に基づいて別のCSSファイルを作成することもできます。
実際の問題はIE8ではなく、IEの以前のバージョンで使用するハッキングです。
IE8は標準にほぼ準拠しているため、ハッキングはまったく必要ありません。おそらく、いくつかの調整のみが必要です。問題は、IE6およびIE7のハッキングを使用している場合です。 IE8ではなく、それらのバージョンにのみ適用されることを確認する必要があります。
先ほど、IE8と互換性のある当社のWebサイトを作成しました。実際に変更したのは、ページがIE8に準拠していることをIEに伝えるメタタグを追加することだけです...
Javascriptを使用して実行しました。 html要素に3つのcssクラスを追加します。
ie<version>
lte-ie<version>
lt-ie<version + 1>
IE7では、ie7
、lte-ie7
...、lt-ie8
...を追加します
JavaScriptコードは次のとおりです。
(function () {
function getIEVersion() {
var ua = window.navigator.userAgent;
var msie = ua.indexOf('MSIE ');
var trident = ua.indexOf('Trident/');
if (msie > 0) {
// IE 10 or older => return version number
return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
} else if (trident > 0) {
// IE 11 (or newer) => return version number
var rv = ua.indexOf('rv:');
return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
} else {
return NaN;
}
};
var ieVersion = getIEVersion();
if (!isNaN(ieVersion)) { // if it is IE
var minVersion = 6;
var maxVersion = 13; // adjust this appropriately
if (ieVersion >= minVersion && ieVersion <= maxVersion) {
var htmlElem = document.getElementsByTagName('html').item(0);
var addHtmlClass = function (className) { // define function to add class to 'html' element
htmlElem.className += ' ' + className;
};
addHtmlClass('ie' + ieVersion); // add current version
addHtmlClass('lte-ie' + ieVersion);
if (ieVersion < maxVersion) {
for (var i = ieVersion + 1; i <= maxVersion; ++i) {
addHtmlClass('lte-ie' + i);
addHtmlClass('lt-ie' + i);
}
}
}
}
})();
その後、potenchの説明に従って、スタイルシートで.ie<version>
cssクラスを使用します。
(
lte-ie8やlt-ie8などを使用する利点は、IE9以下のすべてのブラウザー、つまりIE7-IE9をターゲットにできることです。