requestAnimationFrame

let duration = 1000;    // 持续时间
let start = 0;
function frame(time) {
    if (!start) {
        start = time;
    }

    const phase = (time - start) / duration;
    if (phase <= 1) {
        // 动画内容,直到持续时间结束
        // ......

        window.requestAnimationFrame(frame);
    }                         
}
window.requestAnimationFrame(frame);

结束动画

window.cancelAnimationFrame(handler);    // handler为window.requestAnimationFrame的返回值
  • 用处:window.requestAnimationFrame()告诉浏览器希望执行一个动画,并且要求浏览器在下次重绘之前更新动画。注意:当window.requestAnimationFrame()运行在后台标签页或者隐藏的iframe里面,window.requestAnimationFrame()会被暂停调用以提高性能。此动画间隔时间由浏览器决定,一般是17毫秒左右。
  • 与定时器比较:setTimeout
    • 相同点:作用基本一致,但是setTimeout可以自由设置时间间隔。并且都是只执行一次,如果要实现类似setInterval的效果,需要使用递归方式。
    • 不同点:setTimeout执行受到js事件队列任务、微任务等影响,可能设定的是17毫秒执行一次,但是实际上并没有严格的卡在17毫秒,因此可能会出现绘制不及时的情况,出现抖动情况;requestAnimationFrame能严格卡在显示器刷新的时间,因此不会出现抖动的情况。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值