@property自定义CSS属性,实现不一样的动画效果

简介: @property是CSS的新特性,用于定义自定义CSS属性,并使这些属性可以在CSS中使用,当然也可以在JavaScript中使用。 @property 简介 @property允许开发者显示的定义

@property是CSS的新特性,用于定义自定义CSS属性,并使这些属性可以在CSS中使用,当然也可以在JavaScript中使用。

@property 简介

@property允许开发者显示的定义CSS属性,这些属性允许进行类型检查,以及设置默认值,定义之后的属性,可以直接在css中使用,也可以在JavaScript中使用。

@property 语法

@property --name {
    syntax: <type> | <type> [ <type> ]*;
    inherits: true | false;
    initial-value: <value>;
}

@property的语法如上所示,其中:

  • --name:自定义属性的名称,必须以--开头;
  • syntax:自定义属性的类型;
  • inherits:是否继承父元素的属性值;
  • initial-value:自定义属性的默认值;

需要注意的点有:

  1. @property定义的属性,必须以--开头;
  2. syntaxinherits是必须的;
  3. initial-value只有在syntax为通用类型时,才是可选的,否则必须指定默认值;
  4. syntax的类型有:
    • <length>:长度类型,如pxem等;
    • <number>:数字类型;
    • <percentage>:百分比类型;
    • <length-percentage>:长度或百分比类型;
    • <color>:颜色类型;
    • <image>:图片类型;
    • <url>:URL类型;
    • <integer>:整数类型;
    • <angle>:角度类型;
    • <time>:时间类型;
    • <resolution>:分辨率类型;
    • <transform-function>:变换函数类型;
    • <custom-ident>:自定义标识符类型;
    • <transform-list>:变换列表类型;
  5. syntax可以有多个类型,用|分隔,表示可以接受多种类型的值,如<length-percentage> | <color>表示可以接受长度或百分比类型,或者颜色类型的值;
  6. syntax可以接受自定义值,例如css有很多关键字,如autoinherit等,这些关键字可以作为<custom-ident>的值,如<custom-ident> | auto | inherit

如果上面的注意事项有一个没有满足,那么整条规则都会被忽略,但不会造成整条规则失效。

@property 示例

使用@property定义一个自定义属性:

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

不知道为什么都喜欢用颜色作为示例,我看到的大多数都是这样的,所以我也跟着用颜色作为示例。

这样定义之后,就可以在css中使用了:

div {
    color: var(--my-color);
}

看起来和使用css变量没什么区别,但是css变量如果想要修改,只有两种方式:

  1. 直接修改css变量的值;
  2. 使用js修改css变量的值;

对比 css 变量

现在使用两个案例来对比@propertycss变量:

1. 修改 css 变量

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        :root {
    
    
            --my-color: red;
        }

        html, body {
    
    
            margin: 0;
            padding: 0;
        }

        body {
    
    
            --my-color: blue;
            display: flex;
            justify-content: center;
            align-items: center;
            width: 100%;
            height: 100vh;
            color: var(--my-color);
        }
    </style>
</head>
<body>
    <div>CSS变量</div>
</body>
</html>

image.png

可以看到css变量在css中直接修改是采用的就近原则,所以body中的--my-color会覆盖html中的--my-color

如果使用JS修改css变量又是什么样子呢?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        :root {
    
    
            --my-color: red;
        }

        html, body {
    
    
            margin: 0;
            padding: 0;
        }

        body {
    
    
            display: flex;
            justify-content: center;
            align-items: center;
            width: 100%;
            height: 100vh;
            color: var(--my-color);
        }
    </style>
</head>
<body>
    <div>CSS变量</div>
</body>
<script>
    document.body.style.setProperty('--my-color', 'green');
</script>
</html>

image.png

可以看到使用JS修改css变量,也是采用就近原则,是直接在行内样式中添加--my-color,然后覆盖html中的--my-color

