CSS Yeteneği / Özellik Algılama kullanarak IE11'i algılama


90

IE10 + artık bir tarayıcıyı tanımlamak için tarayıcı algılama etiketlerini desteklemiyor.

Emin algılamak için JavaScript ve kabiliyet-test tekniği kullanıyorum IE10 algılamak için msönceden sabitlenmiş stilleri tanımlandığı gibi msTouchActionvemsWrapFlow .

IE11 için de aynısını yapmak istiyorum, ancak tüm IE10 stillerinin IE11'de de destekleneceğini varsayıyorum. İkisini birbirinden ayırmak için kullanabileceğim yalnızca IE11 stillerini veya yeteneklerini belirlememe yardımcı olan var mı?

Fazladan bilgi

  • Kullanıcı Aracısı türü algılamasını kullanmak istemiyorum çünkü çok sivilceli ve değiştirilebilir, ayrıca IE11'in kasıtlı olarak Internet Explorer olduğu gerçeğini gizlemeye çalıştığını okudum.
  • IE10 yetenek testinin nasıl çalıştığına dair bir örnek olarak, bu JsFiddle'ı (benim değil) testlerim için temel olarak kullandım.
  • Ayrıca "Bu kötü bir fikir ..." için birçok yanıt bekliyorum. Bunun için gereksinimlerimden biri, IE10'un bir şeyi desteklediğini iddia etmesidir, ancak çok kötü bir şekilde uygulanmıştır ve IE10 ile IE11 + arasında ayrım yapabilmek, böylece gelecekte yetenek tabanlı bir algılama yöntemine devam edebilmek istiyorum.
  • Bu test, daha az göz alıcı davranışa bazı işlevsellik "geri dönüşü" yapacak bir Modernizr testi ile birleştirilmiştir. Kritik işlevsellikten bahsetmiyoruz.

AYRICA Zaten Modernizr kullanıyorum, ancak burada yardımcı olmuyor. Açıkça sorulan soruma bir çözüm bulmak için yardıma ihtiyacım var lütfen.


3
Kullanıcının hangi tarayıcıya sahip olduğunu neden bilmeniz gerekiyor? Özellik algılama / css önekleri / css koşul ifadeleri yeterli değil mi?
David-SkyMesh

4
Tarayıcıları tespit etmeye ihtiyaç duymak için nedenlerimiz olduğunu, yetenek testinin yardımcı olmadığını söylemeyi unuttum. Sorunlarımızdan sadece biri, IE10'un bir şeyi desteklediğini söylüyor, ancak pek iyi yapmıyor olmasıdır.
dano

2
@ David-SkyMesh - Hayır. Maalesef yeterli değil. Olmasını isterdim ama değil.
dano

