Виявлення IE11 за допомогою CSS Capability / Feature Detection


90

IE10 + більше не підтримує теги виявлення браузера для ідентифікації браузера.

Для виявлення IE10 я використовую JavaScript і визначено техніку перевірки можливостей для виявлення певних msпрефіксних стилів, таких як msTouchActionіmsWrapFlow .

Я хочу зробити те саме для IE11, але я припускаю, що всі стилі IE10 будуть підтримуватися і в IE11. Хто-небудь може допомогти мені визначити IE11 лише стилі чи можливості, які я міг би використати, щоб розрізнити ці два?

Додаткова інформація

  • Я не хочу використовувати виявлення типу User Agent, оскільки воно настільки плямисте, що його можна змінити, а також, я думаю, я вже читав, що IE11 навмисно намагається приховати факт, що це Internet Explorer.
  • Для прикладу того, як працює тестування можливостей IE10 , я використав цей JsFiddle (не мій) як основу для мого тестування.
  • Також я очікую багато відповідей "Це погана ідея ...". Однією з моїх потреб для цього є те, що IE10 стверджує, що щось підтримує, але це дуже погано реалізовано, і я хочу мати можливість розрізняти IE10 та IE11 +, щоб я міг перейти до методу виявлення на основі можливостей у майбутньому.
  • Цей тест поєднаний із тестом Modernizr, який просто зробить деяку функціональність "запасною" до менш гламурної поведінки. Ми не говоримо про критичну функціональність.

ТАКОЖ Я вже використовую Modernizr, але тут це не допомагає. Мені потрібна допомога для вирішення мого чітко заданого питання, будь ласка.


3
Чому потрібно знати, який браузер є у користувача? Чи недостатньо виявлення функцій / префіксів css / умов css?
David-SkyMesh

4
Я забув згадати, що у нас є причини для необхідності виявляти браузери, і тестування можливостей не допомагає. Тільки одна з наших проблем полягає в тому, що IE10 каже, що щось підтримує, але робить це не дуже добре.
dano

2
@ David-SkyMesh - Ні. На жаль, цього недостатньо. Я хотів би, щоб це було, але це не так.
dano

1
@Evildonald Ви не відповіли, чому вам потрібно це знати - конкретно. Цілком може бути, що це проблема XY. (Тобто: ви просите використовувати , щоб допомогти з X - виявлення IE11 - коли ми могли відповісти на інше питання Y - як бути сумісна з великою кількістю браузерів включно IE11 для ЦІЛЬОВОЇ Z)
Давид-SkyMesh

1
У мене був .js, який виявляє версії браузера, і там говорилося, що ie11 - це firefox. що відбувається, тобто розробники!
Даніель Чонг

Відповіді:


163

У світлі розвитку нитки я оновив наступне:

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\0) and (min-resolution: .001dpcm) { 
 // IE9 CSS
 .ie9{property:value;}
}

IE 9 і вище

@media screen and (min-width:0\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;}
}

Використання -ms-high-contrastзасобів, на які не буде націлено MS Edge, оскільки Edge не підтримує-ms-high-contrast .

IE 11

_:-ms-fullscreen, :root .ie11up { property:value; }

Альтернативи Javascript

Модернізр

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

Виноска

Якщо можливо, визначте та усуньте будь-які проблеми без злому. Підтримуйте поступове вдосконалення та витончену деградацію . Однак це сценарій „ідеального світу”, який не завжди можна отримати, як такий - вищезазначене має допомогти запропонувати кілька хороших варіантів.


Атрибуція / Основне читання


3
Це справді має бути відповіддю. Чудова деталь!
egr103

IE10 лише не працює для мене. Коса коса риса-9 не видаляє IE11. Я намагаюся показати div для IE 10, але не для IE11 ... Він все ще відображається в IE 11 ...
Merc

Ах дивно. Він працює з більшістю властивостей, але clip: auto\9;все ще трактується як clip: auto;в IE 11. Якось це не ігнорується ...
Merc

2
Для мене другий варіант IE10 спрацював для IE11: @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { .relevant_selectors_for_situation {property:value;} }я знайшов його в mediacurrent.com/blog/…
cedricdlb

1
Після прочитання всього цього, мені здається, -ms-high-contrast: activeварто чогось уникати, оскільки згідно специфікацій MS ви фактично націлитесь на висококонтрастних користувачів тем у Edge за допомогою ваших правил IE 10/11. На цій сторінці посилання на цю відповідь -ms-high-contrastнасправді говорить, що лише -ms-high-contrast: noneзначення більше не підтримується. Думаю, про це ніхто не згадує, оскільки більшість людей не вмикають режим високої контрастності, а більшість людей не використовують Edge. Але все-таки є хтось , хто має таку конфігурацію, і це, мабуть, не круто для них.
дматамалес

39

Для націлювання лише на IE10 та IE11 (а не на Edge):

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {  
   /* add your IE10-IE11 css here */   
}

