Web API ------- requestAnimationFrame

news2024/12/23 16:50:20

官方文档

requestAnimationFrame 是什么

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行 顾名思义,请求动画帧,也称 帧循环。 其实就是该API能以浏览器的显示频率来作为其动画动作的频率,比如浏览器每16.7ms刷新一次,动画回调也每16.7ms调用一次,这样就不会存在过度绘制的问题,动画不会掉帧,自然流畅。

requestAnimationFrame我们可以理解为是一个请求动画帧的接口,它是浏览器用于定时循环操作的一个接口,类似于定时器,主要用途是按帧对网页进行重绘。

设置这个API的目的是为了让各种网页动画效果(DOM动画、Canvas动画、SVG动画、WebGL动画)能够有一个统一的刷新机制,从而节省系统资源,提高系统性能,改善视觉效果。代码中使用这个API,就是告诉浏览器希望执行一个动画,让浏览器在下一个动画帧安排一次网页重绘。

requestAnimationFrame的优势,在于充分利用显示器的刷新机制,比较节省系统资源。显示器有固定的刷新频率(60Hz或75Hz),也就是说,每秒最多只能重绘60次或75次,requestAnimationFrame的基本思想就是与这个刷新频率保持同步,利用这个刷新频率进行页面重绘。此外,使用这个API,一旦页面不处于浏览器的当前标签,就会自动停止刷新。这就节省了CPU、GPU和电力。

该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行

若你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用window.requestAnimationFrame()

注意:

  • 若你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用window.requestAnimationFrame()
  • 有一点也需要注意,requestAnimationFrame是在主线程上完成。这意味着,如果主线程非常繁忙,requestAnimationFrame的动画效果会大打折扣。
  • 当你准备更新动画时你应该调用此方法。这将使浏览器在下一次重绘之前调用你传入给该方法的动画函数 (即你的回调函数)。回调函数执行次数通常是每秒 60 次,但在大多数遵循 W3C 建议的浏览器中,回调函数执行次数通常与浏览器屏幕刷新次数相匹配。为了提高性能和电池寿命,因此在大多数浏览器里,当 运行在后台标签页或者隐藏的<iframe> 里时, 会被暂停调用以提升性能和电池寿命。
  • 回调函数会被传入DOMHighResTimeStamp参数,DOMHighResTimeStamp指示当前被requestAnimationFrame()排序的回调函数被触发的时间。在同一个帧中的多个回调函数,它们每一个都会接受到一个相同的时间戳,即使在计算上一个回调函数的工作负载期间已经消耗了一些时间。该时间戳是一个十进制数,单位毫秒,最小精度为 1ms(1000μs)。
  • 有开启就记得关闭

  • requestAnimationFrame(loop)该回调函数loop()会被传入DOMHighResTimeStamp参数,该参数与performance.now()的返回值相同,它表示requestAnimationFrame() 开始去执行回调函数的时刻。

一般常见用的封装方式:

function raf(callback){
requestAnimationFrame(()=>{
  requestAnimationFrame(callback)
})

}

执行频率

回调函数执行次数通常是每秒 60 次,但在大多数遵循 W3C 建议的浏览器中,回调函数执行次数通常与 浏览器屏幕刷新次数 相匹配。 屏幕刷新频率(次数): 屏幕每秒出现图像的次数。普通笔记本为60Hz。 

回调参数

下一次重绘之前更新动画帧所调用的函数 (即上面所说的回调函数)。该回调函数会被传入DOMHighResTimeStamp参数,该参数与performance.now()的返回值相同,它表示requestAnimationFrame() 开始去执行回调函数的时刻。

 返回值

一个 long 整数,请求 ID ,是回调列表中唯一的标识。是个非零值,没别的意义。你可以传这个值给 window.cancelAnimationFrame() 以取消回调函数。

参考JavaScript 标准参考教程(alpha)》出自阮一峰

关于 requestAnimationFrame 使用例子

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
 
<body>
 
    <div id="box" style="width:100px;height: 100px;border:1px solid"></div>
    <script>
        const box = document.getElementById('box');
        let start, previousTimeStamp;
        let done = false
 
        function step(timestamp) {
            if (start === undefined) {
                start = timestamp;
            }
            const elapsed = timestamp - start;
 
            if (previousTimeStamp !== timestamp) {
                // 这里使用 `Math.min()` 确保元素刚好停在 200px 的位置。
                const count = Math.min(0.1 * elapsed, 200);
                box.style.transform = 'translateX(' + count + 'px)';
                if (count === 200) done = true;
            }
 
            if (elapsed < 2000) { // 在两秒后停止动画
                previousTimeStamp = timestamp;
                if (!done) {
                    window.requestAnimationFrame(step);
                }
            }
        }
 
        window.requestAnimationFrame(step);
    </script>
 
</body>
 
<script>
 
</script>
 
</html>

cancelAnimationFrame

window.cancelAnimationFrame()方法取消以前通过调用window.requestAnimationFrame()来计划的动画帧请求。

