如何通过CSS识别Microsoft Edge浏览器?


90

我正在开发Web应用程序,并且需要与其他浏览器分开标识Microsoft Edge的浏览器,以应用独特的样式。有没有一种使用CSS识别Edge的方法?就像,

<!--[if IE 11]>
Special instructions for IE 11 here
<![endif]-->

3
你为什么要这么做?

2
您几乎肯定不需要这样做。你为什么要这样做?
Patrick

37
这肯定是您可能需要的东西。在撰写本文时,Edge仍然充满了各种问题,这些问题将严重破坏可在包括IE在内的所有其他浏览器上运行的有效CSS。
Lawyerson

注意:该示例中使用的条件注释仅适用于IE9及以下版本,因此[如果IE 11]实际上不起作用。
肖恩·麦克米兰

Answers:


191

/ * Microsoft Edge浏览器12-18(Chromium之前的所有版本)* /

这应该工作:

@supports (-ms-ime-align:auto) {
    .selector {
        property: value;
    }
}

有关更多信息,请参见:浏览器的奇怪性


8
Microsoft打算在MS Edge中删除尽可能多的-ms前缀属性,以便与其他浏览器互操作。因此,这远不能保证将来能正常工作。如其他答案所述,特征检测更为可取。
查尔斯·莫里斯

1
只是再次测试,它肯定可以工作。演示:jsfiddle.net/pd142446
KittMedia

@ CharlesMorris-MSFT我同意您的看法,但是在某些情况下,我们只需要这样做。例如,指针事件:无;在IE 11和所有其他浏览器上都可以正常工作,但是在Edge上停止工作。我希望当它们消除-ms前缀时,它们还将解决迫使我们首先使用不同CSS的问题。在这种情况下,功能检测并不能真正起到帮助作用,因为所有功能都已存在,但Edge破坏了IE 11最终修复的某些功能。KittMedia很好的回答,谢谢。
埃米尔·博尔科尼

8
此hack不再起作用,但是它可以@supports(-ms-ime-align:auto){.selector {属性:value; }
罗弗斯(Roffers)'16

1
@KittMedia已在Edge 14中删除
LJ Wadowski '16

19
/* Microsoft Edge Browser 12-18 (All versions before Chromium) - one-liner method */

_:-ms-lang(x), _:-webkit-full-screen, .selector { property:value; }

效果很好!

// for instance:
_:-ms-lang(x), _:-webkit-full-screen, .headerClass 
{ 
  border: 1px solid brown;
}

https://jeffclayton.wordpress.com/2015/04/07/css-hacks-for-windows-10-and-spartan-browser-preview/


1
@ r3wt- _:-ms-lang(x), _:-webkit-full-screen,只有MS Edge可以“理解”该规则,其他浏览器会忽略它。该规则后接html元素的类或ID名称,因此将其应用于该规则。换句话说,如果仅需要在Edge浏览器中将CSS代码应用于html元素,请在该元素的类/ id之前放下该特殊规则。
CodeGust

因此,浏览器不仅会忽略它们,而且会以选择器为目标,因为它们全都用逗号分隔了?通常,在CSS中使用单独的选择器。这就是为什么这令人困惑。我还是不明白为什么其他浏览器会忽略这一点,只有ms-edge会在逗号后将css应用于选择器
r3wt

1
@ r3wt如果一个选择器无效,则整个规则组将被忽略。在此处说明css-tricks.com/…–
CodeGust

@ r3wt谢谢!:)您鼓励我写出最初应该作为答案的一部分的细节
CodeGust

@AlexandrKazakov可能是因为最新的Edge基于Chromium引擎(?),您获得了哪个版本?
CodeGust

14

Edge(不包括最新的IE 15)更准确:

@supports (display:-ms-grid) { ... }

@supports (-ms-ime-align:auto) { ... } 适用于所有Edge版本(当前最高为IE15)。


2
For Internet Explorer 

@media all and (-ms-high-contrast: none) {
        .banner-wrapper{
            background: rgba(0, 0, 0, 0.16)
         }
}

For Edge
@supports (-ms-ime-align:auto) {
    .banner-wrapper{
            background: rgba(0, 0, 0, 0.16);
         }
}

-2

特征检测,特征检测,特征检测。关于为什么有人需要UA嗅探或使用CSS进行检测的好用例尚未找到。您能详细解释一下用例吗?

的CSS

从Jeff Clayton找到了这篇文章,该文章说明了如何通过CSS查找Edge,但是它也可以检测Chrome和Safari。

