Skip to content

现代 css 特性: @property

截止 2024/12/02 止,该特性的浏览器覆盖率为 92% (不要在 fifrefox 浏览器中使用)

@property 是 CSS Houdini API 中的一部分,允许开发者自定义 css 属性

如何使用

css
@property --property-name {
  syntax: "<color>";
  inherits: false;
  initial-value: #EEEEEE;
}

syntax(required)

syntax 描述了自定义属性所允许的语法结构:

  • <length>: 10px, 1em, 1rem...
  • <number>: 12, 3.14, -3.14, 0...
  • <string> 未在 mdn 中提及,实测有效
  • <percentage>: 50%, 100%, 20%...
  • <length-percentage>: length or percentage
  • <color>: #EEEEEE, #ffffff, #000000...
  • <image>
  • <url>
  • <integer>
  • <time>
  • ...

syntax 支持类似于 ts 中的元组和联合类型:

css
@property --color-blue {
  syntax: "blue | cyan | dodgerblue";
  inherits: true;
  initial-value: blue;
}

@property --lengthOrPercent {
  syntax: "<percentage> | <length>";
  inherits: false;
  initial-value: 10%;
}

syntax 可以定义空格隔开(+)和逗号隔开(#)的属性:

css
// box-shadow
@property --box-shadow-length {
  syntax: "<length>+";
  inherits: false;
  initial-value: 0px 0px 8px 2px;
}

// gradient
@property --bg-gradient{
  syntax: "<image>#";
  inherits: false;
  initial-value: 
    repeating-linear-gradient(to right, blue 10px 12px, transparent 12px 22px), 
    repeating-linear-gradient(to bottom, blue 10px 12px, transparent 12px 22px);
}

any type: { syntax: "*"; }

inherits(required)

inherits 描述该属性是否能够被继承

initial-value

initial-value表示该属性的初始值

实际应用

通过 transition, 开发者可以针对一些属性的设置过渡动画,但是有部分的属性切换无法通过 transition 来设置过渡动画,例如: background (gradient)

这个时候可以通过设置 { transition-name: 自定义属性 }的方式来达成:

css
.ex-1-normal {
  --colorA: #fff;
  --colorB: #000;

  background: linear-gradient(45deg, var(--colorA), var(--colorB));
  transition: 1s background;

  &:hover {
    --colorA: yellowgreen;
    --colorB: deeppink;
  }
}
css
@property --houni-colorA {
  syntax: '<color>';
  inherits: false;
  initial-value: #fff;
}

@property --houni-colorB {
  syntax: '<color>';
  inherits: false;
  initial-value: #000;
}

.ex-1 {
  background: linear-gradient(45deg, var(--houni-colorA), var(--houni-colorB));
  transition: 1s --houni-colorA, 1s --houni-colorB;

  &:hover {
    --houni-colorA: yellowgreen;
    --houni-colorB: deeppink;
  }
}
2025( )
今日 8.33%
本周 42.86%
本月 48.39%
本年 4.11%
Powered by Snowinlu | Copyright © 2024- | MIT License