如何针对特定情况(如Internet Explorer特定的CSS或特定于Internet Explorer的JavaScript代码)仅针对Internet Explorer 10?

如何针对特定情况(如Internet Explorer特定的CSS或特定于Internet Explorer的JavaScript代码)仅针对Internet Explorer 10?

我试过这个,但是不起作用:

<!--[if IE 10]> <html class="no-js ie10" lang="en"> <![endif]--> <!--[if !IE]><!--> <html lang="en" class="no-js"> <!--<![endif]--> 

Internet Explorer 10将忽略条件注释,并使用<html lang="en" class="no-js">而不是<html class="no-js ie10" lang="en">

也许你可以尝试一些像这样的jQuery:

 if ($.browser.msie && $.browser.version === 10) { $("html").addClass("ie10"); } 

要使用此方法,您必须包含jQuery Migrate库,因为此function已从主jQuery库中移除。

为我工作得很好。 但是,一定不能替代有条件的评论!

我不会使用JavaScript navigator.userAgent或$ .browser (使用navigator.userAgent ),因为它可能被欺骗。

瞄准Internet Explorer 9,10和11(注意:也是最新的Chrome):

 @media screen and (min-width:0\0) { /* Enter CSS here */ } 

要定位Internet Explorer 10:

 @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { /* IE10+ CSS here */ } 

定位边缘浏览器:

 @supports (-ms-accelerator:true) { .selector { property:value; } } 

资料来源:

  • 将Internet Explorer特定的CSS移动到@media块
  • 如何在CSS中定位Internet Explorer 10和11
  • 用于Windows 10的CSS Hacks和Microsoft的Edge Web浏览器

我在这个网站上find了一个解决scheme,有人有一个宝贵的评论 :

解决scheme是:

 if (Function('/*@cc_on return document.documentMode===10@*/')()){ document.documentElement.className+=' ie10'; } 

  • 不需要有条件的评论;
  • 即使评论剥离压缩/处理工程;
  • 在Internet Explorer 11中没有添加ie10类;
  • 在Internet Explorer 10兼容模式下运行的Internet Explorer 11更可能按预期工作;
  • 不需要独立的脚本标签(只能添加到头部的其他JavaScript代码)。
  • 不需要jQuery来testing

Internet Explorer 10不会尝试读取条件注释。 这意味着它将像对待任何其他浏览器一样对待条件注释:因为常规的HTML注释意味着完全被忽略。 以问题中给出的标记为例,包括IE10在内的所有浏览器都将忽略注释部分,完全用灰色突出显示。 HTML5标准没有提到条件注释语法,这正是他们select在IE10中停止支持它的原因。

但请注意,JScript中的条件编译仍受支持,如注释和最近的答案所示。 它不会在最终版本中消失, 不像jQuery.browser 。 当然,不言而喻,用户代理嗅探依然如此脆弱,在任何情况下都不能使用。

如果你真的必须瞄准IE10,要么使用条件编译,在不久的将来仍然可以看到支持,或者更好 – 使用Modernizr等function检测库而不是浏览器检测。 听起来相当麻烦,但请记住,作为一个现代的浏览器,高度符合今天的Web标准1 ,假设你已经编写了高度兼容的兼容代码,你不应该为IE10留出特殊的代码,除非绝对必要,即它在行为和渲染方面应该与其他浏览器相似。 2根据IE的历史logging,这听起来很牵强,但是你有多less次期待Firefox或Chrome浏览器能够以同样的方式行事?

  • Firefox不支持多年前没有提前box-sizing
  • 火狐浏览器历来有奇怪的大纲行为 ,多年来也是如此
  • 当涉及到定位的表格单元格时 , Firefox拒绝行为合理 ,引用未定义的行为作为借口,而其他浏览器似乎应付得很好
  • Safari和Chrome浏览器在某些 CSS select器 上 遇到 了 很多 麻烦 ,有时修复会让你回到IE5,IE6和IE7的良好时代
  • Chrome在整个重绘部门似乎有很多麻烦,例如在更新媒体样式时不能正确地重新排版布局。 似乎铬的一半错误可以简单地工作,只有通过强制重绘,再次IE5 / 6/7级的东西
  • WebKit的几个版本已经被公认为支持某些特征的彻头彻尾的谎言 ,这意味着他们实际上打败了所有事物的特征检测机制

