Как один целевой IE7 и IE8 с допустимым CSS?


Я хочу нацелиться на IE7 и IE8 с W3C-совместимым CSS. Иногда исправление CSS для одной версии не исправляет для другой. Как я могу этого достичь?

7 64

7 ответов:

явно целевые версии 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 "хаки"

более к вашей точке зрения, вот хаки, которые позволяют вам ориентироваться на версии IE.

используйте "\9 " для таргетинга IE8 и ниже.
Используйте " * " для таргетинга IE7 и ниже.
Используйте " _ " для таргетинга IE6.

пример:

body { 
border:1px solid red; /* standard */
border:1px solid blue; /* 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>

Я бы рекомендовал изучить условные комментарии и сделать отдельный лист для IEs, с которыми у вас возникли проблемы.

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

ответ на ваш вопрос

полностью допустимый способ выбрать все браузеры, но IE8 и ниже использует :not() псевдо-класса. Так как IE версии 8 и ниже не поддерживают :not(), селекторы, содержащие его, будут игнорироваться. Это означает, что вы могли бы сделать что-то вроде этого:

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

это все еще полностью допустимый CSS, но он заставляет IE8 и ниже отображать разные стили (а также Opera

другой трюки

вот список всех полностью допустимых 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 */

кредиты & источники:

для более полного списка по состоянию на 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 {
    .ie67 {property:value;}
}

или

.ie67 { *property:value;}

или

.ie67 { #property:value;}

IE 6, 7 и 8

@media screen\,screen {
    .ie678 {property:value;}
}

IE 8

html>/**/body .ie8 {property:value;}

или

@media screen {
    .ie8 {property:value;}
}

режим стандартов IE 8 только

.ie8 { property /*\**/: value }

IE 8,9 и 10

@media screen {
    .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; }

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

сноска

по возможности избегайте таргетинга в браузере. Выявить и исправить любую проблему(ы) вы идентифицировать. Поддержка постепенное повышение и изящные деградации. Имея это в виду, это сценарий "идеального мира" не всегда достижимый в производственной среде, как таковой - вышеизложенное должно помочь обеспечить некоторые хорошие варианты.


Атрибуция / Существенное Чтение

Ну вам действительно не нужно беспокоиться о том, что код IE7 не работает в IE8, потому что IE8 имеет режим совместимости (он может отображать страницы так же, как и IE7). Но если вы все еще хотите ориентироваться на разные версии IE, способ, который был сделан на некоторое время, заключается в использовании условные комментарии или начните свое правило css с * для таргетинга IE7 и ниже. Или вы можете обратить внимание на пользовательский агент на серверах и создать на его основе другой CSS-файл информация.

фактическая проблема не IE8, но хаки, которые вы используете для более ранних версий IE.

IE8 довольно близко соответствует стандартам, поэтому вам не нужно никаких хаков вообще для этого, возможно, только некоторые настройки. Проблема в том, что если вы используете некоторые хаки для IE6 и IE7; вам нужно будет убедиться, что они применяются только к этим версиям, а не к IE8.

некоторое время назад я сделал веб-сайт нашей компании совместимым с IE8. Единственное, что я на самом деле изменил добавлялся мета-тег, который сообщает IE, что страницы совместимы с IE8...

Я сделал это с помощью Javascript. Я добавляю три класса css в элемент html:

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

так что для IE7, он добавляет ie7,lte-ie7 ...,lt-ie8 ...

вот код:

(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> класс css в вашей таблице стилей, как описано potench.

(используется функция обнаружения Марио в проверьте, если пользователь использует IE с jQuery)

преимущество иметь lte-ie8 и lt-ie8 etc это то, что вы можете настроить таргетинг на весь браузер меньше или равный IE9, то есть IE7 - IE9.