css中@property属性介绍

更新日期: 2022-05-07 阅读: 1.8k 标签: 属性

css的@property是CSS Houdini api的一部分,它允许开发人员显式定义 CSS 自定义属性,允许属性类型检查,设置默认值,并定义属性是否可以继承值。该规则直接在样式表中表示自定义属性的注册,无需运行任何 JS。有效的规则会生成一个已注册的自定义属性,就好像使用等效的 parameters.@property 调用了CSS.registerProperty 一样

Houdini 是一组底层 api,它公开了 CSS 引擎的部分内容,使开发人员能够通过钩入浏览器渲染引擎的样式和布局过程来扩展 CSS。Houdini 可以让开发者直接访问 CSS 对象模型(CSSOM) ,使开发者能够编写浏览器可以解析为 CSS 的代码,从而创建新的 CSS 特性,而无需等待这些特性在浏览器中实现。

@property兼容性如下:



@property语法

正常而言,我们定义和使用一个 CSS 自定义属性的方法是这样的:

:root {
--whiteColor: #fff;
}
p {
color: (--whiteColor);
}

而有了 @property 规则之后,我们还可以像下述代码这样去定义个 CSS 自定义属性:

@property --propery-name {
syntax: '<color>';
inherits: false;
initial-value: #fff;
}
p {
color: var(--property-name);
}

简单解读下:

@property --property-name 中的 --property-name 就是自定义属性的名称,定义后可在 CSS 中通过 var(--property-name) 进行引用

  • syntax:类型string。定义自定义属性的类型。例如,number,color,percentage等
  • inherits:类型boolean。定义自定义属性是否允许继承
  • initial-value:类型符合syntax定义的类型,定义初始值
  • syntax 和 inherits 描述符是必需的,其中任何一项缺失, 整条规则都将失效并且会被忽略
  • initial-value 描述符仅在syntax描述符为通用syntax定义时是可选的,否则也是必需的

@property 规则需要语法(syntax)和继承描述符(inheritsdescriptor); 如果缺少其中一个,则整个规则无效,必须忽略。只有在语法是通用语法定义的情况下,初始值描述符才是可选的,否则就需要描述符; 如果缺少初始值描述符,则整个规则无效,必须忽略它。


syntax可用有效字段

syntax 支持的语法类型非常丰富,基本涵盖了所有你能想到的类型。

length
number
percentage
length-percentage
color
image
url
integer
angle
time
resolution
transform-list
transform-function
custom-ident (a custom identifier string)


syntax声明复合属性值

syntax支持复合属性值,例如,font-family: Arial, Verdana, Geneva, sans-serif 和 border:1px solid #ccc,属性值是逗号或者空格分隔的值列表。

针对这种场景,syntax提供了语法声明符号+、#、|

syntax: '<color#>' :接受逗号分隔的颜色值列表
syntax: '<length+>' :接受以空格分隔的长度值列表
syntax: '<length | length+>':接受单个长度或者以空格分隔的长度值列表

符号(+),用于声明接受以空格分隔的值列表 例如:"<length>+"

@property --padding{
    syntax: '<lenth>+';
    inherits: false;
}

.box{
    --padding:0 10px;
    padding: var(--padding);
}

