HTML条件注释仅在IE5–IE9中有效,IE10+及所有现代浏览器彻底移除支持;语法零容错,需严格遵循格式;现代开发应改用特征检测替代UA判断。

HTML条件注释在现代开发中已完全失效,这类写法对 IE10+、Chrome、Firefox、Edge(Chromium)、Safari 都不起作用——不是“兼容性差”,而是引擎根本不再解析它。
条件注释在哪些浏览器里还能用
仅限 IE5–IE9(确切说是 Trident 引擎 v5.5–v9),且必须满足三个硬性前提:
-
<!DOCTYPE html>顶格写,前面不能有空格、BOM 或注释 - 语法零容错:
<!--[if IE 8]>少个空格就失效;<![endif]>漏掉-->会导致后续 HTML 全部被吞成文本 - IE10 开始彻底移除支持,
<!--[if gte IE 10]>在任何 IE 版本中都不识别(IE9 是最后一个支持gte/lt的版本)
为什么 <!--[if !IE]> 总是不生效
这个写法在所有浏览器(包括 IE11)中都无效。原因很直接:
- IE10+ 把整个条件注释块当普通注释跳过,不执行也不渲染
- 其他浏览器压根不认识
<!--[if ...]>语法,按标准 HTML 注释规则处理:从<!--到第一个-->结束,中间的[if !IE]被当作注释内容,后面紧跟的 HTML 会暴露出来或错位 - 常见翻车现场:
<!--[if !IE]><script src="modernizr.js"></script><![endif]-->→ 实际效果是<script src="modernizr.js"></script>在所有浏览器里都执行了
替代方案必须绕开 UA 字符串
靠 navigator.userAgent 判断 IE 已不可靠(IE11 报 Trident,移动端 UA 可伪造),真正有效的做法是验证你要用的功能是否存在:
立即学习“前端免费学习笔记(深入)”;
- 检测 DOM 行为:
'classList' in document.body、!!window.addEventListener - 检测 API:
'fetch' in window、'IntersectionObserver' in window - CSS 层面用
@supports:@supports (display: grid) { ... },但注意 IE11 不支持@supports语法,得先写 Flex 降级 - 老 IE 语义标签兜底:只在
<!--[if lt IE 9]>中加载html5shiv.min.js,且必须配合 CSS 补main, section { display: block; }
最常被忽略的一点:条件注释不是“兼容方案”,而是历史遗留的 IE 专用开关。今天还在代码里留着 <!--[if IE]>,等于默认项目仍需支持 IE9 以下——而实际场景中,这往往只是没清理干净的旧配置。



















