条件注释仅在IE5.5–IE9中有效,IE10+及现代浏览器完全不解析;必须硬编码于HTML <head> 顶层、严格DOCTYPE下,仅支持<link>等原生标签,且CSS需语法降级适配。

条件注释在 IE10+ 和所有现代浏览器中完全失效,只对 IE5.5–IE9 有效;它不能写在 CSS 或 JS 里,也不能动态生成——必须硬编码在 HTML 的 <head> 中,否则压根不加载。
为什么 <!--[if IE 10]> 不起作用
IE10 开始已彻底移除条件注释解析器,<!--[if IE 10]> 这类写法会被当普通注释直接跳过。Chrome、Firefox、Edge(Chromium)同理,全程无视。这不是路径错或缓存问题,是语法本身已被弃用。
-
<!--[if lt IE 9]>是唯一能稳定覆盖 IE6/7/8 的写法 -
<!--[if IE 9]>可单独给 IE9 加载补丁,但 IE9 本身支持大部分 CSS2.1,通常只需微调 -
<!--[if !IE]>在 IE10+ 里也不触发——它不是“非 IE”,而是“所有浏览器都不识别”
必须写在 <head> 顶层,且 DOCTYPE 要严格
条件注释不是 JS 或 CSS 的逻辑分支,它是 IE 渲染流程早期的 HTML 解析阶段行为。位置或格式稍有偏差,整个块就失效。
- 必须顶格写在
<head>内,不能嵌套在<div>或其他标签里 -
<!DOCTYPE html>必须第一行,前面不能有空格、BOM 或 XML 声明 - 路径不能用
./ie.css,IE6 不识别点斜杠,得写成css/ie8-and-down.css或绝对 URL - 别加
media="all"——条件注释本身已完成环境过滤,加了反而可能触发旧版 IE 的解析 bug
<link> 标签写法和加载顺序很关键
条件注释只支持 <link>、<script> 等原生 HTML 标签,不能包裹 @import 或内联样式。加载时机也影响最终效果。
立即学习“前端免费学习笔记(深入)”;
- 把条件注释放在主样式表
<link>之后,避免被覆盖(IE8 及以下不支持 CSS3 选择器,权重设计要更谨慎) - 多个条件注释按顺序加载,IE 会阻塞渲染直到这些 CSS 下载并解析完
- 不要用
document.write或 DOM 操作动态插入——IE8+ 在DOMContentLoaded后已不解析条件注释 - IE8 及以下不认识
::before、nav > ul li:first-child、background: linear-gradient(),这些得降级处理
IE6–IE8 兼容 CSS 里不能写的语法
单独抽离的 ie8-and-down.css 不是主样式表的简单复制,必须做语义和语法降级。否则即使加载成功,样式也不会生效。
- 禁用 CSS3 选择器:
:nth-child()、:not()、属性选择器[type="text"]都不行 - 伪元素只认单冒号:
:before可用,::before无效 - 圆角、阴影、渐变全砍掉,或用 PNG 背景图模拟(注意 IE6 Alpha 通道需
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader) - 透明度用
filter: alpha(opacity=50),且必须配合zoom: 1触发 hasLayout
真正麻烦的不是怎么写条件注释,而是它无法解决 JS 驱动的样式逻辑——比如 Modernizr 检测后动态加载 CSS,此时条件注释早已被 IE 解析完毕并丢弃。这种场景下,只能换用特征检测 + class 注入的方式兜底。


















