var()不能放在属性名位置,因为它是专用于属性值的语法糖,CSS解析器在语法解析阶段就拒绝非法标识符,报Invalid property name;属性名必须是静态字面量,无法在样式计算阶段动态生成。

var() 不能放在属性名位置,浏览器直接报 Invalid property name
因为 var() 是专用于属性值(value)的语法糖,不是通用表达式。CSS 解析器在读取规则时,先按固定语法结构切分“属性名: 值”,而 var(--color) 出现在冒号左边,会被当作非法标识符直接拒绝。
常见错误现象包括:
-
var(--color): #333;→ DevTools 显示 Invalid property name -
var(--prop): value;→ 整条规则被丢弃,后续声明也不生效 - 编辑器可能不报错,但浏览器根本不解析该行
为什么不能像 JS 那样动态生成属性名
CSS 是声明式、静态解析的语言。选择器和属性名必须在样式表加载时就确定,而 var() 的求值发生在样式计算阶段(即 DOM 渲染前),远晚于语法解析阶段。此时属性名早已固定,无法回填。
真正起作用的只有三类东西:
立即学习“前端免费学习笔记(深入)”;
- 硬编码的属性名:如
color、margin - HTML 属性(供
attr()读取) - 伪类/伪元素名称(如
::before),但它们也不能由变量控制
想实现“根据变量切换属性类型”怎么办
没有纯 CSS 方案。必须靠 JS 驱动,核心思路是:读取变量值 → 判断逻辑 → 手动设置对应属性。
例如想让 --layout 控制用 margin 还是 padding:
const layout = getComputedStyle(document.documentElement)
.getPropertyValue('--layout')
.trim();
if (layout === 'margin') {
el.style.margin = '16px';
} else if (layout === 'padding') {
el.style.padding = '16px';
}
注意点:
- 不要试图用
el.style[layout] = '16px'——layout是字符串,但el.style.margin和el.style.padding是不同属性,JS 中不能靠字符串直接赋值(除非用Object.defineProperty或cssText) - 如果变量值来自用户输入或配置,务必校验是否为预期字符串,避免意外覆盖其他样式
容易被忽略的关键事实
这种限制不是浏览器 bug,而是 CSS 规范层的设计决定。所有主流引擎(Blink、Gecko、WebKit)都严格遵循:属性名必须是字面量,且在解析阶段完成识别。哪怕你用 PostCSS 或构建工具预处理,只要最终输出的是 var(--x): y,浏览器依然会报错——它根本不会进入样式计算流程。


















