@property

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 免费信用额度!

我完全不了解 @property,但我看到它即将进入 Chrome,所以我猜了解它是个好主意!

有一个草案规范 和一个“发布意向”文档。 该文档中的代码显示

@property --my-property {
  syntax: "<color>";
  initial-value: green;
  inherits: false;
}

我们现在在自定义属性完整指南 中提供了更多关于这一切的信息。

这是 CSS 与 CSS.registerProperty() 的精确等价物,它是用于声明 CSS 自定义属性的 JavaScript 语法,也是一件新事物(似乎在 Houdini 伞下)。

看起来你声明这些不是在选择器块内,而是在外面(比如 @media 查询),而且一旦你声明了,你实际上还没有创建新的自定义属性,你只是注册了你可能稍后会创建的事实。 当你真正去创建/使用自定义属性时,你会像现在一样在选择器块内创建它。

“常见的用例”非常酷。 现在,这在 CSS 中不可行

.el {
  background: linear-gradient(white, black);
  /* this transition won't work */
  transition: 1s;
}
.el:hover {
  background: linear-gradient(red, black);
}

你可能会认为渐变中的白色会随着 transition 逐渐变为红色,但事实并非如此,它不能以这种方式进行过渡。 以前,如果我们需要这样做,我们会使用一些技巧,比如用新的渐变颜色淡入伪元素,或者转换比元素更宽的渐变的 background-position 来伪造它。

听起来现在我们可以…

@property --gradient-start {
  syntax: "<color>";
  initial-value: white;
  inherits: false;
}

.el {
  --gradient-start: white;
  background: linear-gradient(var(--gradient-start), black);
  transition: --gradient-start 1s;
}

.el:hover {
  --gradient-start: red;
}

可以推测,这现在之所以有效,是因为我们告诉 CSS 此自定义属性是 <color>,因此它可以像颜色一样被处理/动画,这是以前不可能的。

让我想起了我们使用 attr() 函数从元素中提取 data-size="22px" 时,我们实际上无法使用 <length> 22px,它只是一个字符串。 但是也许将来我们会得到 attr(data-size px);

我不知道 @property 什么时候才能真正使用,但看起来 Chrome 会率先发布,Safari 和 Firefox 也发出了积极的信号。 👍