2. 修改 @property

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        @property --my-color {
    
    
            syntax: '<color>';
            inherits: false;
            initial-value: red;
        }

        html, body {
    
    
            margin: 0;
            padding: 0;
        }

        body {
    
    
            --my-color: blue;
            display: flex;
            justify-content: center;
            align-items: center;
            width: 100%;
            height: 100vh;
            color: var(--my-color);
        }
    </style>
</head>
<body>
    <div>@property</div>
</body>
</html>

image.png

可以看到@propertycss中修改是直接修改的,和css变量不一样,@property是直接修改的。

效果对比

上面的案例分析了css变量和@property的区别,那么我们知道区别了有什么用?他们都可以达到修改样式的目的,那么我们为什么要使用@property呢?

其实主要是它们的侧重点不一样,css变量的侧重点是样式的统一,而@property的侧重点是样式的可控。

现在css变量已经在大放异彩了,很多站点皮肤切换使用的就是css变量,所以css变量的案例就不用列举了。

现在我们直接看@property能做到的而css变量做不到的,就是动画:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        :root {
    
    
            --my-color: red;
        }

        html, body {
    
    
            margin: 0;
            padding: 0;
        }

        body {
    
    
            display: flex;
            justify-content: center;
            align-items: center;
            width: 100%;
            height: 100vh;
            color: var(--my-color);
            animation: changeColor 1s infinite;
        }

        @keyframes changeColor {
    
    
            from {
    
    
                --my-color: red;
            }
            to {
    
    
                --my-color: blue;
            }
        }
    </style>
</head>
<body>
    <div>@property</div>
</body>
</html>

QQ录屏20221207232552.gif

可以看到使用css变量是无法实现动画的过渡的,这个时候如果替换成@property就可以实现了:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        @property --my-color {
    
    
            syntax: '<color>';
            inherits: false;
            initial-value: red;
        }

        html, body {
    
    
            margin: 0;
            padding: 0;
        }

        body {
    
    
            display: flex;
            justify-content: center;
            align-items: center;
            width: 100%;
            height: 100vh;
            color: var(--my-color);
            animation: changeColor 1s infinite;
        }

        @keyframes changeColor {
    
    
            from {
    
    
                --my-color: red;
            }
            to {
    
    
                --my-color: blue;
            }
        }
    </style>
</head>
<body>
    <div>@property</div>
</body>
</html>

QQ录屏20221207232916 (1).gif

可以看到使用@property就可以实现动画的过渡了。

实践

通过上面的案例我们知道@property的修改可以实现动画的过渡,那么我们可以使用@property来实现一些动画效果;

