条件注释仅对ie5.5–ie9有效,ie10+及所有现代浏览器完全忽略;必须硬编码在html的中,不可动态生成、不可写入css或js,且语法、位置、doctype均需严格符合规范。

条件注释在 IE 中引入 CSS 已经失效于 IE10 及以上版本,仅对 IE5.5–IE9 有效;它不能写在 CSS 文件里,也不能用 JS 动态生成——必须硬编码在 HTML 的 中,否则完全不生效。
条件注释只在 IE5.5–IE9 生效,IE10+ 和所有现代浏览器直接忽略
这是最常被误判的一点:很多人写完 <!--[if IE 10]><link rel="stylesheet" href="ie10.css"><![endif]--> 后发现没加载,不是路径错了,是 IE10 根本不认这个语法。IE10 开始已彻底移除条件注释支持,Edge、Chrome、Firefox 更是全程当普通注释处理。
常见错误现象:
-
<!--[if !IE]>在 IE10+ 里也不触发,它不是“非 IE”,而是“所有浏览器都不识别” - 把条件注释塞进
<style>块或 JS 字符串里,结果白写——解析器根本不会执行 - 用
document.write或 DOM 操作动态插入,IE8+ 在DOMContentLoaded后已不解析条件注释
必须写在 HTML 的 里,且顺序和路径有硬性限制
条件注释不是可选配置,它是 IE 渲染流程中早期解析的 HTML 结构,位置和写法稍有偏差就会失效。
- 只能出现在
<head>或<body>的顶层(不能嵌套在<div>或其他标签内) - HTML 必须是标准模式(
<!DOCTYPE html>必须顶格写,前面不能有空格或 XML 声明) - 路径不能用 Node.js 风格的
./ie.css,IE6 不识别点斜杠,得用css/ie.css或绝对 URL - 别加
media="all"——IE 条件注释本身已完成环境过滤,加了反而可能触发旧版解析 bug
用 lt/gte 等关键字控制版本范围,大小写不敏感但空格和括号必须严格
条件表达式不是正则,也不是 JS 表达式,它是一套固定语法,括号、空格、关键字拼写错一个字符就整个失效。
- 正确:
<!--[if lt IE 9]>、<!--[if gte IE 8]> - 错误:
<!--[if LT IE 9]>(部分旧渲染器失败)、<!--[if ltIE9]>(缺空格)、<!--[if lt IE9]>(缺空格) lt是 “less than”,gte是 “greater than or equal”,不区分大小写,但必须全小写且带空格- 想覆盖 IE6–IE8?用
<!--[if lt IE 9]>;只给 IE9 单独加?用<!--[if IE 9]>
加载独立 CSS 文件比写 hack 更干净,但要注意加载时机和覆盖逻辑
比起在主 CSS 里堆 *zoom:1 或 _float:left 这类 hack,用条件注释引入 ie8-and-down.css 是更可控的方式——但前提是加载顺序和选择器权重设计得当。
- 通常把条件注释放在主样式表
<link>之后,避免被覆盖;如果要强制降级,也可把主样式包在<!--[if gt IE 8]>...<![endif]-->里 - IE8 及以下不支持
display: flex,光加前缀没用,得在降级 CSS 里用display: table或float重写布局 - 多个条件注释按 HTML 顺序加载,IE 会阻塞渲染直到这些 CSS 下载并解析完——所以文件要尽量小,别塞无用规则
真正容易被忽略的是:条件注释不是“兼容方案”,而是“历史拦截开关”。它解决不了 IE10+ 的问题,也救不了现代 CSS 语法在 IE8 的失效;它的价值仅限于精准分发——让该加载的浏览器加载,不该加载的压根不碰那行代码。一旦项目还要求支持 IE9,就得接受它是个 HTML 层的硬编码约束,绕不开,也优化不了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











