条件注释仅在IE5.5–IE9中生效,IE10+及所有现代浏览器(Chrome/Firefox/Edge/Safari)完全忽略,因其语法已被彻底移除;必须硬编码于HTML <head> 中,仅支持 <link> 或 <script> 等原生标签,不可动态生成或置于CSS/JS内。

条件注释只在IE(≤9)中生效,现代浏览器完全忽略
条件注释是微软为 Internet Explorer 5–9 设计的私有语法,用于向特定版本 IE 提供差异化 HTML 或脚本。从 IE10 开始已彻底移除,所有现代浏览器(Chrome、Firefox、Edge、Safari)均不解析也不执行条件注释——它们被当作普通 HTML 注释直接跳过。
这意味着:如果你的目标是兼容 Chrome/Firefox/Edge 13+ 或移动端,写条件注释毫无作用;只有当项目仍需支持 IE8/9 时,它才有实际意义。
<!--[if IE]> 这类语法必须写在 HTML 文档流中,不能放在 <script> 或 <style> 内部
条件注释不是 JavaScript 或 CSS 的特性,而是 HTML 解析器层面的预处理指令(仅 IE 实现)。它只能出现在 HTML 文档主体、<head> 或 <body> 中的纯文本位置。
- ✅ 正确位置:
<head>里引入 IE 专属 polyfill:<!--[if IE]> <script src="ie-only-polyfill.js"></script> <![endif]-->
- ❌ 错误用法:在
<script>块里写:<script> // <!--[if IE]> alert('ie'); <![endif]--> ← 这行只是 JS 字符串,无任何条件逻辑 </script> - ❌ 也不能放在
<style>里伪装 CSS 条件:<style> <!--[if IE]> .box { filter: progid:DXImageTransform.Microsoft.gradient(...); } <![endif]--> </style>—— 浏览器会把整行当无效 CSS 规则丢弃
常见条件表达式写法与对应 IE 版本范围
语法固定为 <!--[if expression]>...<![endif]-->,其中 expression 是 IE 自定义的布尔表达式,不支持 JavaScript 语法。
立即学习“前端免费学习笔记(深入)”;
-
<!--[if IE]>:匹配所有 IE(5.5–9),但不包括 Edge -
<!--[if IE 8]>:仅 IE8(标准模式),注意:不匹配兼容模式下的 IE8 -
<!--[if gte IE 9]>:IE9 及以上(即 IE9/10 兼容模式,但 IE10+ 实际已不支持该语法) -
<!--[if lt IE 9]>:IE8 及更低版本(常用作“非 IE9+”兜底) -
<!--[if !IE]>:非 IE 浏览器(理论上,但现代浏览器不识别,所以实际无效)
⚠️ 注意:gte/lt 等操作符对文档模式敏感。若页面触发了 IE 的兼容性视图(如通过 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">),条件注释会按该模拟版本判断,而非真实 IE 版本。
替代方案比条件注释更可靠:特征检测 + 动态加载
依赖用户代理或 IE 版本号越来越不可靠(比如 Edge 用户代理可伪造、IE11 已废除条件注释),真正健壮的做法是检测能力而非浏览器。
- 用
document.documentMode判断是否为 IE(仅 IE 支持,且值为文档模式数字,如 7/8/9/10) - 用
'msMaxTouchPoints' in navigator或'ActiveXObject' in window辅助识别旧版 IE - 优先使用
Modernizr或手写if ('fetch' in window) { ... }做功能检测 - 需要加载 polyfill 时,用动态
document.createElement('script')+appendChild控制时机,比静态条件注释更可控
条件注释现在基本只存在于遗留系统维护场景。一旦你发现项目里还在大量用 <!--[if IE 8]>,说明它大概率还没迁出 IE 生态——这时候更该关心的是如何安全下线 IE 支持,而不是怎么写得更“标准”。



















