web-dev-qa-db-ja.com

有効なCSSでIE7とIE8をどのようにターゲットにしますか?

W3C準拠のCSSでIE7およびIE8をターゲットにしたい。あるバージョンのCSSを修正しても、他のバージョンのCSSが修正されない場合があります。どうすればこれを達成できますか?

65
Wasim Shaikh

明示的にターゲットIE HTMLとCSSを使用したハッキン​​グのないバージョン

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/ をご覧ください。

ターゲットIE CSS "Hacks"のバージョン

さらに重要なのは、IEバージョン。

IE8以下をターゲットにするには「\ 9」を使用します。
IE7以下をターゲットにするには「*」を使用します。
IE_をターゲットにするには「_」を使用します。

例:

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は条件文を認識しないため、これを使用して「ie10」クラスを<html>要素に適用できます

<!doctype html>
    <html lang="en">
    <!--[if !IE]><!--><script>if (/*@cc_on!@*/false) {document.documentElement.className+=' ie10';}</script><!--<![endif]-->
        <head></head>
        <body></body>
</html>
164
potench

条件付きコメントを調べて、問題が発生しているIE用に別のシートを作成することをお勧めします。

 <!--[if IE 7]>
   <link rel="stylesheet" type="text/css" href="ie7.css" />
 <![endif]-->
21
scragar

あなたの質問への答え

IE8以下を除くすべてのブラウザーを選択する完全に有効な方法は、:not()疑似クラスを使用することです。 IEバージョン8以下は:not()をサポートしていないため、それを含むセレクターは無視されます。これは、次のようなことができることを意味します。

_p {color:red;}
p:not([ie8min]) {color:blue;}
_

これはまだ完全に有効なCSSですが、IE8以下では異なるスタイル(およびOpera <9.5およびSafari <3.2)をレンダリングします。

その他のトリック

ここに、私が見つけることができるすべての完全に有効なCSSブラウザー固有のセレクターのリストを示します。except古代のブラウザのタイプ( 12 ):

_/******  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 */
_

クレジットとソース:

9
Joeytje50

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;
}

脚注

可能であれば、ブラウザのターゲティングを避けてください。特定した問題を特定して修正します。サポート プログレッシブエンハンスメント および グレースフルデグラデーション 。このことを念頭に置いて、これは実稼働環境で常に取得できるとは限らない「理想的な世界」シナリオです。したがって、上記はいくつかの優れたオプションを提供するのに役立つはずです。


帰属/エッセンシャルリーディング

7
SW4

IE8には互換性モードがあるため(IE7と同じページをレンダリングできます)、IE7コードがIE8で機能しないことを心配する必要はありません。ただし、IEのさまざまなバージョンをターゲットにしたい場合、しばらくの間行われている方法は、 条件付きコメント または IE7をターゲットにするために*でCSSルールを開始し、以下 。または、サーバー上のユーザーエージェントに注意を払い、その情報に基づいて別のCSSファイルを作成することもできます。

4
Bjorn Tipling

実際の問題はIE8ではなく、IEの以前のバージョンで使用するハッキングです。

IE8は標準にほぼ準拠しているため、ハッキングはまったく必要ありません。おそらく、いくつかの調整のみが必要です。問題は、IE6およびIE7のハッキングを使用している場合です。 IE8ではなく、それらのバージョンにのみ適用されることを確認する必要があります。

しばらく前に、私たちの会社のWebサイトをIE8に対応させました。実際に変更したのは、IEページがIE8に準拠していることを通知するメタタグを追加することだけでした...

4
Guffa

Javascriptを使用して実行しました。 html要素に3つのcssクラスを追加します。

ie<version>
lte-ie<version>
lt-ie<version + 1>

IE7の場合、ie7lte-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);
                }
            }
        }
    }
})();

その後、.ie<version> potenchで記述されているスタイルシートのcssクラス。

(マリオのdetectIE関数を ユーザーがIE with jQuery を使用しているかどうかを確認します)

Lte-ie8やlt-ie8などを使用する利点は、IE9以下のすべてのブラウザー、つまりIE7〜IE9をターゲットにできることです。

1
Tahir Hassan