利用 CSS @property 探寻渐变的极限状态

开发 前端
本文利用 CSS @property 来实现一些有意思的事情。我们都知道,在之前,我们想实现渐变的动画,其实是非常复杂甚至是做不到的。

[[420813]]

本文利用 CSS @property 来实现一些有意思的(但可能没什么用的)事情。

渐变动画的历史

我们都知道,在之前,我们想实现渐变的动画,其实是非常复杂甚至是做不到的。

例如,从下图 A 状态,到 B 状态:

  1. <div></div> 
  1. div { 
  2.     width: 300px; 
  3.     height: 150px; 
  4.     animation: gradientChange 5s infinite linear; 
  5. @keyframes gradientChange { 
  6.     from { 
  7.         background: linear-gradient(black, deeppink); 
  8.     } 
  9.     to { 
  10.         background: linear-gradient(green, blue); 
  11.     } 

我们无法得到补间动画,只能得到两帧动画的切换:

图片

而有了 CSS @property 之后,我们可以非常轻松的实现渐变直接的动画效果,只需要这样改造一下代码:

  1. @property --colorA { 
  2.     syntax: "<color>"
  3.     inherits: false
  4.     initial-value: black; 
  5. @property --colorB { 
  6.     syntax: "<color>"
  7.     inherits: false
  8.     initial-value: deeppink; 
  9. div { 
  10.     width: 300px; 
  11.     height: 150px; 
  12.     background: linear-gradient(var(--colorA), var(--colorB)); 
  13.     animation: propertyChange 4s infinite linear; 
  14. @keyframes propertyChange { 
  15.     from { 
  16.         --colorA: black; 
  17.         --colorB: deeppink; 
  18.     } 
  19.     to { 
  20.         --colorA: green; 
  21.         --colorB: blue; 
  22.     } 

可以非常轻松的得到渐变的变化动画效果:

图片

对于 CSS @Property 还不算太了解的,可以猛击这篇文章:CSS @property,让不可能变可能[1]

利用 CSS @property 探寻渐变的极限状态

基于此,我们就可以利用 CSS @property 来搞事了。

我们可以利用它,观察渐变的一些极限状态。看看到渐变粒度非常小的时候,会发生什么,它的变化状态又是如何的。

主要是利用多重线性渐变、多重径向渐变、多重角向渐变。

多重线性渐变

它们的代码其实都大同小异:

  1. @property --per { 
  2.   syntax: '<percentage>'
  3.   inherits: false
  4.   initial-value: 100%; 
  5.  
  6. body { 
  7.     background: repeating-linear-gradient(45deg, deeppink, #fc0, #000, red, green, gray var(--per)); 
  8.     animation: perChange 60s infinite linear; 
  9.     cursor: pointer; 
  10.  
  11.     &:hover { 
  12.         animation-play-state: paused; 
  13.     } 
  14.  
  15. @keyframes perChange { 
  16.     5% { 
  17.         --per: 1%; 
  18.     } 
  19.     10% { 
  20.         --per: .1%; 
  21.     } 
  22.     30% { 
  23.         --per: .01%; 
  24.     } 
  25.     50% { 
  26.         --per: .001%; 
  27.     } 
  28.     70% { 
  29.         --per: .0001%; 
  30.     } 
  31.     78% { 
  32.         --per: .00001%; 
  33.     } 
  34.     90% { 
  35.         --per: .000001%; 
  36.     } 
  37.     95%, 
  38.     100% { 
  39.         --per: .0000001%; 
  40.     } 

通过控制多重线性渐变的没份的百分比 --per,观察动画的变化:

我们还可以通过 hover 伪类,在 hover 元素的时候添加 animation-play-state: paused 以暂停动画。

多重径向渐变

和上述代码一样,只需要把 repeating-linear-gradient() 改为 repeating-radial-gradient() 即可。

最终的动画效果:

这里还有两张演示图:

多重角向渐变

和上述代码一样,只需要把 repeating-linear-gradient() 改为 repeating-conic-gradient() 即可。

最终的动画效果:

由于完整的变化图片超出了限制,我只能每秒截取了 3 帧,所以看起来非常卡顿,实际是非常流畅的,补充一个完整的 5 秒的变化:

可以看到,在 --per 逐渐变小的过程中,整个渐变图形呈现出了非常有意思的效果,在小于 0.1% 基本已经处于一种非常抽象看不懂的状态,在小于 0.00001% 后,图形已经无法被渲染出来了。

上述完整的代码,你可以戳这里:CSS 灵感 -- 利用 CSS @property 探寻渐变的极限效果[2]

基于此,其实还可以做很多有意思的事情,譬如实现一个电视的雪花效果:

CSS 灵感 -- 利用渐变及 CSS Property 实现 TV 噪音动画[3]

CSS @property 其实非常强大,本文只是介绍它的冰山一角,旨在让大家浅显的了解有这么个东西,在 CSS 动画的过程中如果发现有一些本身不支持的动画的属性,可以考虑利用 CSS @proerpty,巧妙的实现它~

最后

好了,本文到此结束,希望对你有帮助 :)

参考资料

[1]CSS @property,让不可能变可能:

https://github.com/chokcoco/iCSS/issues/109

[2]CSS 灵感 -- 利用 CSS @property 探寻渐变的极限效果:

https://csscoco.com/inspiration/#/./background/css-property-variable-bg-change-animation.md

[3]CSS 灵感 -- 利用渐变及 CSS Property 实现 TV 噪音动画:

https://csscoco.com/inspiration/#/./background/background-css-property-tv-noise

[4]CSS 灵感:

https://csscoco.com/inspiration/#/

[5]Github -- iCSS:

https://github.com/chokcoco/iCSS

 

责任编辑:姜华 来源: iCSS前端趣闻
相关推荐

2023-05-08 09:08:33

CSS前端

2023-02-24 08:32:50

CSS渐变属性

2023-06-05 09:28:32

CSS渐变

2023-08-07 15:49:59

CSS颜色插值算法

2021-04-20 08:11:33

Css前端@property

2022-10-27 09:13:58

CSSGradient

2023-06-30 13:27:54

CSS径向渐变

2022-04-16 12:38:39

CSS前端

2009-09-14 18:41:59

LINQ查询

2022-07-04 21:50:43

NoiseCSS

2023-07-17 09:19:20

CSSCSS 渐变

2022-02-28 07:02:51

CSS二维码前端

2009-09-15 15:07:25

2022-09-26 20:19:05

CSS​技巧JS​

2023-06-07 10:41:43

2009-10-22 09:25:28

linux磁盘配额

2011-05-20 11:12:46

惠普绿色商用台式

2022-01-07 07:35:28

CSS 技巧磨砂玻璃

2021-10-14 06:01:27

CSS 技巧Overview

2018-08-01 10:40:04

Redis内存增长
点赞
收藏

51CTO技术栈公众号