使用条件注释定位 IE8 是不是有效?

Posted

技术标签:

【中文标题】使用条件注释定位 IE8 是不是有效?【英文标题】:Will targeting IE8 with conditional comments work?使用条件注释定位 IE8 是否有效? 【发布时间】:2010-09-15 02:57:39 【问题描述】:

IE8 发布后,以下代码是否可以添加条件样式表?

<!--[if IE 8]>
  <link rel="stylesheet" type="text/css" href="ie-8.0.css" />
<![endif]-->

我已经阅读了关于这是否适用于测试版的相互矛盾的报告。我希望有人可以分享他们的经验。谢谢。

【问题讨论】:

太棒了。来自 Microsoft 的另一个非标准扩展。 这个非常古老而且非常有用,因为它允许非 hack CSS 开关为 MSIE 提供不同的样式表。 这个问题应该早就结束了。 【参考方案1】:

它对我有用——无论是在怪癖模式还是在标准合规模式下。但是,当切换到 IE8 兼容模式时,它不起作用

【讨论】:

你说的是IE7兼容模式吗? 否:Beta 2 有浏览器模式和文档模式。文档模式允许 IE 7 兼容性(以及严格模式和怪癖模式)。浏览器模式有“IE 7”、“IE 8”和“IE 8 兼容模式”选项。我就是这个意思。【参考方案2】:

需要注意的一点:

它确实有效,但是如果您正在加载页面/站点本地网络(例如 Intranet)它将以 IE7 模式默认加载!(更新 - localhost[*] 是一种特殊情况,确实以标准模式呈现)

这违背了 MSFT 最初默认采用 STANDARDS 的声明。

例如

http://127.0.0.1/mysite/mypage.php  <-- IE8 by default (updated!)
http://localhost/mysite/mypage.php  <-- IE8 by default (updated!)
http://machinename/mysite/mypage.php  <-- IE7 by default
http://192.168.100.x/mysite/mypage.php  <-- IE7 by default
http://google.com/  <-- IE8 by default

[*] - Scott Dickens [MSFT] 在评论 here on the IE Blog 中指出 localhost 是 Intranet 中的一个特殊场景(通常用于开发 Internet 站点),因此默认情况下会以标准模式呈现。

要测试 IE8 中页面真正呈现的模式,您可以使用检查开发人员工具或使用此小书签代码(仅适用于 IE8):

javascript:
var vMode=document.documentMode;
var rMode='IE5 Quirks Mode';
if(vMode==8)
  rMode='IE8 Standards Mode';
 else if(vMode==7)
  rMode='IE7 Strict Mode';

alert('Rendering in: '+rMode);

【讨论】:

我认为这取决于文档类型(虽然不确定,尚未测试):我理解微软的方式,IE 8 严格模式会在 any 有效时触发指定了 html 文档类型。 不,不正确。如果您指定了 doctype,则本地网络上的 IE8 将以 IE5(怪癖模式)或 IE7(标准模式)呈现。为了看到以 TRUE IE8 STANDARDS 模式呈现的本地站点,您必须明确告诉 IE 您想要它(例如,用户必须选择它) 好吧有趣 - 你怎么知道的?你能提供一些证据吗?当我进入 IE8 中的开发人员工具时,它报告它在加载本地页面(例如 localhost/somepage.html)时正在为渲染和浏览器模式运行 IE8 模式 @Whyamistilltyping - IE 博客 (blogs.msdn.com/ie) 发布有关 IE 进度的信息。对于 IE8 Beta 2 (blogs.msdn.com/ie/archive/2008/08/27/…),他们引用:“在默认状态下,公共 Internet 上的所有站点都以 Internet Explorer 8 标准模式(兼容性视图关闭)显示,所有 Intranet 网站都以 Internet Explorer 7 标准模式(兼容性视图)显示在)。” - 他们后来确实改变了这种行为(因此我现在正在更新我的答案)从本地机器加载的页面是一个例外,默认情况下以标准模式呈现。 ...更改发生在 IE8 RC1 记录。阅读完整的 cmets 以了解有关集群的完整详细信息... EricLaw [MSFT] 5 天后在 cmets 中“澄清”:blogs.msdn.com/ie/archive/2008/12/03/…【参考方案3】:

