只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)

目录

前言

介绍

基本使用

关键帧

KeyframeEffect的三种类的声明

keyframes

options

动画对象

全局Animation类

标签中的animate函数

总结

相关代码:


前言

接着上文往下介绍,上篇文章我们对JS原生动画和贝塞尔曲线有了一个详细的认识,基于定时器或动画帧,我们可以实现元素的动画缓动,本文将分享浏览器中功能强大的Animations API,有兴趣的朋友请接着往下看吧

介绍

Web Animations API(简称WAAPI)于2016年成为Web标准的一部分,它的功能比之前提到的动画要丰富的多,它的核心理念是时间轴和动画效果。它提供了一组功能强大的方法和属性,用于定义、操作和管理动画效果。

时间轴(Timeline)是WAAPI中的核心概念之一。它类似于一个全局时钟,用于管理和协调所有正在运行的动画。通过时间轴,开发者可以控制动画的播放、暂停、重置等操作。

动画效果(Animation Effect)指的是要应用到动画目标上的转换或变化。WAAPI提供了多种类型的动画效果,如位移(translate)、缩放(scale)、旋转(rotate)等。开发者可以使用这些效果来创建各种动画效果。

基本使用

关键帧

还记得之前的CSS关键帧吗?使用from to或者百分比来定义动画阶段的效果,在JS中使用KeyframeEffect类可以创建关键帧动画

const box = document.querySelector(".box")
const keyframes = [{ left: 0 },{ left: '100px' }
];
const keyframe = new KeyframeEffect(box, keyframes, 1000);

上述代码中,KeyframeEffect类接收三个参数:第一个是目标标签,第二个是关键帧,第三个是动画时间

KeyframeEffect的三种类的声明

  1. KeyframeEffect(keyframeEffect):复制关键帧配置
  2. KeyframeEffect(element, keyframes, duration):在标签element上生成新的动画,关键帧为keyframes,持续duration毫秒
  3. KeyframeEffect(element, keyframes, options):在标签element上生成新的动画,关键帧为keyframes,动画配置options

keyframes

关键帧的写法有两种,分别是数组的方式和样式对象的写法

  • 数组
const keyframes = [{ left: 0, top: "50px" },{ left: '100px', top: "100px" },{ top: "150px" }
];
  • 对象
const keyframes = {left: [0, '100px', '100px'], top: ["50px", "100px", "150px"]
}

options

KeyframeEffect的第三个参数类型是数字或options配置项,数字代表动画时长,options则有以下属性:

  1. delay:动画开始之前的延迟时间,以毫秒为单位,默认值为0。对应css的animation-delay
  2. direction:动画的播放方向,可以是 "normal"(正常播放)、"reverse"(反向播放)、"alternate"(交替播放)或 "alternate-reverse"(交替反向播放)。默认值为 "normal"。对应css的animation-direction
  3. duration:动画的持续时间,以毫秒为单位,默认值为0。对应css的animation-duration
  4. easing:动画的缓动函数,可以使用 CSS 缓动函数,如 "linear"、"ease"、"ease-in" 等,或者自定义的缓动函数。默认值为 "linear"。对应css的animation-timing-function
  5. endDelay:动画结束后的延迟时间,以毫秒为单位,默认值为0。
  6. fill:动画在非活动时间段的行为,可以是none(默认,动画结束后不会保留任何效果)、forwards(动画结束后保持最后一帧的效果)或backwards(动画开始前应用第一帧的效果)。也可以是both,表示同时应用forwards和backwards的效果。对应css的animation-fill-mode
  7. iterationStart:动画的迭代开始位置,以小数表示(例如,0.5表示从动画的中间位置开始迭代),默认值为0。
  8. iterations:动画的迭代次数,可以是一个正整数或Infinity(无限循环),默认值为1。对应css的animation-iteration-count
  9. keyframes:动画的关键帧,可以是一个关键帧规则对象或关键帧数组。
  10. playbackRate:用于控制动画播放速率的属性。它可以用于加速或减慢动画的播放速度。
  11. composite(CompositeOperation):动画的合成行为。可以是replace或add。默认值为replace。replace表示动画将覆盖目标属性的当前值,而add表示动画将与目标属性的当前值叠加。
  12. iterationComposite(IterationCompositeOperation):动画迭代之间的值合成行为。可以是replace或accumulate。默认值为replace。replace表示每次迭代时动画的值将替换目标属性的当前值,而accumulate表示每次迭代时动画的值将累积到目标属性的当前值上。
  13. pseudoElement:应用动画的伪元素。可以是一个字符串,表示伪元素的名称,例如before或after,或者可以是null,表示应用于主元素而非伪元素。

示例