1
@Evildonald Neden bilmeniz gerektiğini cevaplamadınız - özellikle. Bu bir XY sorunu olabilir. (yani: X ile yardım etmek için kullan - IE11'i tespit etmek - farklı bir soruyu yanıtlayabildiğimizde Y - TASK Z için IE11 dahil daha fazla tarayıcıyla nasıl uyumlu olabileceğimizi)
David-SkyMesh

1
Tarayıcı sürümlerini algılayan bir .js'im vardı ve ie11'in bir firefox olduğunu söylüyordu. ne oluyor, yani geliştiriciler!
Daniel Cheung

Yanıtlar:


165

Gelişen iş parçacığı ışığında, aşağıdakileri güncelledim:

IE 6

* html .ie6 {property:value;}

veya

.ie6 { _property:value;}

IE 7

*+html .ie7 {property:value;}

veya

*:first-child+html .ie7 {property:value;}

IE 6 ve 7

@media screen\9 {
    .ie67 {property:value;}
}

veya

.ie67 { *property:value;}

veya

.ie67 { #property:value;}

IE 6, 7 ve 8

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

IE 8

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

veya

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

Yalnızca IE 8 Standartları Modu

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

IE 8,9 ve 10

@media screen\0 {
    .ie8910 {property:value;}
}

Yalnızca IE 9

@media screen and (min-width:0\0) and (min-resolution: .001dpcm) { 
 // IE9 CSS
 .ie9{property:value;}
}

IE 9 ve üstü

@media screen and (min-width:0\0) and (min-resolution: +72dpi) {
  // IE9+ CSS
  .ie9up{property:value;}
}

IE 9 ve 10

@media screen and (min-width:0) {
    .ie910{property:value;}
}

Yalnızca IE 10

_:-ms-lang(x), .ie10 { property:value\9; }

IE 10 ve üstü

_:-ms-lang(x), .ie10up { property:value; }

veya

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
   .ie10up{property:value;}
}

Kullanımı -ms-high-contrastvasıtası MS Kenar, hedeflenen olmayacak Kenar desteklemediği olarak-ms-high-contrast .

IE 11

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

Javascript alternatifleri

Modernizr

Modernizr, özellikleri algılamak için sayfa yüklemede hızlı çalışır; daha sonra sonuçlarla bir JavaScript nesnesi oluşturur ve html öğesine sınıflar ekler

Kullanıcı aracısı seçimi

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

Aşağıdakileri htmlöğeye ekler (örneğin) :

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'

Çok hedeflenmiş CSS seçicilere izin verme, örneğin:

html[data-useragent*='Chrome/13.0'] .nav{
    background:url(img/radial_grad.png) center bottom no-repeat;
}

Dipnot

Mümkünse, herhangi bir sorunu kırmadan tanımlayın ve düzeltin. Destek ilerici geliştirme ve zarif bozulması . Ancak, bu her zaman elde edilemeyen bir 'ideal dünya' senaryosudur - yukarıdakiler bazı iyi seçenekler sağlamaya yardımcı olacaktır.


Atıf / Temel Okuma


3
Bu gerçekten cevap olmalı. Güzel detay!
egr103

IE10 sadece benim için çalışmıyor. Ters eğik çizgi-9, IE11'i kaldırmaz. IE 10 için bir div göstermeye çalışıyorum ama IE11 için değil ... Hala IE 11'de görünüyor ...
Merc

Ah tuhaf. Mülklerin çoğu üzerinde çalışıyor, ancak clip: auto\9;yine clip: auto;de IE 11'deki gibi yorumlanıyor. Bir şekilde bu göz ardı edilmiyor ...
Merc

2
Benim için, ikinci IE10 seçenek IE11 için çalışmış: @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { .relevant_selectors_for_situation {property:value;} }Ben buldum mediacurrent.com/blog/...
cedricdlb

1
Tüm bunları okuduktan sonra, bence -ms-high-contrast: activekaçınılması gereken bir şey olabilir, çünkü MS özelliklerine göre aslında Edge'deki yüksek kontrastlı tema kullanıcılarını IE 10/11 kurallarınızla hedefleyeceksiniz. Sayfada bu cevap -ms-high-contrast, aslında sadece -ms-high-contrast: nonedeğerin artık desteklenmediğini söylüyor . Sanırım bundan hiç kimse bahsetmiyor çünkü çoğu insan yüksek kontrast modu etkin değil ve çoğu insan Edge kullanmıyor. Ama yine de, dışarıda bu konfigürasyona sahip biri var ve bu muhtemelen onlar için iyi değil.
dmatamales

40

Yalnızca IE10 ve IE11'i hedeflemek için (Edge'i değil):

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

1
Bunun gibi bir şey de sass karışımı olabilir!
dano

2
Bu sadece IE11'i mi yoksa Edge'i de mi hedefliyor?
Matthew Felgate

2
IE10 ve IE11'i hedefler, ancak kenarı hedef almaz.
Jeff Clayton

23

Böylece sonunda bu soruna kendi çözümümü buldum.

Microsoft belgelerinde arama yaptıktan sonra yeni bir yalnızca IE11 stili bulmayı başardımmsTextCombineHorizontal

Testimde IE10 stillerini kontrol ediyorum ve pozitif bir eşleşmelerse sadece IE11 stilini kontrol ediyorum. Bulursam, o zaman IE11 +, bulamazsam, o zaman IE10.

Kod Örneği: IE10 ve IE11'i CSS Yetenek Testi (JSFiddle) ile Algılama

Kod örneğini keşfettiğimde daha fazla stille güncelleyeceğim.

