条件注释仅在IE5.5–IE9有效,IE10+及现代浏览器均静默忽略;语法错误会破坏HTML结构;应改用特征检测、@supports或服务端UA判断替代。

条件注释在现代开发中已经完全失效,<!--[if IE]> 这类写法在 IE10+、Edge、Chrome、Firefox 中均被当作普通 HTML 注释处理,不会触发任何条件逻辑——这不是你代码写错了,而是浏览器根本不再解析它。
IE条件注释只在 IE5.5–IE9 生效
这是硬性事实,不是兼容性问题,而是功能移除。IE10 开始默认禁用条件注释解析器,即使强制设置 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">,也仅影响渲染模式,不影响注释解析。你在 IE11 或 Edge(Chromium)里看到的“没反应”,是预期行为,不是 bug。
-
<!--[if IE]>在 IE8 下能加载html5shiv.js,在 IE11 里连控制台都不会报错,只是静默忽略 -
<!--[if !IE]>在所有现代浏览器中都无效,包括 IE11:它既不执行,也不反向匹配,“非 IE”分支形同虚设 - IE9 是最后一个支持
gte/lt等比较操作符的版本;<!--[if gte IE 10]>在任何 IE 版本中都不起作用
写错条件注释会直接破坏 HTML 结构
IE8–IE9 对注释语法极其敏感,一个空格或符号错误就可能导致后续 DOM 被吞掉、页面白屏或样式错乱。这不是警告,是真实发生过的线上事故。
- 必须严格闭合:
<!--[if IE]>...<![endif]-->,漏掉<![endif]-->会让 IE 把后面所有 HTML 当作注释内容 - 注释内不能出现连续两个短横
--,例如<!-- 这里用了--破折号 -->→ IE8 直接截断,后续标签原样输出为文本 -
<!--[if IE 8]>合法,但<!--[if IE8]>(少空格)在 IE8 中完全不识别 - 不要嵌套条件注释,比如在
<!--[if IE]>里再写<!--[if lt IE 9]>,IE9 会解析失败
现在该用什么替代条件注释
特征检测比 UA 判断更可靠,也比条件注释更可控。重点不是“判断是不是 IE”,而是“这个浏览器支不支持我要用的功能”。
立即学习“前端免费学习笔记(深入)”;
- 检测
document.documentMode可粗略判断 IE 渲染模式(documentMode === 8表示 IE8 兼容模式),但它在 IE11 文档模式为 Edge 时返回undefined - 用
!!window.addEventListener或'classList' in document.body判断基础 API 支持度,再决定是否加载 polyfill - 服务端 UA 判断仍可用,但需注意移动端 UA 伪造普遍,且 HTTP/2 下 header 压缩可能影响 UA 字符串完整性
- CSS 层面优先用
@supports,例如@supports (display: grid) { ... },比 CSS Hack 更可持续
真正麻烦的从来不是“怎么写条件注释”,而是遗留系统里那些靠它加载的 html5shiv.js、respond.js 和一堆 IE-only 样式表。它们现在不仅没用,还可能干扰资源加载顺序、触发 CSP 报警,或者让构建工具误判依赖关系。删掉比修它更安全。



















