条件注释仅在ie5.5–ie9中生效,ie10+及所有现代浏览器(chrome/firefox/edge/safari)完全忽略;必须写在html的中通过加载补丁css,且需禁用构建工具的html注释删除。

<!--[if IE]><![endif]--> 这类写法在 IE10+、Chrome、Firefox、Edge(Chromium)、Safari 中完全不生效,不是“兼容不好”,而是被引擎直接跳过或静默忽略。你现在用它做浏览器判断,等于没写。
<!--[if IE]> 在现代项目中根本不会执行
- IE10 开始,Trident 引擎彻底移除条件注释解析逻辑;IE11 和 Edge(即使开启兼容模式)也不会识别
<!--[if IE]>或<!--[if gte IE 9]> - 所有非 IE 浏览器(包括旧版 Safari/WebKit)把这类标签当普通注释处理:内容不渲染、不加载 JS、不触发任何逻辑
- 常见误用后果:
<!--[if !IE]><script src="modern.js"></script><![endif]-->→ 在 Chrome/Firefox/Edge/IE11 中全部不加载-
<!--[if lt IE 9]><script src="html5shiv.js"></script><![endif]-->→ 只对 IE6–IE8 有效,IE9+ 和所有现代浏览器无视,但若你已放弃 IE8 支持,这段就纯属冗余 - 检测 DOM API:
'classList' in document.body、'fetch' in window、'IntersectionObserver' in window - 检测渲染能力:
CSS.supports('display', 'grid')、CSS.supports('(transform-style: preserve-3d)') - 检测 IE 特有遗留属性(仅限必要降级):
document.documentMode(IE6–IE11 有值,Edge/Chrome/Firefox 返回undefined)
替代方案必须基于特征检测,而非 UA 或条件注释
硬编码判断
navigator.userAgent已不可靠(IE11 报"Trident",移动端 UA 可伪造,Edge 也带"Edg"),真正可持续的做法是验证你要用的功能是否存在:示例(轻量级 IE 判断):
if (document.documentMode || /MSIE|Trident/.test(navigator.userAgent)) { // 真 IE(含 IE11 兼容模式),可加载 polyfill 或降级样式 }⚠️ 注意:/MSIE|Trident/仅作兜底,优先走document.documentMode,因为 UA 字符串可能被篡改或省略。
条件注释语法错误极易导致页面白屏或结构错乱
IE8–IE9 的注释解析器没有容错能力,以下写法会直接破坏 HTML 解析流:
- 少空格:
<!--[if IE8]>❌(应为<!--[if IE 8]>) - 漏闭合:
<![endif]>❌(缺-->,后续所有 HTML 被吞成文本) - 注释内含
--:<!-- 配置开关: --debug -->→ 第二个--提前终止注释,后面内容暴露 - 嵌套使用:
<!--[if IE]><!--[if lt IE 9]><![endif]-->→ IE9 解析失败,脚本/CSS 不加载
现代开发中,这类风险远大于收益。除非你明确锁定只维护一个 IE8–IE9 内网系统,否则不要手写条件注释。
真实项目里最容易被忽略的一点:条件注释不是“兼容开关”,而是 IE 专属历史解析器指令。它和
@supports、if ('foo' in window)不在一个维度——后者是标准、可预测、可测试的运行时行为;前者是已废弃的、依赖特定引擎版本的、无法在 CI 中验证的黑盒逻辑。现在还留着它,多数时候只是技术债的视觉残留。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











