99

IE10+ 不再支持浏览器检测标签来识别浏览器。

为了检测 IE10,我使用 JavaScript 并ms定义了一种能力测试技术来检测某些前缀样式,例如msTouchActionmsWrapFlow

我想对 IE11 做同样的事情,但我假设 IE11 也将​​支持所有 IE10 样式。谁能帮我确定我可以用来区分这两者的 IE11 唯一样式或功能?

额外信息

  • 我不想使用用户代理类型检测,因为它参差不齐,并且可以更改,而且我认为我已经读过 IE11 故意试图隐藏它是 Internet Explorer 的事实。
  • 对于 IE10 功能测试如何工作的示例,我使用这个JsFiddle(不是我的)作为我测试的基础。
  • 我也期待很多“这是一个坏主意......”的答案。我对此的一个需求是 IE10 声称它支持某些东西,但它的实现非常糟糕,我希望能够区分 IE10 和 IE11+,以便将来继续使用基于能力的检测方法。
  • 该测试与 Modernizr 测试相结合,该测试只会使某些功能“回退”到不那么迷人的行为。我们不是在谈论关键功能。

另外我已经在使用 Modernizr,但在这里没有帮助。我需要帮助来解决我明确提出的问题。

4

18 回答 18

177

鉴于不断发展的线程,我更新了以下内容:

即 6

* html .ie6 {property:value;}

或者

.ie6 { _property:value;}

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

即 6、7 和 8

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

即 8

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

或者

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

仅限 IE 8 标准模式

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

即 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.

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

脚注

如果可能,在没有黑客攻击的情况下识别并修复任何问题。支持渐进增强优雅降级。然而,这是一个“理想世界”的场景,并不总是可以实现,因此——以上内容应该有助于提供一些好的选择。


归因/基本阅读

于 2014-12-05T12:22:04.053 回答
48

仅针对 IE10 和 IE11(而不是 Edge):

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {  
   /* add your IE10-IE11 css here */   
}
于 2016-01-28T13:52:35.153 回答
24

所以我最终找到了自己解决这个问题的方法。

在搜索Microsoft 文档后,我设法找到了一种新的 IE11 风格msTextCombineHorizontal

在我的测试中,我检查 IE10 样式,如果它们是正匹配,那么我检查仅 IE11 样式。如果我找到它,那么它就是 IE11+,如果我没有找到,那么它就是 IE10。

代码示例: 通过 CSS 能力测试(JSFiddle)检测 IE10 和 IE11

 /**
  Target IE 10 with JavaScript and CSS property detection.
  
  # 2013 by Tim Pietrusky
  # timpietrusky.com
 **/

 // IE 10 only CSS properties
 var ie10Styles = [
     'msTouchAction',
     'msWrapFlow',
     'msWrapMargin',
     'msWrapThrough',
     'msOverflowStyle',
     'msScrollChaining',
     'msScrollLimit',
     'msScrollLimitXMin',
     'msScrollLimitYMin',
     'msScrollLimitXMax',
     'msScrollLimitYMax',
     'msScrollRails',
     'msScrollSnapPointsX',
     'msScrollSnapPointsY',
     'msScrollSnapType',
     'msScrollSnapX',
     'msScrollSnapY',
     'msScrollTranslation',
     'msFlexbox',
     'msFlex',
     'msFlexOrder'];

 var ie11Styles = [
     'msTextCombineHorizontal'];

 /*
  * Test all IE only CSS properties
  */
 var d = document;
 var b = d.body;
 var s = b.style;
 var ieVersion = null;
 var property;

 // Test IE10 properties
 for (var i = 0; i < ie10Styles.length; i++) {
     property = ie10Styles[i];

     if (s[property] != undefined) {
         ieVersion = "ie10";
         createEl("IE10 style found: " + property);
     }
 }

 // Test IE11 properties
 for (var i = 0; i < ie11Styles.length; i++) {
     property = ie11Styles[i];

     if (s[property] != undefined) {
         ieVersion = "ie11";
         createEl("IE11 style found: " + property);
     }
 }

 if (ieVersion) {
     b.className = ieVersion;
     $('#versionId').html('Version: ' + ieVersion);
 } else {
     createEl('Not IE10 or 11.');
 }

 /*
  * Just a little helper to create a DOM element
  */
 function createEl(content) {
     el = d.createElement('div');
     el.innerHTML = content;
     b.appendChild(el);
 }

 /*
  * List of IE CSS stuff:
  * http://msdn.microsoft.com/en-us/library/ie/hh869403(v=vs.85).aspx
  */