window.cancelAnimationFrame(requestID)

参数(requestID):由对请求回调的 window.requestAnimationFrame()的调用返回的 ID 值。

关于 requestAnimationFrame和cancelAnimationFrame 使用例子

 

<!DOCTYPE html>
<html lang="en">
 
<head>
	<title>Document</title>
	<style>
		#box {
			width: 100px;
			height: 100px;
			border: 1px solid;
			position: absolute;
			left: 0;
			top: 0;
			zoom: 1;
		}
 
		#line {
			position: absolute;
			width: 200px;
			left: 0;
			top: 110px;
			zoom: 1;
			border-top: 1px solid;
			text-align: center;
		}
 
		#start {
			position: absolute;
			width: 50px;
			height: 40px;
			top: 150px;
			left: 40px;
		}
 
		#stop {
			position: absolute;
			width: 50px;
			height: 40px;
			top: 150px;
			left: 100px;
		}
	</style>
</head>
 
<body>
	<div id="box"></div>
	<div id="line">⬅参考线➡</div>
	<button id="start">start</button>
	<button id="stop">stop</button>
	<script>
		var box = document.getElementById("box");
		var flag = true;
		var left = 0;
		var stopID;
		//当前执行时间
		var nowTime = 0;
		//记录每次动画执行结束的时间
		var lastTime = Date.now();
		//我们自己定义的动画时间差值
		var diffTime = 40;
 
		function render() {
			if (flag == true) {
				if (left >= 100) {
					flag = false
				}
				box.style.left = ` ${left++}px`
			} else {
				if (left <= 0) {
					flag = true
				}
				box.style.left = ` ${left--}px`
			}
		}
 
		//requestAnimationFrame效果
		(function animloop() {
			//记录当前时间
			nowTime = Date.now()
			// 当前时间-上次执行时间如果大于diffTime,那么执行动画,并更新上次执行时间
			if (nowTime - lastTime > diffTime) {
				lastTime = nowTime
				render();
			}
			stopID = requestAnimationFrame(animloop);
			const start = document.getElementById('start');
			start.onclick = function () {
				stopID = requestAnimationFrame(animloop);
				// 用于测试
				console.log('1');
			}
		})()
 
		const stop = document.getElementById('stop');
		stop.onclick = function () {
			cancelAnimationFrame(stopID);
			// 用于测试
			console.log('1');
		}
	</script>
</body>
 
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML输出特殊字符详细方法

以下是部分特殊字符代码表&#xff0c;它们的完整应用代码格式为&#xff1a;&#;用下面的四位数字替换&#xff0c;将得到对应的符号。&#xff08;注意&#xff1a;应用这些代码&#xff0c;编辑器应该切换到HTML模式&#xff09; ☏260f ☎260e ☺263a ☻263b ☼263c ☽…

【UML】第6篇 用例图(1/3)

目录 一、什么是用例图 二、参与者 2.1 什么是参与者 2.2 如何识别参与者 2.3 参与者之间的关系 从今天开始&#xff0c;就到了最干的各种的图的梳理和学习了&#xff0c;未来AI就能编码了&#xff0c;把业务建模和设计的基本功打好&#xff0c;也许能和AI和平相处呢。 一…

第三节TypeScript 基础类型

1、typescript的基础类型 如下表&#xff1a; 数据类型 关键字 描述 任意类型 any 生命any的变量可以赋值任意类型的值 数字类型 number 整数或分数 字符串类型 string 使用单引号&#xff08;‘’&#xff09;或者双引号&#xff08;“”&#xff09;来表示字符串…

nodejs微信小程序+python+PHP购物商城网站-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

3D模型格式转换工具如何实现高性能数据转换?请看CAE系统开发实例!

​ 客户背景 DP Technology是全球知名的CAM的供应商&#xff0c;在全球8个国家设有18个办事处。DP Technology提供的CAMESPRIT系统是一个用于数控编程&#xff0c;优化和仿真全方面的CAM系统。CAMESPRIT的客户来自多个行业&#xff0c;因此支持多种CAD工具和文件格式显得格外重…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第一套区块链系统部署与运维

第一套区块链系统部署与运维题目 环境 : ubuntu20 fisco : 2.8.0 子任务1-2-1: 搭建区块链系统并验证 题意: 要求搭建一条四节点的区块链系统,我们选择使用fisco作为此次测试的链子 我们使用build_chain.sh进行构建单机四节点,并且使用官方的默认端口【正式比赛大概率不…

java使用面向对象实现图书管理系统

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

算法基础之筛质数

筛质数 核心思想&#xff1a;筛法求质数 埃氏筛法: 每次用 2 3 4…. p-1 筛 2 - p之间的数出现2 3 4 …的倍数时 去掉(4实际已经被去掉 不会用4去筛)当2~p-1的数都没有筛掉p 说明p是质数 优化: 只用2~p-1中质数筛 线性筛法: 核心: n只会被其最小质因子筛掉 每一个合数都只…