如果你确实有一个合法的理由针对某些浏览器,通过一切手段嗅出来。 我只是说,今天你会比以前更难以find这样一个理由,而这实际上并不是你可以依赖的。


1 不仅IE10,IE9,甚至IE8处理大多数成熟的CSS2.1标准,远远超过Chrome,因为IE8非常注重标准遵从性(当时CSS2.1已经非常稳定,只有很小的差别从今天的推荐来看),而Chrome似乎不过是尖端伪标准的半抛光技术演示。

2 当我这样说的时候,我可能会有偏见,但是确实如此。 如果你的代码在其他浏览器中工作,但不是IE浏览器, 那么与你自己的代码而不是IE10相比, 这个问题的可能性要比3年前IE浏览器的早期版本要好得多。 再一次,我可能会有偏见,但说实话, 你不是吗? 只要看看你的意见。

IE标准支持文档是一个很好的起点。

以下是如何在JavaScript中使用IE10:

 if ("onpropertychange" in document && !!window.matchMedia) { ... } 

以下是如何在CSS中定位IE10:

 @media all and (-ms-high-contrast: none) { ... } 

如果IE11需要通过CSS进行过滤或重置,请参阅另一个问题: 如何为IE 11写一个CSS黑客?

我写了一个名为Layout Engine的小型vanilla JavaScript插件,它允许您以不能伪造的简单方式检测IE 10(和其他所有浏览器),不像用户代理嗅探那样。

它将呈现引擎名称添加为html标记中的类,并返回包含供应商和版本的JavaScript对象(在适当的情况下)

看看我的博客文章: http : //mattstow.com/layout-engine.html并获取GitHub上的代码: https : //github.com/stowball/Layout-Engine

这两个解决scheme张贴在这里(稍作修改)工作:

 <!--[if !IE]><!--><script>if(/*@cc_on!@*/false){document.documentElement.className='ie10';}</script><!--<![endif]--> 

要么

 <script>if(Function('/*@cc_on return 10===document.documentMode@*/')()){document.documentElement.className='ie10';}</script> 

您的CSS链接之前,您的HTML页面的头标记内包括上述任一行。 然后在css文件中指定具有“ie10”类的样式作为父类:

 .ie10 .myclass1 { } 

瞧! – 其他浏览器保持不变。 你不需要jQuery。 你可以看到我在这里实现的例子: http : //kardash.net 。

我使用这个脚本 – 这是过时的,但是有效地定位一个单独的 Internet Explorer 10样式表或JavaScript文件, 只有当浏览器是Internet Explorer 10时才会包含这个文件,就像使用条件注释一样。 没有jQuery或其他插件是必需的。

 <script> /*@cc_on @if (@_jscript_version == 10) document.write(' <link type= "text/css" rel="stylesheet" href="your-ie10-styles.css" />'); @end @*/ </script > 

您可以使用PHP为IE 10添加样式表

喜欢:

 if (stripos($_SERVER['HTTP_USER_AGENT'], 'MSIE 10')) { <link rel="stylesheet" type="text/css" href="../ie10.css" /> } 

如果您必须这样做,您可以在JavaScript中检查用户代理string:

 var isIE10 = !!navigator.userAgent.match(/MSIE 10/); 

正如其他人所提到的,我总是推荐function检测。

如果您想要使用Vanilla JavaScript来定位IE 10,您可能需要尝试CSS属性检测:

 if (document.body.style.msTouchAction != undefined) { document.body.className = 'ie10'; } 

CSS属性

您也可以使用这些CSS属性之一,而不是msTouchAction ,因为它们目前仅在IE 10中可用。但是这可能会在将来改变。

  • msTouchAction
  • msWrapFlow
  • msWrapMargin
  • msWrapThrough
  • msScrollLimit
  • msScrollLimitXMin
  • msScrollLimitYMin
  • msScrollLimitXMax
  • msScrollLimitYMax
  • msFlexbox
  • msFlex
  • msFlexOrder

testing页面

我已经在CodePen上放置了一个包含所有属性的testing页面 。