工具/兼容性视图设置

全部取消勾选

【讨论】:

【参考方案4】:

感谢您的帮助。我发现了解决方案,显然问题在于让每个样式表都使用自己的标题属性。一旦我把标题从除主样式表之外的所有地方去掉,就没有问题了。

这是 IE8 独有的一个奇怪问题 - 虽然我被告知它应该以这种方式工作,但与“样式表首选项”有关 - 它只会产生问题,因为解决方案要求您删除标题在编写脚本等时可能会有所帮助 - 当您需要调用样式表时。

无论如何,不​​确定这是否是一个错误,或者它应该是这样,但我希望微软进一步调查。

谢谢

【讨论】:

我认为您不应该将相同的标题添加到不同的链接样式表。 AFAIR 在 Konqueror 中也表现不佳(几年前)。【参考方案5】:

为什么还要为 IE8 编写单独的样式表?

如果您已经针对 IE7 进行了调试,则可以强制 IE8 进入兼容模式,从而将您的代码显示为 IE8 是 IE7。

您所要做的就是把它放在开头标签的正下方。其他任何地方都行不通。

然后每个项目平均只需要半小时左右的工作量,不需要对 IE8 进行密集调试!

即使是 Msn.com 也这样做 - 有点讽刺,嗯?

最近写了一篇关于它的博文:http://blog.sankhomallik.com/2009/11/16/stop-wasting-time-debugging-on-ie8-when-you-dont-have-to-or-get-ie8-to-behave-like-ie7/

【讨论】:

当 IE9 出现时会发生什么?【参考方案6】:

与 IE7 相比,IE8 的渲染效果非常好,我有 IE6、IE7 和 IE8 的样式表;起初我认为条件 cmets 在经过一些实验后不适用于 IE8,我发现 IE8 没有应用一些规则,只是因为我需要将祖先类或父类放在首位,例如 我有一个像

的课

.niceclass some:properties;more:properties;

只有在我将其更改为以下内容时才起作用:

.parentclass .niceclass some:properties;more:properties;

#parentselector .niceclass some:properties;more:properties;

顺便说一句,在我只支持 IE8 的 css 中,我只有一个压倒一切的规则,其余的几乎就像 firefox 一样呈现,尽管这不会让我离开 FF!。

【讨论】:

【参考方案7】:

就我而言,我想使用 css 来使用圆角边框。 Vista 上的 IE8 不支持此类。而且由于图形的圆形边框也会显示出漂亮的圆形阴影,因此页面在 IE8 中看起来很糟糕。

我尝试使用条件 cmets,但无济于事,IE8 不会评估 if IE 表达式,因此不会包含外部样式表。

然后我看看将它置于 quirks/compatblity 模式,然而,这仍然不起作用,因为我使用的 CSS hack 不再适用于 IE8。

最后但最不重要的是,我发现了一个可以在兼容模式下正确呈现页面的 CSS hack。

* + html #test[id]  color:lime  

现在,我不知道这是否适用于 IE7 或更低版本,所以您至少需要三个 您想要支持的每个 IE 版本都有不同的 hack,例如

* + html #test,
    html+body #test,
    * html body #test
     color:lime 

我想知道 Internet Exploiter 的下一次回归会给我们带来什么。

【讨论】:

以上是关于使用条件注释定位 IE8 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

CSS 使用条件注释和一个样式表来定位IE

IE 修复 - 条件注释脚本不会执行

IE9 浏览器模式和条件注释

兼容ie8,firefox,chrome浏览器的代码片段

Chrome 条件注释

Java关于条件判断练习--统计一个src文件下的所有.java文件内的代码行数(注释行空白行不统计在内)