js-requestAnimationFrame属性

举报
林太白 发表于 2025/06/24 17:50:16 2025/06/24
【摘要】 js-requestAnimationFrame属性

js-requestAnimationFrame属性

1、认识requestAnimationFrame是什么

requestAnimationFrame是用于浏览器动画的 JavaScript 方法

简而言之:requestAnimationFrame其实就是用来做动画的属性,用法上同setTimeout类似,并且可以匹配当前设备的刷新率,requestAnimationFrame() 通过自动匹配设备帧率来展示动画(多少帧就每秒执行多少次),做出可以匹配设备刷新率的动画

本质上:是一个浏览器的宏任务请求动画帧

2、作用

  • 代替定时器做更加流畅高性能的动画,也就是弥补定时器做动画不流畅的问题,
  • 高性能且可以解决setTimeout出现动画卡顿的问题
  • 弥补css无法实现的一些动画,比如:页面滚动

3、与setTimeout的相同和区分

【相同点】:

requestAnimationFrame与setTimeout都会返回一个唯一标识

【不同点】:

原理上

  • setTimeout利用递归来代替setInterval做简单的动画
  • requestAnimationFrame() 通过自动匹配设备帧率来展示动画

关闭定时器

  • 定时器上,setTimeout可以通过clearTImeout()关闭定时器。
  • requestAnimationFrame() 则使用cancelAnimationFrame()来关闭动画

参数上

  • setTimeout传入函数和时间
  • requestAnimationFrame这个方法只需要传入一个回调函数,不需要其他参数

时间间隔上

做动画都有一个时间间隔,requestAnimationFrame也有时间间隔

  • setTimeout由自定义的时间间隔来控制的
  • requestAnimationFrame与设备挂钩匹配(不受其他任务的影响)

回调函数执行次数上

  • setTimeout由自定义的时间间隔来控制的
  • requestAnimationFrame🉑️匹配设备,时间间隔上,requestAnimationFrame通常由我们传入的回调函数每秒会执行60次,但是如果你的设备的浏览器遵循W3c的标准,那么我们的函数每秒执行的次数会与你设备的刷新率相匹配。

动画运行上

  • setTimeout由自定义的时间间隔不断运行
  • requestAnimationFrame在大多浏览器中一旦页面不处于浏览器的当前标签,requestAnimationFrame就会自动停止动画。

刷新率和稳定性上

  • 使用定时器setTimeout做动画,假设显示器的刷新率为60hz【也就是每1秒播放60张动画】。为了让动画显示流畅,我们需要将定时器setTimeout的间隔时间定位 “1000/60”,【意思就是1000毫秒执行60次回调函数】,也就是1秒执行60次回调函数,大约每隔16.67毫秒会执行一次,这样就能匹配显示屏的帧率。但是依然还会有卡顿问题,因为定时器属于宏任务,而宏任务必须等待同步任务执行完成,再等微任务执行完成才会执行其中的回调函数,所以我们规定的时间间隔是不稳定并且不准确的。
  • requestAnimationFrame则匹配设备刷新率同步动画

4、使用

requestAnimationFrame的用法与setTimeout差不多,以一个元素上下移动的动画案例来对比

❤ setTimeout() 做元素上下移动动画:

const box = document.querySelector('.box'); //获取元素
let timer = setTimeout(function fn() {
        let move = parseInt(getComputedStyle(box).top);//顶部距离
	if (move < 800) {
		box.style.top = move + 8 + 'px';
		setTimeout(fn, 1000/60);
	} else {
           clearTimeout(timer);
	}
}, 1000/60);

❤ requestAnimationFrame() 做元素上下移动动画:

const box = document.querySelector('.box'); //获取元素
let timer = requestAnimationFrame(function fn() { 
    let move = parseInt(getComputedStyle(box).top);
	if (move < 800) {
		box.style.left = move + 8 + 'px';
		requestAnimationFrame(fn);
	} else {
            cancelAnimationFrame(timer);
	}
});

5、优缺点

优点:

  • 动画更加流畅
  • 高性能
  • 页面滚动

缺点:存在浏览器兼容问题

【兼容性问题处理-引用阮一峰大神的代码】

window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       || 
          window.webkitRequestAnimationFrame || 
          window.mozRequestAnimationFrame    || 
          window.oRequestAnimationFrame      || 
          window.msRequestAnimationFrame     || 
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。