requestAnimationFrame的简单使用

requestAnimationFrame

语法:

requestAnimationFrame(callback)

requestAnimationFrame()方法接收一个参数,此参数是一个要在重绘屏幕前调用的函数。每次调用requestAnimationFrame()都会在事件队列上推入一个回调 函数,队列的长度没有限制。

cancelAnimationFrame() 取消任务

刷新频率:一般计算机显示器的屏幕刷新率都 是60Hz,基本上意味着每秒需要重绘60次。大多数浏览器会限制重绘频 率,使其不超出屏幕的刷新率,这是因为超过刷新率,用户也感知不 到。

1 通过requestAnimationFrame节流

let requestID = window.requestAnimationFrame(() => {
    console.log('Repaint!');
});
//取消
// window.cancelAnimationFrame(requestID);

2 解决setInterval()和setTimeout()的不精确

  • IE8及更早版本的计时器精度为15.625毫秒;
  • IE9及更晚版本的计时器精度为4毫秒;
  • Firefox和Safari的计时器精度为约10毫秒;
  • Chrome的计时器精度为4毫秒。

mySetTimeout 2秒后输出

function mySetTimeout(callback, time = 3000) {
    let startTime;
    let timer = null;
    // currentTime  表示下次重绘的时间。
    function animate(currentTime) {
        if (!startTime) {
            startTime = currentTime;//记录步数,每个浏览器不一样
        }
        const elapsedTime = currentTime - startTime;
        if (elapsedTime < time) {
            timer = requestAnimationFrame(animate);
            console.log("timer", timer)
        } else {
            callback();
        }
    }
    timer = requestAnimationFrame(animate);

    function cancel() {
        window.cancelAnimationFrame(timer);
    }
    return cancel;
}
let cancel = mySetTimeout(() => {
    console.log('来啦来啦')
}, 2000);
// 取消 
setTimeout(() => {
    cancel();
}, 1000);

mySetInterval 1秒间隔输出

function mySetInterval(callback, time = 3000) {
    let startTime;
    // currentTime  表示下次重绘的时间。
    let timer = null;
    function animate(currentTime) {
        if (!startTime) {
            startTime = currentTime;//记录步数,每个浏览器不一样
        }
        const elapsedTime = currentTime - startTime;
        if (elapsedTime < time) {
            timer = requestAnimationFrame(animate);
        } else {
            callback();
            timer = requestAnimationFrame(animate);
            startTime = currentTime;
        }
    }
    // 取消重绘
    function cancel() {
        window.cancelAnimationFrame(timer);
    }
    timer = requestAnimationFrame(animate);
    return cancel;
}
let cancel = mySetInterval(() => {
    console.log('来啦来啦')
}, 1000);
// 取消 
// window.cancelAnimationFrame(timer);
setTimeout(() => {
    cancel();
}, 5000)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值