现在不该再写 HTML 条件注释,因其仅 IE5–IE9 支持,IE10+及所有现代浏览器(Edge、Chrome、Firefox、Safari)已彻底移除该功能,静默忽略,无法用于项目部署或兼容控制。

直接说结论:现在不该再写 HTML 条件注释。IE5–IE9 已退出历史舞台,IE10+ 和所有现代浏览器(包括 Edge、Chrome、Firefox、Safari)完全不解析 <!--[if IE]> 这类语法,写了也白写,还可能干扰 HTML 解析或被误认为普通注释。
为什么还在提条件注释?——因为你在维护老项目,或者接手了 2010 年代遗留的代码库,里面还散落着 <!--[if lt IE 9]> 这样的标记。这时候不是“要不要写”,而是“怎么安全处理它”。
条件注释只在 IE5–IE9 生效,IE10+ 完全无视
这是最常被忽略的前提。很多开发者看到 <!--[if IE 10]> 就以为“IE10 应该走这个分支”,但实际:
- IE10 及之后版本已彻底移除条件注释解析器
-
<!--[if IE]>在 IE10+ 中和<!--没区别,纯当普通注释忽略 - Edge(无论旧版还是 Chromium 内核)从不支持
- 任何现代构建工具(Vite、Webpack、esbuild)也不会识别或处理它
换句话说:你本地用 IE9 测试能生效,换台电脑用 IE11 打开就失效;用 Chrome 打开,整段标记连同内容都静默消失(因为被当注释吞了)。
如果你必须保留旧条件注释,注意这三点格式风险
即使只是“读老代码”或“临时过渡”,也要避开几个真实踩过的坑:
-
<!--[if !IE]>在 IE10+ 下不会执行,但它在非 IE 浏览器中也不一定可靠——有些 HTML 压缩工具会把<!--[if !IE]>当作非法注释直接删掉 - 嵌套条件注释(比如在
<!--[if lt IE 9]>里再写一层<!--[if IE 6]>)会导致解析失败,IE9 会直接跳过整个块 - 注释末尾的
<![endif]-->如果前面有空格或换行(如<![endif] -->),部分旧版 IE 会报错或截断后续 HTML
正确写法示例(仅限 IE9 及以下环境验证):
<!--[if lt IE 9]> <script src="html5shiv.min.js"></script> <![endif]-->
替代方案比硬写条件注释更可控
真要兼容老浏览器,优先用运行时检测而非静态注释:
- 用
document.documentMode判断是否为 IE(仅 IE 支持,返回值为数字,IE11 返回 undefined) - 用
navigator.userAgent匹配MSIE或Trident(注意 IE11 的 UA 里已不含MSIE) - 在
<html>上动态加 class,例如class="ie ie9",再用 CSS 选择器控制样式 - 对关键 polyfill(如
fetch、Promise)用if (typeof Promise === 'undefined')检测后加载
这样做的好处是:逻辑清晰、可调试、不污染 HTML 结构、构建时还能做 tree-shaking。
注释里写兼容说明,别写条件逻辑
HTML 注释本身(<!-- ... -->)永远安全,所有浏览器都支持。你可以用它说明兼容性,而不是控制行为:
- 写成:
<!-- [IE11-] <dialog> 需要 polyfill: https://github.com/ghosh/micromodal --> - 避免:
<!--[if IE]><script>...</script><![endif]-->(除非确定只跑 IE9) - 注释里不要出现
--或>,否则会提前截断,比如<!-- IE 版本 是非法的
真正容易被忽略的,不是“怎么写条件注释”,而是“什么时候该删掉它”。只要项目不再支持 IE9 及以下,所有 <!--[if ...]> 都该清理干净——它们不是注释,是技术债。



