我们常见的有一个问题就是定义的背景是不能旋转的,但是使用@property就可以实现了:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        @property --rotate {
    
    
            syntax: '<angle>';
            inherits: false;
            initial-value: 0deg;
        }

        html, body {
    
    
            margin: 0;
            padding: 0;
        }

        body {
    
    
            display: flex;
            justify-content: center;
            align-items: center;
            width: 100%;
            height: 100vh;
        }

        .card {
    
    
            width: 200px;
            height: 200px;
            background-image: linear-gradient(var(--rotate), #1abc9c, #3498db);
            background-size: cover;
            animation: rotate 5s infinite;
        }

        @keyframes rotate {
    
    
            from {
    
    
                --rotate: 0deg;
            }
            to {
    
    
                --rotate: 360deg;
            }
        }
    </style>
</head>
<body>
    <div class="card"></div>
</body>
</html>

这里通过使用线性渐变可以修改背景的旋转角度,从而实现背景的旋转。

感兴趣的可以直接将rotate动画里面的修改--rotate的值改为直接修改background-image的值,它是无法实现动画的过渡的。

案例

都掌握了一个这么有趣的新特性,那么不是实现点有趣的东西都有点对不起观众了,下面我们就来实现一个有趣的东西。

直接上代码,个人感兴趣自己可以去看看具体实现,这次就不讲解代码实现了:

代码片段

总结

@property是一个非常有趣的新特性,它可以实现以前无法实现的动画过渡效果,它的使用也非常简单,只需要定义一个@property,然后在需要使用的地方使用var(--my-color)就可以了。

当然还有JS操控@property的方法,咱们先将这篇消化完成,后面再来看看JS操控@property的方法。

目录
相关文章
|
2月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
transition过渡属性 早期在Web中要实现动画效果,都是依赖于JavaScript或Flash来完成。 但在CSS3中新增加了一个新的模块transition,它可以通过一些简单的CSS事件来触发元素的外观变化, 让效果显得更加细腻。简单点说,就是通过鼠标经过、获得焦点,被点击或对元素任何改变中触发, 并平滑地以动画效果改变CSS的属性值。 在CSS中创建简单的过渡效果可以从以下几个步骤来实现: 在默认样式中声明元素的初始状态样式; 声明过渡元素最终状态样式,比如悬浮状态; 在默认样式中通过添加
211 1
|
2月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
transform变形 css3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的 功能。 CSS3的变形功能可以对HTML组件执行位移、旋转、缩放、倾斜4种几何变换,这样的变换可以控制HTML组件 呈现出丰富的外观。 借助于位移、旋转、缩放、倾斜这4种几何变换,CSS3提供了transition动画。 transition动画比较简单,只要指定HTML组件的哪些CSS属性需要使用动画效果来执行变化,并指定动画时间,就可保证动画播放。 比transitio
153 1
|
2月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
126 1
|
5月前
|
自然语言处理 前端开发 JavaScript
用 通义灵码 一键生成“水波纹按钮”,连 CSS 动画都不用自己写了!
通义灵码是一款智能编程辅助工具,它可以根据自然语言指令自动生成高质量的代码。例如,只需输入“生成一个按钮,点击时带水波纹动画,模拟 Material Ripple 效果”,它就能生成具备完整交互逻辑、CSS 动画和良好性能的按钮组件。不仅如此,它还支持拓展功能,如长按触发提示、添加图标等,并能自动优化样式适配不同场景。通过通义灵码,开发者可以大幅提升效率,专注于创意实现,而不必纠结于繁琐的代码细节。
|
10月前
|
前端开发 JavaScript
CSS 过渡和动画
CSS过渡和动画是用于为网页元素添加动态效果的两种重要技术
506 143
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
Animation属性 css3为Animation动画提供的几个属性如下: 属性名 属性值 animation-name 指定动画名称,该属性指定一个已有的关键帧定义。 animation-duration 指定动画持续时间。 animation-timing-funtion 指定动画变化速度。 animation-delay 指定动画延迟多长时间才开始执行。 animation-iteration-count 指定动画的循环执行次数。 animation:这是一个复合属性。
212 1
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
position定位(核心) 我们讲盒模型的时候,提到了3个属性可以用来控制页面排版。 三大属性:position属性,display属性,float属性。 position 属性控制页面上元素间的位置关系。 display 属性控制页面元素是否显示或者是堆叠还是并排显示。 float 属性提供控制方法。 通过float这种控制方法,可以实现多栏布局,导航菜单等等。 position属性是干嘛用的?怎么用?有哪些属性值? position属性控制页面上元素间的位置关系,也就是排版。 怎么用?要知道怎么用
385 1
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
继承 我们的CSS中很多的属性也是可以继承的,其中相当一部分是跟文字的相关的,比如说颜色、字体、字号。 当然还有一部分是不能继承的。 例如边框、内外边距。 层叠 层叠是CSS的核心机制。 层叠的工作机制: 当元素的同一个样式属性有多种样式值的时候,CSS就是靠层叠机制来决定最终应用哪种样式。 层叠规则: 层叠规则一:找到应用给每个元素和属性的声明。 说明:浏览器在加载每个页面时,都会据此查找到每条CSS规则, 并标识出所有受到影响的HTML元素。
107 1
|
11月前
css3 svg制作404页面动画效果HTML源码
css3 svg制作404页面动画效果HTML源码
226 34
|
11月前
jQuery+CSS3实现404背景游戏动画源码
jQuery+CSS3实现404背景游戏动画源码
176 22