先纠正一个很常见的误区 很多人把 var(--color, red) 里的 red 当作“默认值”,但严格来说,它叫“回退值”,只在 --color 未定义或语法无效时才生效。注意这里的细节:如果变量已经定义了,但值是个空字符串、unset 或者 initial,浏览器仍然会使用这个变量值,根本不会
很多人把 var(--color, red) 里的 red 当作“默认值”,但严格来说,它叫“回退值”,只在 --color 未定义或语法无效时才生效。注意这里的细节:如果变量已经定义了,但值是个空字符串、unset 或者 initial,浏览器仍然会使用这个变量值,根本不会触发回退。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
来看几个典型的翻车案例:
:root { --text-color: ""; },然后用 color: var(--text-color, #333);,结果文字直接透明了——因为空字符串被当成了有效值,回退值根本没机会上场。--size 为 invalid-value,这时候 var(--size, 1rem) 才会触发回退,但这种场景其实很容易被忽视。那么,回退值到底支持什么?答案很宽泛:颜色、长度、甚至是另一个 var() 函数,比如 var(--bg, var(--fallback-bg, #fff))。但有一个坑:回退值里不能有逗号,否则会被截断。写 rgba(0,0,0,0.5) 没问题,但如果写成 1px solid, red,肯定出错。嵌套 var() 回退是安全的,浏览器会按顺序解析,不会死循环。
CSS 本身没有 if 判断,但可以借助 calc() 配合变量来控制回退逻辑。一个常见场景是:当主题色未设置时,自动 fallback 到 light/dark 模式适配值。
body {
--primary: var(--theme-primary);
--primary-fallback: #007bff;
--primary-safe: calc((1 * var(--primary, 0)) + var(--primary-fallback));
}
这招的底层逻辑是利用 calc() 对无效值报错后降级到回退值的特性。不过更稳妥的方式是直接用两层 var():
.btn {
background: var(--btn-bg, var(--primary, #007bff));
}
var(--btn-bg, ...) 尝试读取组件级变量var(--primary, #007bff) 是主题级兜底这种链式写法比 calc() 更易读,兼容性也更好——IE 不支持 calc() 里嵌套 var()。
用 element.style.setProperty('--color', '') 清空变量时,CSS 并不会立刻切到回退值。因为空字符串是合法值,不是“未定义”。只有删掉变量或者设为无效值(比如 'not-a-color')才能触发回退。
element.style.removeProperty('--color')element.style.setProperty('--color', 'invalid'),但要确保这个值在目标属性上下文中确实非法(比如 color: invalid 就会报错)getComputedStyle(el).getPropertyValue('--color') 检查时,返回空字符串并不等于变量未定义。需要结合该属性是否在 :root 中声明来综合判断回退值本身是静态的,不会响应媒体查询变化,但变量可以。容易忽略的是:当变量定义在 @media 块内,而 var() 在外层使用时,回退值只在变量完全不可用时生效,不会参与媒体查询匹配逻辑。
:root { --gap: 8px; }
@media (min-width: 768px) {
:root { --gap: 16px; }
}
.card { margin: var(--gap, 12px); }
小屏下 --gap 是 8px,大屏下是 16px,12px 这个回退值永远不会被用到——除非你把 :root 中的 --gap 删掉。
@media 切换var(--gap, 12px) 并配合不同的变量名:is(.dark, .light) { --text: var(--text-dark, #000); } 这种写法,回退值也不会受 :is() 影响,只取决于 --text-dark 是否存在回退值看着简单,真正的难点在于判断“变量到底算不算有效”。浏览器对空字符串、inherit、自定义语法错误的处理各不相同,建议在关键路径上打开 DevTools 的 Computed 面板,逐层验证实际取值。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述