/* Chrome, Safari, AND NOW ALSO the Windows 10 Edge Browser */
@media screen and (-webkit-min-device-pixel-ratio:0) {
  .selector { property:value; } 
}

但是,如果您必须UA嗅探:

Microsoft Edge UA字符串:

Mozilla / 5.0(Windows NT 10.0)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 42.0.2311.135 Safari / 537.36 Edge / 12.10136

我在这篇博客文章中详细说明了原因。

Neowin最近报道说,微软针对Windows 10的新浏览器Spartan使用Chrome UA字符串“ Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 39.0.2171.71 Safari / 537.36 Edge / 12.0 ”。 那是故意的。

您还会注意到,整个字符串都以“ Edge / 12.0”结尾,而Chrome则没有。

我应该指出,这与Microsoft在Windows 8上读取的IE 11并不完全相同,在Windows 8上为:Mozilla / 5.0(Windows NT 6.3; Trident / 7.0; rv:11.0),如Gecko所示,发布。

什么是用户代理嗅探?

通常,Web开发人员会UA嗅探浏览器检测。Mozilla在其博客中对此进行了很好的解释:

为不同的浏览器提供不同的网页或服务通常是一个坏主意。所有人都可以使用Web,无论他们使用哪种浏览器或设备。有一些方法可以开发您的网站,以基于功能的可用性而不是针对特定的浏览器来逐步增强自身。

这是一篇很棒的文章,解释了用户代理的历史。

通常,懒惰的开发人员只会嗅探UA字符串,并根据他们认为查看器正在使用的浏览器来禁用其网站上的内容。对于开发人员来说,Internet Explorer 8是一个令人沮丧的常见问题,因此他们将经常检查用户是否使用IE的任何版本,并禁用功能。

Edge团队在其博客中更详细地介绍了这一点。

所有用户代理字符串都包含比您正在使用的实际浏览器更多的其他浏览器信息–不仅是令牌,而且还有“有意义的”版本号。

Internet Explorer 11的UA字符串:

像Gecko一样的Mozilla / 5.0(Windows NT 6.3; Trident / 7.0; rv:11.0)

Microsoft Edge UA字符串:

Mozilla / 5.0(Windows NT 10.0)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 42.0.2311.135 Safari / 537.36 Edge / 12.10136

在H3C讨论中,Patrick H. Lauke恰当地将userAgent属性描述为“不断增长的谎言”。(“或者,一种平衡的操作,即添加足够的旧关键字,这些旧关键字不会立即使旧的UA嗅探代码掉落,同时仍然尝试传达一些实际有用和准确的信息。”)

我们建议Web开发人员尽可能避免UA嗅探。现代化的Web平台功能几乎可以通过简单的方式检测到。在过去的一年中,我们已经看到一些UA嗅探网站已经更新,可以检测Microsoft Edge……只是为其提供了旧版IE11代码路径。这不是最佳方法,因为Microsoft Edge匹配“ WebKit”行为,而不是IE11行为(任何Edge-WebKit差异都是我们有兴趣修复的错误)。

根据我们的经验,Microsoft Edge在这些站点中的“ WebKit”代码路径上运行最佳。另外,随着Internet在越来越多的设备上可用,请假定未知的浏览器是好的-请不要将您的网站限制为仅在少数当前已知的浏览器上工作。如果这样做,将来您的网站几乎肯定会中断。

结论

通过显示Chrome UA字符串,我们可以解决这些开发人员正在使用的hack,从而为用户提供最佳体验。


25
您的答案与问题没有任何关系吗?您描述了为什么不应该使用用户代理进行检测,而这不能以任何方式回答问题-如何通过CSS进行检测。
KittMedia

我还说明了为什么除了特征检测之外做任何其他事情通常都是有害的。还希望有人最终能够说明为什么他们会使用嗅探或CSS而不是特征检测。
Dave Voyles

4
那么,此答案是否针对所有浏览器?我正在尝试仅针对特定的浏览器,因为css必须与其他浏览器有所不同...不确定您在此处回答的问题是什么?
Crystal

2
“能否请您详细解释一个用例?” Edge有一个已知的错误,即使用3D变换会使元素离开页面时停止渲染。尝试使用它来产生视差效果会使该站点看起来完全损坏。UA检测在这种情况下很有用,因为我可以将Edge上的视差展平,并且我的站点看起来不会像垃圾一样。
Amoliski

1
我想检测Edge,因为我正在检查它是否不支持该问题:focus-within以此判断,选择器的功能检测需要JavaScript,而我宁愿使用纯CSS解决方案。
Qwertie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.