<!DOCTYPE html>
<html lang="CH"><head><meta charset="UTF-8" /><title>webAnimationsAPI</title><style>html,body {width: 100%;height: 100%;position: relative;}.box {width: 200px;height: 200px;top: 50px;position: absolute;background: lightblue;}.box::after {width: 100px;height: 100px;content: "";left: 50px;position: absolute;background: lightcoral;}</style>
</head><body><div class="box"></div><button onclick="playHandler()">开始</button><script>const box = document.querySelector(".box")const keyframes = [{ transform: "rotate(0)" },{ transform: "rotate(180deg)" },{ transform: "rotate(360deg)" },];const options = {delay: 500,// 延迟500毫秒开始动画duration: 1000,// 持续时间为1000毫秒easing: 'ease-in-out',// 缓动函数为ease-in-outiterations: Infinity,// 迭代3次direction: 'alternate',// 交替播放endDelay: 1000,// 延迟1000毫秒开始动画fill: "forwards",// 结束后保持最后一帧的效果iterationStart: .2,// 从动画的20%位置开始迭代composite: 'add',//使用add合成行为keyframes: keyframes,//指定关键帧playbackRate: 2.0,//播放速率为2倍iterationComposite: 'accumulate',//使用accumulate合成行为pseudoElement: '::after'//应用于after伪元素}const keyframe = new KeyframeEffect(box, keyframes, options);function playHandler() {const animation = new Animation(keyframe, document.timeline);animation.play();}</script>
</body></html>

效果

动画对象

全局Animation类

创建完成动画的关键帧后,我们可以使用全局的Animation类创建动画,动画的形式就是上面的关键帧

const box = document.querySelector(".box")
const keyframes = [{ left: 0, top: "50px" },{ left: '100px', top: "100px" },{ top: "150px" }
];
const keyframe = new KeyframeEffect(box, keyframes, 1000);
function playPauseHandler() {const animation = new Animation(keyframe);animation.play();
}

使用new Animation(keyframe)创建新的动画,然后使用play函数对动画进行激活

效果如下

Animation构造函数的参数有两个:关键帧对象AnimationEffect和时间线AnimationTimeline,前者就是上面说到的KeyframeEffect,AnimationTimeline一般可以使用document.timeline来描述

const animation = new Animation(keyframe, document.timeline);

animation对象中有许多属性和方法

属性

  • id:返回动画的唯一标识符。
  • startTime:动画开始的时间戳。
  • currentTime:当前动画的时间,以毫秒为单位。
  • playbackRate:动画的播放速率,默认值为1。
  • effect:动画的效果,KeyframeEffect对象。
  • timeline:动画所使用的时间轴,AnimationTimeline对象。
  • playState:动画的当前播放状态,可能的值为 "idle"、"pending"、"running"、"paused"、"finished"。
  • pending:动画的等待状态,即动画是否处于 pending 状态。

方法

  • play(): 播放动画。
  • pause(): 暂停动画。
  • cancel(): 取消动画。
  • finish(): 完成动画。
  • reverse(): 反转动画的播放方向。
  • updatePlaybackRate(playbackRate): 更新动画的播放速率。
  • addEventListener(type, listener): 在动画上添加事件监听器。如:finish(完成)、cancel(取消)和pause(暂停)等
  • removeEventListener(type, listener): 从动画上移除事件监听器。
  • oncancel: 一个事件处理程序,当动画被取消时执行。
  • onfinish: 一个事件处理程序,当动画完成时执行。

使用示例

<!DOCTYPE html>
<html lang="CH"><head><meta charset="UTF-8" /><title>webAnimationsAPI</title><style>html,body {width: 100%;height: 100%;position: relative;}.box {width: 200px;height: 200px;top: 50px;position: absolute;background: lightblue;}</style>
</head><body><div class="box"></div><button onclick="playHandler()">开始</button><button onclick="pauseHandler()">暂停</button><button onclick="cancelHandler()">取消、重置</button><button onclick="reverseHandler()">反向运行</button><button onclick="finishHandler()">完成动画</button><button onclick="playbackRateHandler()">更新动画速率</button><button onclick="playStateHandler()">获取状态</button><button onclick="currentTimeHandler()">获取时间轴位置</button><script>const box = document.querySelector(".box")const keyframes = [{ left: 0 },{ left: '300px' },];const keyframe = new KeyframeEffect(box, keyframes, {duration: 1000,iterations: Infinity,direction: 'alternate',fill: "forwards",});const animation = new Animation(keyframe, document.timeline);animation.addEventListener("finish", console.info)animation.addEventListener("cancel", console.info)animation.addEventListener("remove", console.info)function playHandler() {animation.play();}function pauseHandler() {animation.pause();}function cancelHandler() {animation.cancel();}function reverseHandler() {animation.reverse();}function finishHandler() {animation.finish();// 当iterations等于infinity时无法触发完成}function playStateHandler() {console.log(animation.playState);}function playbackRateHandler() {animation.updatePlaybackRate(2)}function currentTimeHandler() {console.log(animation.currentTime);}</script>
</body></html>

效果如下

标签中的animate函数

全局的Element标签对象继承于Animatable接口

该接口描述了两个方法:animate为当标签增加动画与getAnimations获取当前标签全部动画

interface Animatable {animate(keyframes: Keyframe[] | PropertyIndexedKeyframes | null, options?: number | KeyframeAnimationOptions): Animation;getAnimations(options?: GetAnimationsOptions): Animation[];
}

用法和KeyframeEffect+Animation类似

<!DOCTYPE html>
<html lang="CH"><head><meta charset="UTF-8" /><title>webAnimationsAPI</title><style>html,body {width: 100%;height: 100%;position: relative;}.box {width: 200px;height: 200px;top: 50px;position: absolute;background: lightblue;}</style>
</head><body><div class="box"></div><button onclick="playHandler()">开始</button><button onclick="pauseHandler()">暂停</button><script>const box = document.querySelector(".box")const keyframes = [{ left: 0 },{ left: '300px' },];const opts = {duration: 1000,iterations: Infinity,direction: 'alternate',fill: "forwards",}const animation = box.animate(keyframes, opts)function playHandler() {animation.play();}function pauseHandler() {animation.pause();}</script>
</body></html>

总结

本文与大家分享了16年新推出的JS原生动画WAAPI,使用这种方式创建的动画对象功能十分强大,其中我们可以使用KeyframeEffect设置标签关键帧的样式,通过Animation对象运行标签的动画。与前面的两篇关于动画的文章相比,WAAPI虽然强大,但是使用时还需要考虑兼容性问题。

好了,以上就是文章的全部内容了,希望文章内容对你有帮助,如果觉得文章不错的话,还望三连支持一下博主,谢谢~

相关代码:

myCode: 基于js的一些小案例或者项目 - Gitee.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/79544.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网潜在的巨大价值在于大数据分析

物联网潜在的巨大价值在于大数据分析 从数据里去挖掘市场或者用户的精准需求。 往小的说&#xff0c;后台可以统计用户家里各各插座一年甚至更久的用电情况&#xff0c;这些数据也可以通过app或者小程序展现给用户。 用户可以很直观看到自己一年的用电情况&#xff0c;哪个家…

23年电赛D题-信号调制方式识别与参数估计装置

红叶何时落水 题目 题目分析 该题目的是制作一个信号检测以及解调装置 主要的任务有三个 1.六种信号的识别 2.信号相关参数的测量 3.信号解调 任务一 识别信号有很多思路&#xff0c;最简单的方式便是通过对信号进行FFT分析&#xff0c;分析其中的各个谐波的特征值。 …

全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级

8月4日新闻&#xff0c;今天下午&#xff0c;华为正式发布了最新版本的鸿蒙操作系统——HarmonyOS 4&#xff01; 在华为发布会上&#xff0c;鸿蒙HarmonyOS迎来了一系列令人激动的功能升级。其中包括个性化空间、多种生产力工具以及增强的手机AI助手"小艺"。这次更…

【探索Linux】—— 强大的命令行工具 P.2(Linux下基本指令)

前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0c;并且讲了有关C的一些知识&#xff0c;也相信大家都掌握的不错&#xff0c;今天博主将会新开一个Linux专题&#xff0c;带领大家继续学习有关Linux的内容。今天第一篇文章博主首先带领大家了解一下…

【产品经理】高阶产品如何看待问题?(方法论+案例+实操清单)

在职场中&#xff0c;我们常常被教导要多角度、从不同的视角看待问题。作为一名高阶产品&#xff0c;到底会用什么视角看待问题呢&#xff1f; 如果你仅仅凭借一个标题&#xff0c;选择阅读这篇文章&#xff0c;大概率你对俞军老师的12条方法论&#xff08;包括用户价值公式&am…

rabbitmq

一&#xff0c;什么是消息中间件 MQ全称为Message Queue&#xff0c;本质上是个队列&#xff0c;FIFO先入先出。是在消息的传输过程中保存消息的容器。可以用于应用程序和应用程序之间的通信方法。多用于分布式系统之间进行通信&#xff0c;在项目中&#xff0c;可将一些无需即…

Excel下拉框样式

1.打开要修改的Excel&#xff0c;选中要修改样式的单元格 2.在上边导航栏中选择 Data&#xff0c;找到 Data Validation&#xff0c;点击下面的 Data Validation… 3.在设置中找到 Allow 项&#xff0c;选择 List。Source中填写可供选择的值&#xff0c;以逗号&#xff08;…

Tcp是怎样进行可靠准确的传输数据包的?

概述 很多时候&#xff0c;我们都在说Tcp协议&#xff0c;Tcp协议解决了什么问题&#xff0c;在实际工作中有什么具体的意义&#xff0c;想到了这些我想你的技术会更有所提升&#xff0c;Tcp协议是程序员编程中的最重要的一块基石&#xff0c;Tcp是怎样进行可靠准确的传输数据…

【Linux】【docker】安装sonarQube免费社区版9.9

文章目录 ⛺sonarQube 镜像容器⛺Linux 安装镜像&#x1f341;出现 Permission denied的异常&#x1f341;安装sonarQube 中文包&#x1f341;重启服务 ⛺代码上传到sonarQube扫描&#x1f341;java语言配置&#x1f341;配置 JS TS Php Go Python⛏️出现异常sonar-scanner.ba…

vue2.29-Vue3跟vue2的区别

1、vue3介绍 更新&#xff08;和重写&#xff09;Vue的主要版本时&#xff0c;主要考虑两点因素&#xff1a;首先是新的JavaScript语言特性在主流浏览器中的受支持水平&#xff1b;其次是当前代码库中随时间推移而逐渐暴露出来的一些设计和架构问题。 相较于vue2&#xff0c;vu…

带你了解—使用Ubuntu系统,公网环境下SSH远程树莓派

公网环境下Ubuntu系统SSH远程树莓派 文章目录 公网环境下Ubuntu系统SSH远程树莓派前言 1. 安装cpolar客户端2. 安装完成后输入指令3. ubuntu系统输入命令 前言 树莓派作为低功耗、小型化的硬件设备&#xff0c;其功能和运算能力并未过度缩水&#xff0c;在不少场景中&#xff…

vue2 todoapp案例(静态)

1.创建三个子组件(TodoHeader、TodoMain、TodoFooter)和两个(index.css、base.css)样式&#xff1b; TodoHeader页面 <template><header class"header"><h1>todos</h1><input id"toggle-all" class"toggle-all" typ…

Java中运算符要注意的一些点

目录 1. 算术运算符 1. 1 基本四则运算符&#xff1a;加减乘除模( - * / %) 1.2. 增量运算符 - * % 2. 关系运算符 3. 逻辑运算符 3.1. 逻辑与 && 3.2. 逻辑 || 3.3. 逻辑非 ! 3.4. 短路求值 4. 位运算符 4.1. 按位与 &: 如果两个二进制位都是 …

【MySQL】下载安装以及SQL介绍

1&#xff0c;数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果&#xff0c;当然文件存储也有它的弊端。 假设在文件中存储以下的数据&#xff1a; 姓名 年龄 性别 住址 张三 23 男 北京…

阿里云“通义千问”开源,可免费商用

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 阿里云成为国内首个加入大模型开源行列的大型科技企业。就在昨天&#xff0c;阿里云公开表态&#xff0c;把自家的通义千问大模型开源。 阿里云把通用70亿参数模型&#xff0c;包括Qwen-7B和对话模…

Java实现Google cloud storage 文件上传,Google oss

storage 控制台位置 创建一个bucket 点进bucket里面&#xff0c;权限配置里&#xff0c;公开访问&#xff0c;在互联网上公开&#xff0c;需要配置角色权限 新增一个访问权限 &#xff0c;账号这里可以模糊搜索&#xff0c; 角色配置 给allUser配置俩角色就可以出现 在互联…

雪花ID的简介讲解和应用

雪花ID 一、UUID UUID&#xff08;Universally Unique Identifier&#xff0c;通用唯一识别码&#xff09;是按照开放软件基金会&#xff08;OSF&#xff09;制定的标准计算&#xff0c;用到了以太网卡地址、纳秒级时间、芯片 ID 码和许多可能的数字。 UUID 是由一组 32 位数…

【状态估计】基于UKF法、AUKF法的电力系统三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Pycharm连接服务器

前提&#xff1a;必须为pycharm专业版才能连接到服务器 以下为pycharm2023专业版 一、连接 系统环境 虚拟环境&#xff08;前提&#xff1a;已安装anaconda&#xff09; (1) anaconda环境 (2) 自己创建的虚拟环境 这里为envs下的spotr 二、查看连接情况 选择自动上传

多语言一键铺货跨境电商平台快速开发(java开源)

要搭建一个多语言一键铺货跨境电商平台&#xff0c;可以参考以下步骤&#xff1a; 1. 确定需求&#xff1a;首先&#xff0c;明确平台的功能需求&#xff0c;包括多语言支持、一键铺货功能、跨境支付等。 2. 选择适合的开源项目&#xff1a;选择一个适合的Java开源电商平台项…