NOT: Bu, neredeyse kesinlikle IE12 ve IE13'ü "IE11" olarak tanımlayacaktır, çünkü bu tarzlar muhtemelen ilerleyecektir. Yeni sürümler çıktıkça daha fazla test ekleyeceğim ve umarım tekrar Modernizr'e güvenebilirim.

Bu testi geri dönüş davranışı için kullanıyorum. Geri dönüş davranışı daha az çekici bir stildir, azaltılmış işlevselliğe sahip değildir.


8
Eğer birisi bu cevabı -1 yapacaksa, lütfen en azından teknik bir sebeple bunu kabul etme nezaketine sahip olun . Buna katılmayabilirsiniz .. ama doğru ve işe yarıyor.
dano

7
Bu kodun IE12, IE13 ve benzerlerinde doğru sonuçlar üretip üretmeyeceğini nasıl anlarsınız?
Evgeny

6
Bunun yerine neden bu yöntemi kullanıyorsunuz if (document.documentMode === 11) { ... }? Tabii ki CSS özelliğini bir @supportskuralda kullanmak istemediğiniz sürece (bu arada henüz IE'de desteklenmemektedir).
Rob W

1
Vücut etiketinizde mevcut sınıflarınız varsa, bu sınıfların üzerine yazılacaktır. İşte çok küçük bir düzeltme: jsfiddle.net/jmjpro/njvr1jq2/1 .
jbustamovej

1
Ayrıca ieVersion öğesini css: #ieVersion {display: none}
jbustamovej


11

Muhtemelen yalnızca <= IE11'i> IE11'den ("Edge") ayırt etmeyi önemsediğiniz 2017 için bir cevap:

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

Daha açıklayıcı örnek:

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

Bu işe yarıyor çünkü IE11 aslında desteklemiyor @supportsve diğer tüm ilgili tarayıcı / sürüm kombinasyonları destekliyor .


9

IE11 kodunuzu normal bir şekilde yazabilir ve ardından @supportsIE11'de desteklenmeyen bir özelliği kullanabilir ve kontrol edebilirsiniz, örneğingrid-area: auto .

Daha sonra modern tarayıcı stillerinizi bunun içine yazabilirsiniz. IE @supportskuralı desteklemez ve orijinal stilleri kullanır, oysa bunlar destekleyen modern tarayıcılarda geçersiz kılınır @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
Bu işe yarıyor ve iyi bir çözüm, ancak verilen mantık doğru değil. IE11 hiç desteklemiyor @supports, bu nedenle @supportsbloktaki her şeyi yok sayıyor . Böylece @supports koşuluna herhangi bir şey koyabilirsiniz (örneğin @supports (display: block)) ve IE11 yine de atlayacaktır.
CodeBiker

1
"IE 11 görmezden gelecektir" derken bunu kastettim ama haklısınız, bu tamamen açık değil. IE'nin @supports'u desteklemediğini daha açık hale getirmek için yanıtı güncelledim.
Antfish

4

Bu benim için çalıştı

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

Ve sonra css dosyasında her şeyin önüne

body.ie11 #some-other-div

Bu tarayıcı ne zaman ölmeye hazır?


4

Bunu dene:

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

3

Bu makaleye bir göz atın: CSS: Kullanıcı Aracısı Seçiciler

Temel olarak, bu komut dosyasını kullandığınızda:

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

Artık herhangi bir tarayıcıyı / sürümü hedeflemek için CSS kullanabilirsiniz.

Yani IE11 için şunu yapabiliriz:

VAKTİNİ BOŞA HARCAMAK

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

1
Bu, Firefox 11'de bozulacaktır (şu anda desteklenmese de, önemli). Ayrıca rv:11.0kullanıcı aracısı dizesinde de vardır .
PhistucK

3

Aşağıdaki özellikleri kullanın:

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

2

Modernizr kullanmalısınız, body etiketine bir sınıf ekleyecektir.

Ayrıca:

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'in hala önizlemede olduğunu ve kullanıcı aracısının yayınlanmadan önce değişebileceğini unutmayın.

IE 11 için Kullanıcı aracısı dizesi şu anda şudur:

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

Bu, 11.xx sürümleri için basitçe test edebileceğiniz anlamına gelir,

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

Teşekkürler Neo, ama zaten vücut etiketime bir sınıf ekliyorum VE Modernizr kullanıyorum. Güvenilir olmayan Kullanıcı Aracısı kullanmadan IE10'u IE11'den ayırmanın bir yolunun peşindeyim.
dano

Rv 11'de iki nokta üst üste eksik. Var isIE11 = !! navigator.userAgent.match (/Trident.*rv:11 \ ./)
T.CK

2

Belki Layout Engine v0.7.0, durumunuz için iyi bir çözümdür. Tarayıcı özelliği algılamasını kullanır ve yalnızca IE11 ve IE10'u değil, aynı zamanda IE9, IE8 ve IE7'yi de algılayabilir. Ayrıca, bazı mobil tarayıcılar dahil diğer popüler tarayıcıları da algılar. Html etiketine bir sınıf ekler, kullanımı kolaydır ve oldukça derin testler altında iyi performans gösterir.

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


2

Modernizr kullanıyorsanız - o zaman IE10 ve IE11 arasında kolayca ayrım yapabilirsiniz.

IE10 pointer-eventsözelliği desteklemiyor . IE11 yapar. ( caniuse )

Şimdi, Modernizr'in eklediği sınıfa göre aşağıdaki CSS'ye sahip olabilirsiniz:

.class
{ 
   /* for IE11 */
}

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

2

Koşullu yorumların standardını korumak için js kullanabilir ve html'de bir sınıf ekleyebilirsiniz :

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

Veya bowser gibi bir kitaplık kullanın:

https://github.com/ded/bowser

Veya özellik algılama için modernizr:

http://modernizr.com/


2

IE'yi ve sürümlerini tespit etmek aslında son derece kolaydır, en azından son derece sezgiseldir:

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

.

Bu şekilde, Uyumluluk Modu / Görünümünde de yüksek IE sürümlerini yakalıyorsunuz. Ardından, koşullu sınıflar atama meselesi:

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

2

Bunu deneyebilirsiniz:

if(document.documentMode) {
  document.documentElement.className+=' ie'+document.documentMode;
}

2

IE11'de bir Yerçekimi Formu (WordPress) ile aynı problemle karşılaştım. Formun sütun stili "display: inline-grid" düzeni bozdu; yukarıdaki cevapları uygulamak tutarsızlığı çözdü!

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

1

Geri adım atın: "Web sitemin X yapması gerekiyor, bu tarayıcı bu özelliği destekliyor mu? Öyleyse, iyi bir tarayıcı. Değilse, o zaman kullanıcıyı uyarmalıyım" yerine "internet explorer" ı tespit etmeye çalışıyorsunuz.

Yaptığınız şeye devam etmek yerine http://modernizr.com/ adresine gitmelisiniz.


Alternatif bir çözüm için teşekkürler, ancak ben zaten Modernizr kullanıyorum ve IE10, yeteneklerini buna göre yanlış temsil ediyor.
dano

4
Hangilerini bildiğinizi ve söz konusu tarayıcı için daha fazla Modernizrs kontrolü ekleyebilmeleri için Modernizr ile bir sorun oluşturduğunuzu varsayıyorum. (Değilse, yapmalısınız. Yüzbinlerce geliştiriciyi etkileyen bir şey bulursanız, bunu
takozdan

7
Kullanıcıya dönük kod yazanlar için, üçüncü taraf bir kitaplıkta dosyalanmış bir hata ve oradaki bir yama değil, genellikle şimdi bir cevaba ihtiyacınız var. Yani, Modernizr'i geliştirmelerini istemeniz güzel, ancak burada uygun değil.
Dean J

1
Bence gerçek tarayıcının tespit edilmesi başlı başına makul bir hedef.
gwg

@DeanJ elbette ve bu sorular için başka biri de cevap verecektir. Bu, size ne yaptığınızı düşünmenizi söyleyen bu tür yanıtlar almayı daha az önemli hale getirmez. Ayrıca, yanıtlama sırasında gönderide herhangi bir düzenleme yapılmamıştı ve "Şu anda çalışmasına ihtiyacım var" ifadesi yoktu, bu yüzden gerçeklik kontrolü istemediklerini varsaymak için hiçbir nedenim yoktu.
Mike 'Pomax' Kamermans
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.