Html5新增神器——requestAnimationFrame是什么?怎么用?

requestAnimationFrame

在Web应用中,实现动画效果的方法比较多,Javascript 中可以通过定时器 setTimeout/ setInterval 来实现,css3 可以使用 transitionanimation 来实现,html5 中的 canvas 也可以实现。除此之外,html5 还提供一个专门用于请求动画的API,那就是 requestAnimationFrame

setTimeout/ setInterval 的显著缺陷就是设定的时间并不精确,它们只是在设定的时间后将相应任务添加到任务队列中,而任务队列中如果还有前面的任务尚未执行完毕,那么后添加的任务就必须等待,这个等待的时间造成了原本设定的动画时间间隔不准requestAnimationFrame的到来就是解决这个问题的 ,它采用的是系统时间间隔(约16.7ms),保持最佳绘制效果与效率,使各种网页动画有一个统一的刷新机制,从而节省系统资源,提高系统性能。


如下是MDN文档requestAnimationFrame的解释

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画

从中可知,该方法需要传入一个回调函数作为参数,且回调函数会在页面被刷新时前调用

语法如下:

window.requestAnimationFrame(callback);
  • callback下一次重绘之前更新动画帧所调用的函数(即上面所说的回调函数)。回调函数会被传入DOMHighResTimeStamp参数(时间戳,十进制数,单位是毫秒,最小精度为1ms),DOMHighResTimeStamp指示当前被 requestAnimationFrame()排序的回调函数被触发的时间。
  • 返回值:是个非零值( long 整数),请求 ID ,是回调列表中唯一的标识。可以传这个值给 window.cancelAnimationFrame() 以取消回调函数。

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

举个例子

var s = 0
function f(DOMHighResTimeStamp) {
  s++
  console.log(s);
  console.log(DOMHighResTimeStamp);
  if (s < 99) {
    window.requestAnimationFrame(f)
  }
}
window.requestAnimationFrame(f)

控制台不断输出s直到99。
在这里插入图片描述
接下来,我们实现一个进度条

<body>
    <div style="width: 0px;height:12px;line-height: 12px;background: pink;">
    0%</div>
    <script>
        var div=document.querySelector('div')
        div.onclick=function(){
            var timer=requestAnimationFrame(function fn(){
                if(parseInt(div.style.width)<300){
                    div.style.width=parseInt(div.style.width)+3+'px';
                    div.innerHTML=parseInt(div.style.width)/3+'%'
                    timer=requestAnimationFrame(fn)
                }else{
                    cancelAnimationFrame(timer)
                }
            })
                
        }
           
    </script>
</body>

点击后,进度条逐渐变成100%
在这里插入图片描述

  • 16
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焦妮敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值