1
Щось на зразок цього теж може бути місином!
дано

2
Це націлено лише на IE11 або Edge теж?
Метью Фелгейт

2
Цілі IE10 і IE11, але не край.
Джефф Клейтон,

23

Тож я врешті знайшов своє рішення цієї проблеми.

Після пошуку в документації Microsoft мені вдалося знайти новий стиль лише IE11msTextCombineHorizontal

У своєму тесті я перевіряю стилі IE10, і якщо вони позитивно збігаються, то перевіряю стиль IE11. Якщо я знайду, то це IE11 +, якщо ні, то IE10.

Приклад коду: виявлення IE10 та IE11 за допомогою тестування можливостей CSS (JSFiddle)

Я буду оновлювати приклад коду іншими стилями, коли виявлю їх.

ПРИМІТКА: Це майже напевно буде визначати IE12 та IE13 як "IE11", оскільки ці стилі, ймовірно, будуть перенесені вперед. Я буду додавати подальші тести по мірі випуску нових версій, і, сподіваюся, зможу знову покластися на Modernizr.

Я використовую цей тест на запасну поведінку. Резервна поведінка - це просто менш гламурний стиль, він не має зниженої функціональності.


8
Якщо хтось збирається до -1 цієї відповіді, будь-ласка, будь-ласка, поважтесь з технічною причиною. Ви можете з цим не погодитися .. але це правильно і працює.
dano

7
Як ви знаєте, чи дасть цей код правильні результати в IE12, IE13 тощо?
Євген

6
Чому ви використовуєте цей метод замість if (document.documentMode === 11) { ... }? Якщо, звичайно, ви не хочете використовувати властивість CSS у @supportsправилі at (яке, до речі, ще не підтримується в IE).
Rob W

1
Якщо у вас є наявні класи у вашому тезі body, це перезапише їх. Ось дуже незначне виправлення: jsfiddle.net/jmjpro/njvr1jq2/1 .
jbustamovej

1
Крім того, ви захочете приховати елемент ieVersion за допомогою css: #ieVersion {display: none}
jbustamovej


9

Ви можете написати свій код IE11 як звичайний, а потім використовувати @supportsта перевіряти наявність властивостей, які не підтримуються в IE11, наприклад grid-area: auto.

Потім ви можете написати свої сучасні стилі браузера в цьому. IE не підтримує @supportsправило і використовуватиме оригінальні стилі, тоді як вони будуть замінені в сучасних браузерах, які підтримують @supports.

.my-class {
// IE the background will be red
background: red;

   // Modern browsers the background will be blue
    @supports (grid-area: auto) {
      background: blue;
    }
}

2
Це працює і є хорошим рішенням, але наведені аргументи невірні. IE11 взагалі не підтримує @supports, тому ігнорує будь-що в @supportsблоці. Таким чином, ви можете помістити що-небудь в умовний @supports (наприклад @supports (display: block)), і IE11 все одно пропустить його.
CodeBiker

1
Це те, що я мав на увазі під "IE 11 ігноруватиме", але ви маєте рацію, що не зовсім зрозуміло. Я оновив відповідь, щоб зрозуміти, що IE не підтримує @supports.
Antfish

9

Ось відповідь на 2017 рік, де ви, мабуть, дбаєте лише про те, щоб відрізнити <= IE11 від> IE11 ("Край"):

@supports not (old: ie) { /* code for not old IE here */ }

Більш наочний приклад:

body:before { content: 'old ie'; }
/**/@supports not (old: ie) {
body:before { content: 'not old ie'; }
/**/}

Це працює, оскільки IE11 насправді навіть не підтримує @supports, а всі інші відповідні комбінації браузер / версія підтримують .


4

Це спрацювало для мене

if(navigator.userAgent.match(/Trident.*rv:11\./)) {
    $('body').addClass('ie11');
}

А потім у файлі css речі з префіксом

body.ie11 #some-other-div

Коли цей браузер готовий до смерті?


4

Спробуйте це:

/*------Specific style for IE11---------*/
 _:-ms-fullscreen, :root 
 .legend 
{ 
  line-height: 1.5em;
  position: relative;
  top: -1.1em;   
}

3

Погляньте на цю статтю: CSS: Вибір агента користувача

В основному, коли ви використовуєте цей сценарій:

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':'');

Тепер ви можете використовувати CSS для націлювання на будь-який браузер / версію.

Отже, для IE11 ми могли б зробити це:

Скрипка

html[data-useragent*='rv:11.0']
{
    color: green;
}

1
Це призведе до поломки у Firefox 11 (хоча зараз це не підтримується, це має значення). Він також має rv:11.0у своєму рядку агента користувача.
PhistucK

3

Використовуйте такі властивості:

  • !! window.MSInputMethodContext
  • !! document.msFullscreenEnabled

2