clipBoardData是一个只在IE中可用的function,所以如果你正在寻求所有IE版本的目标,你可以使用

 <script type="text/javascript"> if (window.clipboardData) alert("You are using IE!"); </script> 

IE10 +和IE9的CSS

 @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { /* IE10+ styles */ } @media screen\0 { /* IE8,9,10 styles*/ } 

您可以使用function检测来查看浏览器是否为IE10或更高版本,如下所示:

 var isIE = false; if (window.navigator.msPointerEnabled) { isIE = true; } 

只有> IE9才是真的

Conditionizr (请参阅文档)将添加浏览器CSS类到您的html元素,包括ie10。

我只是想添加我的IE检测版本。 它基于http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments/上的代码片段,并扩展为支持ie10和ie11。; 它检测IE 5到11。

所有你需要做的就是添加它的地方,然后你总是可以检查一个简单的条件。 如果不是IE,全局isIE将是未定义的,否则将是版本号。 所以你可以很容易地添加if (isIE && isIE < 10)或类似的东西。

 var isIe = (function(){ if (!(window.ActiveXObject) && "ActiveXObject" in window) { return 11; /* IE11 */ } if (Function('/*@cc_on return /^10/.test(@_jscript_version) @*/')()) { return 10; /* IE10 */ } var undef, v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i'); while ( div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->', all[0] ); return v > 4 ? v : undef; }()); 

使用JavaScript:

 if (/Trident/g.test(navigator.userAgent)) { // detect trident engine so IE document.getElementsByTagName('html')[0].className= 'no-js ie'; } 

适用于所有IE。

 IE08 => 'Trident/4.0' IE09 => 'Trident/5.0' IE10 => 'Trident/6.0' IE11 => 'Trident/7.0' 

所以用/Trident/x.0/g改变/Trident/g ,其中x = 4, 5, 67 (或者将来可能是8 )。

对于我来说,下面的代码工作正常,所有条件注释都可以在所有IE版本中使用:

 <!--[if lt IE 7 ]> <html class="ie6"> <![endif]--> <!--[if IE 7 ]> <html class="ie7"> <![endif]--> <!--[if IE 8 ]> <html class="ie8"> <![endif]--> <!--[if IE 9 ]> <html class="ie9"> <![endif]--> <!--[if (gt IE 11)|!(IE)]><!--> <html> <!--<![endif]--> <script> if (document.documentMode===10){ document.documentElement.className+=' ie10'; } else if (document.documentMode===11){ document.documentElement.className+=' ie11'; } </script> 

我在Windows 8.1上,不知道它是否与ie11更新…

这里是我如何为Internet Explorer自定义CSS:

在我的JavaScript文件中:

 function isIE () { var myNav = navigator.userAgent.toLowerCase(); return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false; } jQuery(document).ready(function(){ if(var_isIE){ if(var_isIE == 10){ jQuery("html").addClass("ie10"); } if(var_isIE == 8){ jQuery("html").addClass("ie8"); // you can also call here some function to disable things that //are not supported in IE, or override browser default styles. } } }); 

然后在我的CSS文件中,定义每个不同的风格:

 .ie10 .some-class span{ ....... } .ie8 .some-class span{ ....... } 

退房http://suhasrathod.wordpress.com/2013/04/29/ie10-css-hacks/

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

这个答案让我有90%的方式。 我在Microsoft网站上find了我的答案的其余部分。

下面的代码是我用来定位所有即通过添加.ie类到<html>

使用jQuery(不推荐使用.browser支持1.9+的用户代理,请参阅http://api.jquery.com/jQuery.browser/ )来添加.ie类:

 // ie identifier $(document).ready(function () { if (navigator.appName == 'Microsoft Internet Explorer') { $("html").addClass("ie"); } }); 

如果您不介意针对IE10及以上版本和非IE浏览器,则可以使用以下条件注释:

 <!--[if gt IE 9]><!--> Your code here. <!--<![endif]--> 

派生自http://www.paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither

如果您确实需要,可以通过将以下行添加到<head>来进行条件注释:

 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9"> 

资源

现代解决scheme的CSS

 html[data-useragent*='MSIE 10.0'] .any { your-style: here; } 
Interesting Posts