body {
    font: 1.25em sans-serif;
}
div {
    background: red;
    color:#fff;
    padding: 1em;
}
.ie10 div {
    background: green;
    margin-bottom:.5em;
}
.ie11 div {
    background: purple;
    margin-bottom:.5em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h1>Detect IE10 and IE11 by CSS Capability Testing</h1>


<h2 id="versionId"></h2>

当我发现它们时,我会用更多样式更新代码示例。

注意:这几乎肯定会将 IE12 和 IE13 标识为“IE11”,因为这些样式可能会继续使用。随着新版本的推出,我将添加进一步的测试,并希望能够再次依赖 Modernizr。

我正在将此测试用于回退行为。后备行为只是不那么迷人的样式,它没有减少功能。

于 2013-09-20T17:15:15.283 回答
20

这似乎有效:

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {  
   /* IE10+ specific styles go here */  
}

https://www.limecanvas.com/css-hacks-for-targeting-ie-10-and-above/

于 2014-06-13T18:11:28.917 回答
13

这是 2017 年的答案,您可能只关心区分 <=IE11 和 >IE11(“Edge”):

@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,而所有其他相关的浏览器/版本组合都支持。

于 2017-08-03T20:36:12.710 回答
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;
    }
}
于 2018-06-18T14:15:35.940 回答
4

这对我有用

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

然后在css文件中以

body.ie11 #some-other-div

这个浏览器什么时候会死?

于 2013-11-25T07:52:33.153 回答
4

试试这个:

/*------Specific style for IE11---------*/
 _:-ms-fullscreen, :root 
 .legend 
{ 
  line-height: 1.5em;
  position: relative;
  top: -1.1em;   
}
于 2014-09-09T18:41:45.833 回答
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;
}
于 2014-01-16T11:21:09.623 回答
3

使用以下属性:

  • !!window.MSInputMethodContext
  • !!document.msFullscreenEnabled
于 2014-02-28T02:29:11.503 回答
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 仍处于预览阶段,用户代理可能会在发布前更改。

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\./)
于 2013-09-20T00:52:49.487 回答
2

也许 Layout Engine v0.7.0 是适合您情况的一个很好的解决方案。它使用浏览器特征检测,不仅可以检测IE11和IE10,还可以检测IE9、IE8和IE7。它还检测其他流行的浏览器,包括一些移动浏览器。它为 html 标签添加了一个类,易于使用,并且在一些相当深入的测试下表现良好。

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

于 2013-10-11T00:35:07.140 回答
2

如果您使用的是Modernizr - 那么您可以轻松区分 IE10 和 IE11。

IE10 不支持该pointer-events属性。IE11 可以。(

现在,根据 Modernizr 插入的类,您可以拥有以下 CSS:

.class
{ 
   /* for IE11 */
}

.no-pointerevents .class
{ 
   /* for IE10 */
}
于 2013-12-30T14:57:26.700 回答
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";
  }

或者使用像 bowser 这样的库:

https://github.com/ded/bowser

或用于特征检测的modernizr:

http://modernizr.com/

于 2014-02-09T14:45:01.793 回答
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-';
于 2014-06-14T01:55:05.090 回答
2

你可以试试这个:

if(document.documentMode) {
  document.documentElement.className+=' ie'+document.documentMode;
}
于 2015-08-13T18:48:18.090 回答
2

我在 IE11 中使用 Gravity Form (WordPress) 时遇到了同样的问题。表单的列样式“display: inline-grid”破坏了布局;应用上面的答案解决了差异!

@media all and (-ms-high-contrast:none){
  *::-ms-backdrop, .gfmc-column { display: inline-block;} /* IE11 */
}
于 2019-02-01T01:11:27.730 回答
1

退后一步:为什么你甚至试图检测“Internet Explorer”而不是“我的网站需要做 X,这个浏览器是否支持该功能?如果是,好的浏览器。如果不是,那么我应该警告用户”。

你应该点击http://modernizr.com/而不是继续你正在做的事情。

于 2013-09-20T00:53:26.163 回答