You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何@property定义的<length>类型自定义属性中em单位赋值不生效?

注意:由于@property兼容性较差,以下最小可复现示例(MRE)可能在部分浏览器中无法正常运行。

问题根因

该现象是@property规则的固有特性导致的:@property声明的initial-value是在自定义属性全局注册阶段就完成计算的,计算上下文为全局根上下文,而非使用该变量的元素的上下文。em是相对当前元素font-size的单位,全局注册阶段没有对应的元素font-size作为参照,因此这个初始值无法被正确解析为有效的长度值,最终var(--width1)会回退为默认的auto。而px是绝对单位,全局上下文可以直接解析出固定值,因此--width2可以正常生效。

可用解决方案

方案1:将em单位的赋值下沉到元素规则中

不要在@property的initial-value里定义em单位的初始值,改为在使用该变量的选择器中赋值,此时赋值的上下文为当前元素的上下文,em可以正常计算:

@property --width1 {
  syntax: '<length>';
  inherits: false;
  /* 可填写合法的绝对单位作为兜底值 */
  initial-value: 0;
}

#div1 {
  --width1: 20em;
  width: var(--width1);
}

方案2:改用rem作为相对单位

如果你的业务场景只需要相对于根元素字体大小的相对长度,可以把em替换为rem,rem的参照是全局固定的根元素font-size,在initial-value里可以正常解析:

@property --width1 {
  syntax: '<length>';
  inherits: false;
  initial-value: 20rem; /* 对应根字体大小的20倍,全局可正常计算 */
}

方案3:开启继承,在父级统一声明变量值

如果需要多个元素复用这个em单位的变量,可以将inherits属性改为true,然后在公共父元素上赋值--width1: 20em,所有子元素继承该值时会基于父元素的上下文计算,也可以正常生效:

@property --width1 {
  syntax: '<length>';
  inherits: true;
  initial-value: 0;
}

/* 公共父元素规则 */
body {
  --width1: 20em;
}

内容的提问来源于stack exchange,提问作者Book Of Flames

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:09:01