详解requestAnimationFrame和setInterval该如何选择

目录
  • 正文
  • requestAnimationFrame的工作方式
  • setInterval的工作方式
  • requestAnimationFrame和setInterval之间的区别
    • 适用场景
  • 写在后面

正文

在Web前端开发中,使用计时器是实现动画效果、周期性任务、定时器等常见操作的核心。JavaScript提供了两种计时器:requestAnimationFrame和setInterval。虽然它们看起来很相似,但它们的工作方式却有很大的不同。

requestAnimationFrame的工作方式

requestAnimationFrame是一种浏览器提供的API,它允许我们在浏览器的下一次重绘之前执行JavaScript代码。这样可以避免浏览器反复重绘,并提供更流畅的动画效果。

当我们使用requestAnimationFrame时,浏览器会在下一次重绘之前调用我们提供的回调函数。回调函数中通常会更新动画的状态,并再次调用requestAnimationFrame以便在下一次重绘时更新动画。

requestAnimationFrame的调用频率通常为每秒60次。这意味着我们可以在每次重绘之前更新动画的状态,并确保动画流畅运行,而不会对浏览器的性能造成影响。

使用requestAnimationFrame来创建一个动画效果:

function animate() {
  // 更新动画状态
  // ...
  // 再次调用requestAnimationFrame
  requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

需要注意的是,由于requestAnimationFrame的调用频率固定为每秒60次,因此如果我们在回调函数中进行复杂的计算,可能会导致动画卡顿或者掉帧。因此,我们应该尽量避免在回调函数中进行过多的计算,并尽量使用CSS动画来实现简单的动画效果。

setInterval的工作方式

setInterval是另一种JavaScript计时器,它可以让我们在指定的时间间隔内重复执行一个操作。与requestAnimationFrame不同的是,setInterval不会考虑浏览器的重绘,而是按照指定的时间间隔执行回调函数。

需要注意的是,setInterval的调用频率取决于指定的时间间隔。这意味着当浏览器正在忙于执行其他任务时,setInterval可能会被延迟执行,从而影响动画的流畅度。

使用setInterval来每秒更新一次页面上的时间:

function updateTime() {
  // 更新时间
  // ...
}
setInterval(updateTime, 1000);

需要注意的是,由于setInterval的调用频率不固定,因此在实现动画效果时可能会出现卡顿或者掉帧的情况。因此,我们应该尽量使用requestAnimationFrame来实现流畅的动画效果。

requestAnimationFrame和setInterval之间的区别

虽然requestAnimationFrame和setInterval看起来很相似,但它们之间有一些重要的区别:

  • requestAnimationFrame会在浏览器的下一次重绘之前执行回调函数,而setInterval会按照指定的时间间隔重复执行回调函数。
  • requestAnimationFrame会自动考虑浏览器的重绘,避免不必要的重绘,提供更流畅的动画效果。而setInterval则不会考虑浏览器的重绘,可能会导致不必要的重绘,影响性能。
  • requestAnimationFrame会在浏览器的后台标签页中暂停,避免不必要的计算资源占用。而setInterval则会一直执行,可能会导致浏览器卡顿或者耗尽电池。

适用场景

根据上述分析,我们可以得出以下结论:

  • 如果需要周期性执行任务,且精度要求不高,可以使用setInterval。
  • 如果需要执行动画或者周期性执行任务,且精度要求较高,可以使用requestAnimationFrame。
  • 对于一些不规律的任务,可以根据具体情况选择合适的方式。

综上所述,setInterval和requestAnimationFrame都有各自的优缺点,需要根据具体情况选择合适的方式来执行任务。

写在后面

在大多数情况下,我们应该使用requestAnimationFrame来实现动画效果,因为它可以提供更流畅的动画效果,并避免不必要的重绘和计算资源占用。而setInterval则更适合于需要按照指定时间间隔重复执行的操作,例如定时器和计时器等。

另外,我们还可以使用setTimeout来模拟requestAnimationFrame的效果。具体做法是在每次重绘之前使用setTimeout来调用我们的回调函数,从而实现与requestAnimationFrame类似的效果。

使用setTimeout来模拟requestAnimationFrame,需要在每次执行回调函数时,根据当前时间和上一次执行回调函数的时间计算出时间间隔,然后将该时间间隔传递给下一个setTimeout。具体实现如下:

let lastTime = 0;
function animate() {
    let currentTime = new Date().getTime();
    let timeInterval = Math.max(0, 16 - (currentTime - lastTime));// 计算时间间隔
    setTimeout(() => {
        console.log('Hello World!');
        lastTime = new Date().getTime();
        animate();
    }, timeInterval);
}
animate();

上述代码会以每秒60帧的速度打印Hello World!,与requestAnimationFrame类似。

最后,需要注意的是,在实现动画效果时,我们应该尽量减少页面中的动画数量和复杂度,避免影响浏览器的性能和用户体验。

以下是参考链接,感兴趣的可以去了解下。

以上就是requestAnimationFrame和setInterval该如何选择的详细内容,更多关于requestAnimationFrame setInterval的资料请关注我们其它相关文章!

(0)

相关推荐

  • promise结合requestAnimationFrame用法示例

    目录 promise基础用法 promise结合requestAnimationFrame 理解requestAnimationFrame 结合promise与requestAnimationFrame promise基础用法 js为了解决单线程的异步执行问题,引入了事件循环队列体系,这个体系里的队列中都是一个个排着队等待执行的宏任务,settimeout就是一个宏任务,promise是典型的微任务,微任务概念是相对宏任务而言的,可以把微任务理解为宏任务中的队列.因为宏任务是按序执行,所以如果当

  • requestAnimationFrame使用示例详解

    目录 requestAnimationFrame--use是什么 回调函数 调用频率 返回啥 如何用window.requestAnimationFrame(callback); 示例 多个运行情况 停止执行 cancelAnimationFrame 动画运用 总结 requestAnimationFrame--use是什么 告诉浏览器用来执行一个动画,并且在下一次重绘之前调用其指定的回调函数取更新动画,所以该方法的参数就是一个回调函数,在下一次重绘时候调用. 回调函数 回调函数即是传入的cal

  • JavaScript requestAnimationFrame动画详解

    进入web2.0时代,在网页中实现动画已经不再局限于一种方法 你可以用CSS3的animattion+keyframes; 你也可以用css3的transition; 你还可以用通过在canvas上作图来实现动画,也可以借助jQuery动画相关的API方便地实现; 当然最原始的你还可以使用window.setTimout()或者window.setInterval()通过不断更新元素的状态位置等来实现动画,前提是画面的更新频率要达到每秒60次才能让肉眼看到流畅的动画效果. 认识JavaScrip

  • JS使用window.requestAnimationFrame()实现逐帧动画

    window.requestAnimationFrame() 方法告诉浏览器您希望执行动画,并请求浏览器调用指定的函数在下一次重绘之前更新动画.该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用. 如果你想做逐帧动画的时候,你应该用这个方法.这就要求你的动画函数执行会先于浏览器重绘动作.通常来说,被调用的频率是每秒60次,但是一般会遵循W3C标准规定的频率.如果是后台标签页面,重绘频率则会大大降低. 基本语法: requestID = window.requestAnimatio

  • 详解requestAnimationFrame和setInterval该如何选择

    目录 正文 requestAnimationFrame的工作方式 setInterval的工作方式 requestAnimationFrame和setInterval之间的区别 适用场景 写在后面 正文 在Web前端开发中,使用计时器是实现动画效果.周期性任务.定时器等常见操作的核心.JavaScript提供了两种计时器:requestAnimationFrame和setInterval.虽然它们看起来很相似,但它们的工作方式却有很大的不同. requestAnimationFrame的工作方式

  • 详解HTML5 使用video标签实现选择摄像头功能

    详解HTML5 使用video标签实现选择摄像头功能 1. html // jquery reference // <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script> // <input type="hidden" name="imgValue" id="imgValue"

  • 详解Python排序算法的实现(冒泡,选择,插入,快速)

    目录 1. 前言 2. 冒泡排序算法 2.1 摆擂台法 2.2 相邻两个数字相比较 3. 选择排序算法 4. 插入排序 5. 快速排序 6. 总结 1. 前言 所谓排序,就是把一个数据群体按个体数据的特征按从大到小或从小到大的顺序存放. 排序在应用开发中很常见,如对商品按价格.人气.购买数量……显示. 初学编程者,刚开始接触的第一个稍微有点难理解的算法应该是排序算法中的冒泡算法. 我初学时,“脑思维”差点绕在 2 个循环结构的世界里出不来了.当时,老师要求我们死记冒泡的口诀,虽然有点搞笑,但是当

  • 详解iOS App中UIPickerView滚动选择栏的添加方法

    1.UIPickerView的宽度和高度是固定的,纵向是320216,横向是568162 2.属性: 复制代码 代码如下: @property(nonatomic,readonly)NSInteger numberOfComponents; // 选择框的行数 @property(nonatomic,assign)idUIPickerViewDataSource> dataSource; (类似于UITableView) @property(nonatomic,assign)idUIPicker

  • 详解golang开发中select多路选择

    select 是 Golang 中的一个控制结构,语法上类似于switch 语句,只不过select是用于 goroutine 间通信的 ,每个 case 必须是一个通信操作,要么是发送要么是接收,select 会随机执行一个可运行的 case.如果没有 case 可运行,goroutine 将阻塞,直到有 case 可运行. select 多路选择 select写法上跟switch case的写法基本一致,只不过golang的select是通信控制语句.select的执行必须有通信的发送或者接

  • 详解element-ui中el-select的默认选择项问题

    直接绑定将option中的value值绑定给v-model <template> <div> <el-select v-model="query"> <el-option v-for="item in options" :key="item.value" :value="item.value" :label="item.label"></el-optio

  • 详解Python利用APScheduler框架实现定时任务

    目录 背景 样例代码 代码详解 执行结果 知识点补充 背景 最近在做一些python工具的时候,常常会碰到定时器问题,总觉着使用threading.timer或者schedule模块非常不优雅.所以这里给自己做个记录,也分享一个定时任务框架APScheduler.具体的架构原理就不细说了,用个例子说明一下怎么简易的使用. 样例代码 先上样例代码,如下: #!/user/bin/env python # coding=utf-8 """ @project : csdn @aut

  • jQuery选择器之属性筛选选择器用法详解

    在这么多属性选择器中[attr="value"]和[attr*="value"]是最实用的 [attr="value"]能帮我们定位不同类型的元素,特别是表单form元素的操作,比如说input[type="text"],input[type="checkbox"]等 [attr*="value"]能在网站中帮助我们匹配不同类型的文件 <!DOCTYPE html> <

  • JavaScript中SetInterval与setTimeout的用法详解

    setTimeout 描述 setTimeout(code,millisec) setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止 参数 描述 code 必需,要调用的函数后要执行的 JavaScript 代码串. millisec 必需,在执行代码前需等待的毫秒数. setTimeinterval setInterval(code,millisec[,"lang"]) 参数

  • mysql use命令选择数据库详解

    连接到MySQL服务器后,则需要选择特定的数据库的来工作.这是因为可能有多个数据库可使用在MySQL服务器上. use命令格式: use <数据库名>; 如果我们想要切换到test数据库,那我们可以使用如下命令: mysql> USE test; Database changed 现在,我们已经选择 test 数据库,后续所有操作将在 test 数据库上执行. 注意: 所有的数据库名,表名,表中的字段名称是区分大小写的.所以,我们必须使用适当的名称,在给定任何SQL命令. 另外,use命

随机推荐