Вам слід використовувати Modernizr, він додасть клас до тегу body.

також:

function getIeVersion()
{
  var rv = -1;
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  else if (navigator.appName == 'Netscape')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

Зверніть увагу, що IE11 все ще перебуває в попередньому перегляді, і користувальницький агент може змінитися перед випуском.

Рядок User-agent для IE 11 наразі такий:

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko

Це означає, що ви можете просто протестувати для версій 11.xx,

var isIE11 = !!navigator.userAgent.match(/Trident.*rv 11\./)

Дякую Neo, але я вже додаю клас до свого тегу body І використовую Modernizr. Я шукаю спосіб відрізнити IE10 від IE11, не використовуючи User Agent, який не заслуговує на довіру.
dano

Відсутня двокрапка в rv 11. var isIE11 = !! navigator.userAgent.match (/Trident.*rv:11 \ ./)
T.CK

2

Можливо, Layout Engine v0.7.0 є хорошим рішенням для вашої ситуації. Він використовує виявлення функцій браузера і може виявляти не тільки IE11 та IE10, але також IE9, IE8 та IE7. Він також виявляє інші популярні браузери, включаючи деякі мобільні браузери. Він додає клас до тегу html, простий у використанні і добре працює під час досить глибокого тестування.

http://mattstow.com/layout-engine.html


2

Якщо ви використовуєте Modernizr - тоді ви можете легко розрізнити IE10 та IE11.

IE10 не підтримує pointer-eventsвластивість. IE11 робить. ( канюс )

Тепер, виходячи з класу, який вставляє Modernizr, ви можете мати такий CSS:

.class
{ 
   /* for IE11 */
}

.no-pointerevents .class
{ 
   /* for IE10 */
}

2

Ви можете використовувати js і додати клас у html, щоб підтримувати стандарт умовних коментарів :

  var ua = navigator.userAgent,
      doc = document.documentElement;

  if ((ua.match(/MSIE 10.0/i))) {
    doc.className = doc.className + " ie10";

  } else if((ua.match(/rv:11.0/i))){
    doc.className = doc.className + " ie11";
  }

Або використовуйте lib як bowser:

https://github.com/ded/bowser

Або модернізатор для виявлення особливостей:

http://modernizr.com/


2

Виявити IE та його версії насправді надзвичайно просто, принаймні надзвичайно інтуїтивно:

var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;

if (uA.indexOf('MSIE 6') >= 0) {
    browser = 'IE';
    ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
    browser = 'IE';
    ieVersion = 7;
}
if (document.documentMode) { // as of IE8
    browser = 'IE';
    ieVersion = document.documentMode;
}

.

Таким чином, ви також ловите високі версії IE у режимі сумісності / перегляду. Далі справа в присвоєнні умовних класів:

var htmlTag = document.documentElement;
if (browser == 'IE' && ieVersion <= 11)
    htmlTag.className += ' ie11-';


2

Я зіткнувся з тією ж проблемою із формою гравітації (WordPress) у IE11. Стиль стовпця форми "display: inline-grid" зламав макет; застосовуючи відповіді вище, вирішено розбіжності!

@media all and (-ms-high-contrast:none){
  *::-ms-backdrop, .gfmc-column { display: inline-block;} /* IE11 */
}

1

Крок назад: чому ви навіть намагаєтесь виявити "Internet Explorer", а не "мій веб-сайт повинен робити X, чи підтримує цей браузер цю функцію? Якщо так, хороший браузер. Якщо ні, тоді я повинен попередити користувача".

Вам слід натиснути http://modernizr.com/ замість того, щоб продовжувати те, що ви робите.


Дякую за альтернативне рішення, але я вже використовую Modernizr, і IE10 неправильно представляє свої можливості.
дано

4
Я припускаю, що ви знаєте, які, і подали запит до Modernizr, щоб вони могли додати більше перевірок Modernizrs для цього конкретного браузера? (Якщо ні, то слід. Якщо ви виявите щось, що впливає на сотні тисяч розробників, подання цього з людьми, відповідальними за шим, є єдиним правильним
способом

7
Тим з нас, хто пише користувальницький код, вам часто потрібна відповідь зараз , а не помилка, що зберігається у сторонній бібліотеці, і там виправлення. Це означає, що приємно, що ви хочете, щоб вони вдосконалили Modernizr, але це не підходить тут.
Dean J

1
Я вважаю, що виявлення справжнього браузера є розумною метою як такою.
gwg

@DeanJ впевнений, і на ці питання хтось інший також дасть відповідь. Це не робить менш важливим отримання таких відповідей, які підказують вам подумати про те, що ви робите. Крім того, на момент репірування в публікації не було жодних редагувань, і не було жодної згадки про "мені це потрібно, щоб це працювало прямо зараз", тому у мене не було підстав вважати, що вони не хочуть перевірки реальності.
Майк 'Помакс' Камерманс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.