var()回退值仅在变量完全未声明或显式设为unset时生效;空字符串、initial、非法值等已声明状态均不触发回退,嵌套var()不可靠,IE11中整条声明被静默丢弃。

只有当变量完全未声明(或显式设为 unset)时,var(--x, fallback) 的回退值才会生效;已声明为空字符串、initial、非法值甚至语法错误,都不触发回退。
怎么判断变量到底“有没有定义”
浏览器对“未定义”的判定非常严格:它不看值是否有效,只看该自定义属性是否在继承链上被声明过。
-
getComputedStyle(el).getPropertyValue('--foo')返回""(空字符串)→ 表示已声明,但值无效或为空 - 返回
null→ 才是真正未声明,此时var(--foo, red)中的red才会启用 - 在 :root 或组件根节点写
--size: ""是最常见误操作——这会让所有后续var(--size, 16px)静默取空,而非降级
为什么 var(--x, var(--y, #000)) 在多数浏览器里根本不行
嵌套 var() 作为回退值,是 CSS 规范明确禁止的语法。Chrome/Firefox/Safari 现代版本虽有部分兼容,但行为不一致且不可靠。
-
var(--primary, var(--fallback, #000))→ 整条声明可能被忽略,或第二层var()被当作字面量字符串处理 - 正确多级降级必须扁平化:
var(--primary, var(--fallback))不行,但var(--primary, var(--fallback, #000))在部分引擎下能跑,不代表可上线 - 稳妥做法是提前计算好后备值:
--fallback-color: #000;,再用var(--primary, var(--fallback-color))
IE11 和旧 WebView 下回退值完全失效的真相
IE11 根本不识别 var() 函数语法,整条声明(包括回退值)被静默丢弃,不是“fallback 不生效”,而是“整个函数被跳过”。
立即学习“前端免费学习笔记(深入)”;
-
color: var(--text, #333);在 IE11 中等价于这一行不存在 - 必须靠编译时替换(如 PostCSS +
preserve: false)或双写法:color: #333; color: var(--text, #333); -
@supports (color: var(--x))在 IE11 里直接报 JS 错误,不能用于条件加载 - 如果项目仍需支持 IE11,关键变量应避免依赖运行时 fallback,而改用构建时确定的静态值
最容易被忽略的一点:回退值只解决“变量缺失”问题,不解决“变量污染”。一旦某处写了 --color: ; 或 --color: "",整个作用域链上的 var(--color, ...) 就失去兜底能力——这不是浏览器 bug,是设计使然。


















