IE11及更早版本完全忽略CSS变量语法,必须用postcss-custom-properties静态替换并设preserve: false移除var()调用,配合no-cssvars类兜底;局部作用域、calc()、嵌套var()等均无法降级。
CSS变量在IE11及更早版本中完全不解析,不是“兼容性差”,而是整个语法被忽略——var(--color)在这些浏览器里等同于无效值,会导致样式丢失甚至布局塌陷。必须用构建时静态替换+运行时兜底双保险。
preserve: false
默认配置下,插件只是把color: var(--primary)变成color: #007bff; color: var(--primary);,IE看到第二行直接跳过,结果还是回退到继承色或初始值。只有启用preserve: false,插件才会真正移除var()调用,只保留降级后的静态值。
常见错误现象:
var(--x),说明插件没生效或配置错位.card { --pad: 1rem; }这种局部作用域,插件默认不处理——它只认:root和显式声明的作用域calc(--a + 1px)或嵌套var(--b),插件无法求值,原样保留PostCSS插件在编译期工作,它看不到JS动态设置的变量,也读不到跨文件定义的变量。所有能被降级的变量,必须满足:
立即学习“前端免费学习笔记(深入)”;
@import明确引入):root最稳妥;若用组件级变量,需确保postcss-custom-properties配置了importFrom指向变量源文件--color: red; ✅,--size: calc(1rem + 2px); ❌:root里CSS.supports()不能只传'--x'
想在JS里做运行时分支,别写CSS.supports('--x')——IE11会报TypeError。正确写法是传完整声明字符串:
if (CSS.supports('color', 'var(--theme-color)')) { element.style.setProperty('--theme-color', '#25b864');} else { element.style.color = '#25b864';}
注意:@supports规则本身IE11也不支持,所以CSS层降级不能依赖它;关键样式必须用class切换兜底,比如给<html>加no-cssvars类,再写.no-cssvars .btn { background: #007bff; }。
它会在页面加载时遍历全部DOM节点,查找var(--x)并注入内联样式。SPA首屏就执行,容易触发强制同步重排。真实项目中更稳的做法是:
cssVars(),避免首屏阻塞watch: true(监听DOM变化),改用手动cssVars({ onlyVars: ['--theme-color'] })缩小作用域body.theme-dark类 + 预编译两套CSS,比运行时解析快一个数量级最易被忽略的一点:所有var(--x, fallback)里的fallback必须是合法CSS值,不能是另一个var(--y)——IE连嵌套函数都不解析,会直接当无效值丢弃。