【JS】控制requestAnimationFrame执行速度

本文介绍如何在JavaScript中利用requestAnimationFrame实现动画,并控制其执行速度,通过设置帧率和动画逻辑,确保动画效果的平滑与可控。
摘要由CSDN通过智能技术生成

问题

  • requestAnimationFrame执行速度很快,几乎每秒执行60次
  • 无法控制requestAnimationFrame执行速度,但可以控制执行逻辑

思路

  • 初始化一个时间戳
  • 执行动画创建一个时间戳
  • 动画时间戳 - 初始时间戳 = 本次动画距离上一次初始时间戳的时间间隔
  • 大于规定毫秒执行代码逻辑
  • 小于不做任何操作

let myStatu = 10000,
    anFinish = 0;


let updatedRaf = undefined,
    /**
     * ## fps Number 30   
     * - 输入控制的帧率,值越大间隔执行的时间越长
     */
    fps = 30,
    //初始化时间戳
    timer = new Date().getTime();

const onAnimationFrame = () => {
    /**
     * 动画停止条件判断
     */
    anFinish++
    if (anFinish > myStatu) return cancelAnimationFrame(updatedRaf)

    // 控制帧率 | 本次动画距离上一次初始时间戳的时间间隔 
    if (new Date().getTime() - timer > fps) {
        /**
         * !执行逻辑
         * 这里执行你要操作的内容,例如操作dom、修改响应式数据等...........  
         */
        //............ 
        //............ 
        //............ 
        //............ 
        //............ 
        //............ 
        console.log('My Name Is ShuaiGeiGe', anFinish);
        //刷新时间戳
        timer = new Date().getTime()
    }


    updatedRaf = requestAnimationFrame(onAnimationFrame);
};

// 开始动画
updatedRaf = requestAnimationFrame(onAnimationFrame);
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
window.requestAnimationFrame方法并不直接控制滚动速度,它是用来执行动画的一个优化方法。它会在浏览器的下一次重绘之前调用指定的回调函数,以便实现流畅的动画效果。通过使用requestAnimationFrame,浏览器可以根据自身的刷新频率来决定动画的帧率,从而提供最佳的性能和平滑度。 在滚动场景中,可以使用requestAnimationFrame来实现平滑的滚动效果。通过在每一帧中更新滚动位置,可以根据时间和缓动函数来计算出每一帧的滚动距离,从而实现滚动速度控制。这样可以避免使用setTimeout或setInterval等方法导致的性能问题和不良的用户体验。 以下是一个使用requestAnimationFrame实现平滑滚动的示例代码: ```javascript function scrollTo(element, to, duration) { const start = element.scrollTop; const change = to - start; const startTime = performance.now(); function animateScroll(timestamp) { const currentTime = timestamp - startTime; const easing = easeInOutQuad(currentTime, start, change, duration); element.scrollTop = easing; if (currentTime < duration) { requestAnimationFrame(animateScroll); } } function easeInOutQuad(t, b, c, d) { t /= d / 2; if (t < 1) return c / 2 * t * t + b; t--; return -c / 2 * (t * (t - 2) - 1) + b; } requestAnimationFrame(animateScroll); } // 使用示例 const container = document.getElementById('container'); scrollTo(container, 500, 1000); // 在1秒内将容器滚动到500的位置 ``` 这段代码会在1秒内将指定的容器滚动到指定的位置,滚动速度可以通过调整duration参数来控制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值