条件注释仅对IE5.5–IE9有效,IE10+及所有现代浏览器完全忽略;必须硬编码在HTML的<head>中,且需严格满足DOCTYPE、位置、语法三重限制。

条件注释在 IE10+ 和所有现代浏览器中完全失效,仅对 IE5.5–IE9 有效;硬塞进 HTML 的 <head> 也必须满足 DOCTYPE、位置、语法三重严苛限制,否则白写。
哪些 IE 版本真正支持条件注释
只有 IE5.5 到 IE9(含)原生识别 <!--[if ...]> 语法。IE10 开始彻底移除该机制,哪怕开启兼容性视图,<!--[if IE 10]> 也不会触发——它被当成普通注释直接跳过。Edge、Chrome、Firefox 全程无视。常见误判是看到“IE10 兼容模式”就以为还能用,实际是 Trident 渲染引擎层面的硬性移除。
-
<!--[if IE]>:匹配 IE5.5–IE9,不包括 IE10+ -
<!--[if gte IE 8]>:≥ IE8,但 IE10+ 不解析,所以只生效于 IE8/9 -
<!--[if !IE]>:不是“非 IE”,而是“所有浏览器都不识别”,IE10+ 和 Chrome 都跳过 - IE6 对路径敏感:
./ie6.css会 404,必须写成css/ie6.css或绝对 URL
必须硬编码在 HTML <head> 中,且格式零容错
条件注释不能由 JS 动态生成(document.write 或 appendChild 插入无效),也不能放在 <style> 块或外部 CSS 文件里。IE 只在初始 HTML 解析阶段扫描顶层注释,嵌套在 <div> 或 <body> 深层结构里也不行。
- DOCTYPE 必须顶格:
<!DOCTYPE html>前不能有空格、BOM 或 XML 声明 - 注释必须完整闭合:
<!--[if IE]><link rel="stylesheet" href="ie.css"><![endif]-->,结尾的-->少一个字符就失效 - 别加
media="all"——旧版 IE 在条件注释里解析 media 属性可能出 bug - 多个条件注释建议用空行分隔,避免压缩工具误删换行导致连成一行而失效
典型用法:加载 html5shiv、IE6/7/8 专用样式
最常见的实操场景是让老 IE 支持 HTML5 标签,或修复盒模型、浮动等渲染差异。这些必须配合版本判断精确加载,否则低版本 IE 加了高版本补丁反而崩溃。
立即学习“前端免费学习笔记(深入)”;
- IE8 及以下需
html5shiv:<!--[if lt IE 9]><script src="js/html5shiv.min.js"></script><![endif]--> - IE6 单独 hack 样式:
<!--[if IE 6]><link rel="stylesheet" href="css/ie6.css"><![endif]--> - IE7–IE8 合并处理:
<!--[if gte IE 7]><link rel="stylesheet" href="css/ie7-8.css"><![endif]-->(注意:IE9+ 不执行,所以安全) - 慎用
<!--[if !IE]>:它在 IE10+ 里也不触发,想给现代浏览器加资源请用 JS 检测document.documentMode或 UA
现在还该用吗?替代方案比硬扛更可靠
2026 年绝大多数项目已放弃 IE9 及以下支持,但若维护遗留系统,条件注释仍是唯一能在 HTML 层做精准版本分流的手段。不过要注意:它无法解决 JS 运行时兼容问题(比如 Array.prototype.forEach 在 IE8 报错),这类必须靠 Polyfill 或降级逻辑。
- 服务端 UA 判断更可控:Nginx 或 Node.js 根据
User-Agent头返回不同 HTML 片段,绕过客户端解析限制 - CSS 渐进增强优于 hack:用
@supports或特性检测代替*width、_width等不可维护的前缀 - 构建时预处理:Webpack/Vite 插件可在打包阶段根据目标浏览器自动注入或剔除条件注释块
最易被忽略的一点:条件注释本身不提供任何 JS 运行环境修复,它只是个“开关”。你加载的 ie8.css 里如果用了 flex 或 calc(),IE8 依然不认——样式兼容和脚本兼容是两件事,别混为一谈。



















