孤陋寡闻了,才知道已经可以用 JS 来控制 CSS 动画了

简介: 最近翻 MDN 突然发现一套叫 Web Animations API 的东东,点进去看才知道,原来是一套控制 css animation 的 API,而且已经有段时间了 🤦‍♂️,而我居然一直不知道。

网络异常,图片无法展示
|

最近翻 MDN 突然发现一套叫 Web Animations API 的东东,点进去看才知道,原来是一套控制 css animationAPI,而且已经有段时间了 🤦‍♂️,而我居然一直不知道。

介绍

Web Animations API 主要包含两个 APIanimate 来执行动画,getAnimations 来获取当前元素的动画。

并且 getAnimations 不止可以获取到 animate 创建的动画,css 中的动画同样可以获取到。

getAnimations

先来个小 Demo

如上 Demo 所示,通过 getAnimations 我们可以获取到当前元素的正在运行的动画的 Animate 对象,如果传入参数 {subtree: true} 还能获取到包括其所有子元素、伪元素的动画。

通过拿到的 animate,我们可以直接对其进行各种操作,如:

  • pause - 暂停动画
  • play - 播放动画
  • cancel - 取消动画状态
  • reverse - 反向执行动画到开始状态
  • finish - 直接跳到动画结束阶段

此外还有一些其他比较少用的方法,如 commitStylespersist 等。

通过上述 API,我们可以轻易的通过 JS 来控制动画的执行,而不需要像以前一样通过改写 CSS 样式来控制。

除了上述的一些操作方法外,animate 中还有很多动画的属性,包括运行状态的 Promisetimelineeffect 等。

其中如 finishedPromise 在动画控制时也很好用,比如创建一个动画后需要在动画完成后做一些处理直接 await finished 即可,不需要像以前一样监听 dom 状态或是设定倒计时。

其它需要了解的可以点击这里查看

animate

animate 方法则可通过 JS 给元素添加动画:Element.animate(keyframes, options)

anim.animate(
    [{ transform: 'translateX(0)' }, { transform: 'translateX(100px)' }, { transform: 'translateX(0)' }],
    1000
);
复制代码

这里的 keyframes 是一个数组,不同于 css keyframes,这里不需要定义每一个关键帧的百分比,此处会默认按照等比拆分关键帧,如果需要定义百分比,可直接在关键帧中添加 offset 参数:

anim.animate(
    [{ transform: 'translateX(0)' }, { transform: 'translateX(100px)', offset: 0.3 }, { transform: 'translateX(0)' }],
    1000
);
复制代码

此处 keyframe 参数主要包含两种属性,第一种是对应的 css 属性的 js 表示,如 leftpaddingLefttransform 等(注意此处 css 中的 floatoffset 需要写成 cssFloatcssOffset),第二种是上面说到的 offset 一类的通用控制参数,除了 offset 外,还可设置 easing 为每个关键帧设定动画曲线:

anim.animate([{ opacity: 1, easing: 'ease-out' }, { opacity: 0.1, easing: 'ease-in' }, { opacity: 0 }], 1000);
复制代码

以及 composite 参数来控制动画合成方式。

此外,keyframes 还支持第二种格式:

anim.animate(
    {
        opacity: [0, 0.9, 1],
        offset: [0, 0.8], // Shorthand for [ 0, 0.8, 1 ]
        easing: ['ease-in', 'ease-out']
    },
    1000
);
复制代码

可直接传入一个对象,将对象中的属性通过数组表示来表示对应的关键帧。

options 则可以直接传入数字,代表动画事件或是传入动画参数:

anim.animate([{ transform: 'translateX(0)' }, { transform: 'translateX(100px)' }, { transform: 'translateX(0)' }], {
    duration: 1000
});
复制代码

参数和 CSS 中差不多,包括:

  • delay - 动画延迟
  • direction - 动画运行方向
  • duration - 动画运行时间
  • easing - 动画运行曲线
  • endDelay - 动画结束后的延迟
  • fill - 动画完成后的填充
  • iterations - 动画重复次数
  • composite - 动画合成

此外还有 iterationStartiterationComposite,需要了解可点击查看

兼容和 polyfill

当然,该系列 API 兼容并不佳,要能够完整体验需要至少 chrome 84 以上版本,IE 则完全没戏。

不过还好有 polyfill 的存在:web-animations-js

总结

通过 Web Animations 系列 API 可以方便的控制已有的 CSS 动画、添加动画等,而不需要像以前一样使用 JS 来模拟动画,在某些特定场景下可以提高动画性能、简化动画代码。

相关文章
|
29天前
|
JavaScript 前端开发
如何使用时间切片来优化JavaScript动画的性能?
如何使用时间切片来优化JavaScript动画的性能?
|
3天前
|
JavaScript 前端开发
页面滚动触发css3动画js插件
delighters.js是一款页面滚动触发css3动画js插件。该js插件可以在页面向下滚动时,为进入浏览器视口的元素制作各种炫酷的CSS3动画效果。
28 13
|
27天前
纯css3实现的百分比渐变进度条加载动画源码
纯css3实现的百分比渐变进度条加载动画特效源码
53 31
|
12天前
|
Web App开发 移动开发 JavaScript
纯CSS3+SVG实现的节日庆祝五彩纸屑动画效果源码
这是一款基于纯CSS3+SVG实现的节日庆祝五彩纸屑动画效果源码。画面中左下角是一个圆锥形礼炮卡通效果,呈现出节日庆祝时礼花爆破、五彩纸屑纷飞的动画特效。整体动画效果采用纯css3+svg实现,没有引入任何外部图形或js脚本元素。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
31 6
|
12天前
纸屑飘落生日蛋糕场景js+css3动画特效
纸屑飘落生日蛋糕CSS3动画特效是一款js+css3制作的全屏纸屑飘落,生日蛋糕点亮庆祝动画特效。
31 3
|
22天前
|
前端开发 JavaScript UED
CSS滚动效果和视差滚动的原理、应用及其对用户体验的影响。从平滑滚动到元素跟随,再到滚动触发动画
本文探讨了CSS滚动效果和视差滚动的原理、应用及其对用户体验的影响。从平滑滚动到元素跟随,再到滚动触发动画,这些效果增强了页面的吸引力和互动性。视差滚动通过不同层次元素的差异化移动,增加了页面的深度感和沉浸感。文章还讨论了实现方法、性能优化及案例分析,旨在为设计师和开发者提供实用指导。
50 7
|
27天前
CSS3制作的聚光灯下倒影文字选装动画特效源码
CSS3聚光灯下倒影文字特效是一段基于CSS3实现的聚光灯下带倒影的文字旋转动画效果代码,具有真实的视觉感,同时文字还会在旋转过程中显示出灯光的反射效果,很有意思,欢迎对此段代码感兴趣的朋友前来下载使用。
29 6
|
27天前
纯css3加载loading发光变色动画代码
纯css3加载loading发光变色动画特效代码是一款基于css3 keyframes属性实现的发光变色圆点串联旋转loading加载动画
22 2
|
29天前
|
JavaScript 前端开发
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
|
28天前
|
Web App开发 前端开发 iOS开发
CSS加载动画大全 126种
CSS加载动画大全是一个css Loaders加载动画特效汇总,一共包含126种加载动画效果,不同样式不同图案,简单实用,一览包含所有,会让你在等待的过程中,体验视觉盛宴,给用户不一般的加载体验,欢迎下载试试!代码适用浏览器:搜狗、360、FireFox(建议)、Chrome、Safari、Opera、傲游、世界之窗,是一款不错的的特效插件,希望大家喜欢!
26 2
下一篇
DataWorks