条件注释仅在IE5–IE9中有效,IE10+及所有现代浏览器(Chrome/Firefox/Edge/Safari)彻底移除并静默忽略;必须硬编码于HTML <head> 中,通过<link>加载补丁CSS,且需禁用构建工具的注释删除。

条件注释只在IE浏览器中有效
条件注释是微软为 Internet Explorer(IE)特供的语法,从 IE5 开始支持,到 IE10 起被完全移除。这意味着: 这类写法在 Chrome、Firefox、Edge(Chromium 版)、Safari 等现代浏览器里会被当作普通 HTML 注释直接忽略——既不执行,也不报错,更不会触发任何逻辑。
如果你的目标用户仍有 IE8/9/10 旧版访问需求,才值得考虑;否则,现在写条件注释基本等于写一段“仅对已退役系统生效”的无效代码。
<!--[if IE]> 写法及其常见失效原因
经典写法示例:
<!--[if IE]> <script src="ie-only.js"></script> <![endif]-->
但实际中常遇到“没生效”问题,原因包括:
立即学习“前端免费学习笔记(深入)”;
- 页面未声明
<!DOCTYPE html>:IE 在怪异模式(Quirks Mode)下会完全忽略条件注释 - 使用了
<!--[if lt IE 9]>却在 IE11+ 或非 IE 浏览器中测试:结果必然是静默跳过 - 条件注释嵌套或格式错误,比如多写了空格、换行不规范,导致 IE 解析失败(如
<!-- [if IE]>开头多了空格就无效) - HTTP 响应头设置了
X-UA-Compatible: IE=edge但页面又强制用meta标签降级,引发渲染模式冲突
替代方案比条件注释更可靠
现代项目中,应该用更可控的方式做兼容处理:
- 用 JavaScript 检测
navigator.userAgent或特性(如document.documentMode)判断是否为旧版 IE,再动态加载资源 —— 注意:document.documentMode在 IE11 中返回undefined,需结合MSInputMethodContext和document.body.style.msTouchAction综合判断 - 构建时通过 Babel + @babel/preset-env 自动注入 polyfill,或用
core-js按需引入 - CSS 中避免
@supports误用于 IE:它在 IE 中完全不识别,应改用类名钩子(如服务端注入<html class="ie9">),再写.ie9 .my-component { ... } - 若必须服务 IE8,建议单独维护一个 legacy 构建分支,而不是靠运行时条件注释拼凑兼容性
Edge 浏览器里条件注释彻底失效
EdgeHTML 版 Edge(即旧 Edge,版本号 ≤18)已不支持条件注释;Chromium 版 Edge(≥79)更不可能支持。试图用 <!--[if !IE]> 来“排除 IE”并以为能捕获 Edge,结果只会让那段代码在所有现代浏览器中都消失。
真正需要区分的是“是否支持某 API”,而不是“是不是叫 IE 的那个浏览器”。比如检测 fetch 是否可用,比检测 document.documentMode 更贴近实际需求。
旧项目迁移时最容易卡在这里:把一堆 <!--[if IE]> 当成兼容层主干,却没意识到它们早已形同虚设。



