符号(#),用于声明接受以逗号分隔的值列表 例如:"<url>#"

@property --img-url{
    syntax: '<url>#';
    inherits: false;
}

.box{
    --img-url:url(img01.png),url(img02.png);
    background-image: var(--img-url);
}

符号(|),用于声明不同类型的值 例如:"<length> | <length>+ | auto"

@property --padding{
    syntax: '<length> | <lenth>+ | auto';
    inherits: false;
}

.box{
    --padding:10px auto;
    padding: var(--padding);
}


@property的JS语法

CSS.registerProperty方法用于注册css自定义属性。registerProperty用法跟@property大致相同,同样包括name、syntax、inherits和initialValue,只是把注册自定义属性,转移到JS上下文中执行。

JS中注册自定义属性

window.CSS.registerProperty({
    name: '--primary-color',
    syntax: '<color>',
    inherits: false,
    initialValue: 'green',
})

CSS中使用自定义属性

.box{
    background-color:var(--primary-color);
    color:white;
}


@property例子

如果你经常使用 css 的 transition 属性,试着回想一下,是不是遇到过这种情况:在给某个属性添加 transition 时,却没有生效。看下面这段 css 代码:

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

你可能认为这个渐变中的白色会随着过渡渐变为红色,但事实并非如此,这种过渡是不可能的。如果我们过去需要使用一些小技巧实现它,比如用新的渐变颜色在伪元素中褪色,或者用比元素渐变更宽的背景位置来伪造它。

但是现在我们可以这样做了:

@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>  ,所以它可以被处理或者动画化。之前的颜色值是无法被动画化的。


@property属性支持transition动画

@property声明的自定义属性支持transition动画。不要小看这个小小的转变,就仿佛给我们开了一扇通向css动画世界的大门。只要你的想象力足够强大,就可以创造出很多令人惊奇的css动画。

以往,用CSS变量定义背景渐变,背景无渐变动画效果

:root{
    --start-color1:red;
    --end-color1:black;
}

.child{
    background-image:linear-gradient(
    to bottom,
    var(--start-color1),
    var(--end-color1)
  );
}

.child:hover{
    --start-color1:green;
}

现在,用@property定义背景渐变,背景有动画渐变效果

@property --start-color{
    syntax:'<color>';
    inherits:false;
    initial-value:orange;
}

@property --end-color{
    syntax:'<color>';
    inherits:false;
    initial-value:black;
}

.child{
  background-image:linear-gradient(
    to bottom,
    var(--start-color),
    var(--end-color)
 );
}

.child:hover{
    --start-color: blue;
}

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/11459

相关推荐

html中的marquee属性

该标签不是HTML3.2的一部分,并且只支持MSIE3以后内核,所以如果你使用非IE内核浏览器(如:Netscape)可能无法看到下面一些很有意思的效果,该标签是个容器标签

vue里的$refs属性

vuejs的极大程度的帮助减少了对dom的操作,他主要通过添加ref属性,但是当获取this.$refs属性时,稍有不注意就会输出undefined导致我们对dom节点的操作报错。this.$refs.xxx为undefined的几种情况记录:

css的overflow属性

事实上我挺长一段时间都没弄清楚overflow:scroll与overflow:auto的差别,今天测试了一下,总算是明白了。visible: 不剪切内容。hidden: 将超出对象尺寸的内容进行裁剪,将不出现滚动条。scroll: 将超出对象尺寸的内容进行裁剪,并以滚动条的方式显示超出的内容。

css使用到的border边框属性

border 在一个声明中设置所有的边框属性。 border-bottom在一个声明中设置所有的下边框属性。border-bottom-color设置下边框的颜色。border-bottom-style设置下边框的样式。

Cookie 的 SameSite 属性

Chrome 51 开始,浏览器的 Cookie 新增加了一个 SameSite 属性,用来防止 CSRF 攻击和用户追踪。Cookie 往往用来存储用户的身份信息,恶意网站可以设法伪造带有正确 Cookie 的 HTTP 请求,这就是 CSRF 攻击。

React 也能“用上” computed属性

初次见到计算属性一词,是在 Vue 官方文档 《计算属性和侦听器》 一节中,文章中是这样描述计算属性的:模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。

css常用属性

text-align 属性规定元素中的文本的水平对齐方式。属性值:none | center | left | right | justify;font-size表示设置字体大小,如果设置成inherit表示继承父元素的字体大小值。

JS、Jquery中判断checkbox是否选中

attr()与prop()如何选择:attr()方法返回被选元素的属性值。prop() 方法设置或返回被选元素的属性和值。当该方法用于返回属性值时,则返回第一个匹配元素的值。当该方法用于设置属性值时,则为匹配元素集合设置一个或多个属性/值对。

css z-index属性

z-index 仅适用于定位元素。即 postition 值为 relative, absolute 和 fixed 属性;堆叠顺序是当前元素位于 z 轴上的值。值越大表示元素越靠近屏幕,反之元素越远离屏幕在同一个堆叠上下文中, z-index 值越大,越靠近屏幕。

CSS中的cursor属性

css中的cursor这个属性是用来设置光标形状的。这个属性定义了鼠标指针放在一个元素边界范围内时所用的光标的形状。默认值:auto,继承性:yes,出现版本:css2

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!