如何使用AI智能写作API接口批量处理数据

有大量的数据&#xff0c;想使用AI智能写作工具进行批量操作处理&#xff0c;有没什么好方法&#xff1f; 可以使用简数采集器&#xff0c;支持自动采集数据&#xff0c;也支持批量导入数据&#xff0c;然后调用第三方AI智能写作API接口进行批量处理&#xff08;例如&#xff…

『 C++ 』二叉树进阶OJ题

文章目录 根据二叉树创建字符串 &#x1f996;&#x1f969; 题目描述&#x1f969; 解题思路&#x1f969; 代码 二叉树的层序遍历(分层遍历) &#x1f996;&#x1f969; 题目描述&#x1f969; 解题思路&#x1f969; 代码 二叉树的层序遍历(分层遍历)Ⅱ &#x1f996;&…

redis集群介绍

这里写自定义目录标题 redis集群是什么&#xff1f;redis集群方案1.节点2.槽指派3在集群中执行命令4.复制与故障转移5.消息 redis集群搭建参考文档 redis集群是什么&#xff1f; redis集群是一个由多个主从节点群组成的分布式服务集群&#xff0c;它具有复制、高可用和分片特性…

无锡算法大赛线下颁奖会,齐聚院士专家探讨前沿AI技术,大赛选手优秀获奖方案分享!

极市邀您参与“视界拓新知Al有所为 2023首届无锡国际人工智能算法大赛”&#xff0c;相聚美丽无锡&#xff01; 举行地点&#xff1a;无锡君来洲际酒店君来厅 举行时间&#xff1a;2023年12月27日&#xff08;周三&#xff09; 此次大会齐聚多名院士专家&#xff0c;分享前沿…

Linux/Windows IP | Team基础管理

引言 IP&#xff08;Internet Protocol&#xff09; 定义&#xff1a; IP&#xff08;Internet Protocol&#xff09;是网络传输数据的协议&#xff0c;负责在网络中唯一标识和定位设备&#xff0c;并提供数据传输的基础。功能&#xff1a; 允许计算机在网络上相互通信和交换…

做一个家政预约小程序需要了解哪些功能?

随着科技的发展&#xff0c;人们的生活方式发生改变&#xff0c;家政服务在快节奏的时代成为家庭必备。为了满足人们对家政服务的需求&#xff0c;许多家政公司开始寻求线上发展机会。小程序作为轻量级应用&#xff0c;逐渐成为家政行业的重要载体。本文将详细介绍家政小程序的…

【数据结构和算法】---二叉树(1)--树概念及结构

目录 一、树的概念及结构1.1 树的概念1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用 二、二叉树的概念及结构2.1 二叉树概念2.2 特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储结构 三、树概念相关题目 一、树的概念及结构 1.1 树的概念 树是一种非线性的数据结构&#…

Python爬虫之两种urlencode编码发起post请求方式

背景 闲来无事想爬一下牛客网的校招薪资水平及城市分布&#xff0c;最后想做一个薪资水平分布的图表出来 于是发现牛客使用的是application/x-www-form-urlencoded的格式 测试 首先可以先用apipost等测试工具先测试一下是否需要cookie之类的&#xff0c;发现是不需要的&…

第五节TypeScript 运算符

一、描述 运算符用于执行程序代码运算。 二、运算符主要包括&#xff1a; 算术运算符逻辑运算符关系运算符按位运算符赋值运算符三元/条件运算符字符串运算符类型运算符 1、算术运算符 y5&#xff0c;对下面算术运算符进行解释&#xff1a; 运算符 描述 例子 x 运算结果…

Elasticsearch:什么是文本分类?

文本分类定义 - text classification 文本分类是一种机器学习&#xff0c;它将文本文档或句子分类为预定义的类或类别。 它分析文本的内容和含义&#xff0c;然后使用文本标签为其分配最合适的标签。 文本分类的实际应用包括情绪分析&#xff08;确定评论中的正面或负面情绪&…

10 个顶级免费 Android 数据恢复软件可帮助恢复已删除的文件

不小心删除了手机上的一些重要数据或文件&#xff1f;这很不幸&#xff0c;但不要悲伤或放弃希望&#xff0c;因为仍有机会恢复它们。 10 个顶级免费 Android 数据恢复软件 虽然 Android 手机没有像 Windows 那样的回收站可以自动存储您删除的数据&#xff0c;但是有很多功能强…

v高速、低功耗数模转换器MS9708/MS9710/MS9714

产品简述 MS9708/MS9710/MS9714 是一个 8-Bit/10-Bit/14-Bit 高速、低功耗 D/A 转换器。当采样速率达到 125MSPS 时&#xff0c; MS9708/MS9710/MS9714 也能提供优越的 AC 和 DC 性能。 MS9708/MS9710/MS9714 的正常工作电压范围为 2.7V 到 5.5V &#xff0c;…