判断是否为真IE环境最可靠方法是检测document.documentMode是否为5–11的数字;Edge中该属性为undefined,且其CSS Hack(如\9)已失效。

现在直接写 \9 或 _property 已经基本无效——IE11 默认禁用条件注释,Edge 从 12 开始彻底放弃 IE 兼容模式,所谓“精准修复”必须先确认你面对的是真实 IE 环境,而不是 Edge 的文档模式模拟。
怎么判断当前是不是真 IE(不是 Edge 模拟)
靠 document.documentMode 最可靠:documentMode 存在且为数字(5–11),才是真 IE;Edge 浏览器中该属性为 undefined。别信 navigator.userAgent 里的 Trident 或 MSIE,它们在 Edge 的兼容模式下仍可能残留,但渲染引擎早已切换。
实际检测建议:
- 只对
document.documentMode !== undefined的环境加载 hack 样式或 JS 补丁 - 避免用
@supports判断 IE:IE 不支持该语法,会直接跳过 - 不要依赖
html元素上的自动 class(如ie10),现代构建工具或 CMS 可能已移除这类逻辑
哪些 CSS Hack 在 IE8–IE11 还真正有效
IE8–IE11 仅剩两个相对可靠的属性级 hack:
立即学习“前端免费学习笔记(深入)”;
-
property\9:IE8–IE11 全部识别(注意是反斜杠 + 数字,不是\0或\9\0,后者在 IE11 中已被废弃) -
*property:仅 IE7–IE8 识别,IE9+ 忽略;_property在 IE8 标准模式下已失效,仅兼容模式(documentMode === 5/7)可能偶然起作用
示例(修复 IE 下 flex 子项不收缩问题):
.container {
display: flex;
}
.item {
flex: 1;
max-width: 100%\9; /* IE8–IE11 强制限制宽度 */
}注意顺序:hack 必须写在标准声明之后,否则会被覆盖。
为什么 Edge(12+)不能用传统 CSS Hack
EdgeHTML 引擎(Edge 12–18)和 Chromium Edge(79+)都不解析 \9、*、_ 等符号,它们把整个声明当无效 CSS 忽略。你看到的“Edge 下样式异常”,大概率是以下之一:
- 页面被强制设为 IE 兼容视图(
X-UA-Compatible响应头或 meta 标签未清除) - CSS 中用了 Edge 不支持的旧语法(如
filter: progid:DXImageTransform...) - JS 动态插入的样式含 IE-only 属性,而 Edge 报错后中断执行
真正要修 Edge 的 Bug,得换路子:@supports (-ms-ime-align: auto) 可粗筛 EdgeHTML;Chromium Edge 则需靠特性检测(如 CSS.supports('display', 'grid'))或 UA 字符串中的 Edg/。
比 Hack 更稳的兜底方案
硬写 hack 容易失控,优先考虑这三类替代:
- 用
html元素 class 控制范围:服务端或构建时注入class="ie ie10",再写.ie10 .target { ... },避免污染全局 CSS - 对关键布局降级为
float或table-cell:IE8–IE10 对这些更稳定,比强行 hackflex更可靠 - 用
script注入补丁:比如检测到document.documentMode === 10时,动态加style标签覆盖特定规则,避免 CSS 解析阶段出错
最后提醒一句:所有 hack 都该加注释说明触发条件和目标版本,比如 /* IE10 only: fixes flex-basis calc() bug */。没人能凭空猜出 width: 200px\9 是为哪个具体 Bug 而写。



















