当前位置: 首页 > news >正文

requestAnimationFrame 使用

1、概述

参考网址:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame

window.requestAnimationFrame() 参数是一个回调函数。

回调的次数建议每秒60次。

这个回调函数只有一个传参,DOMHighResTimeStamp,指示requestAnimationFrame() 开始触发回调函数的当前时间(performance.now() 返回的时间)。

与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机。具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,requestAnimationFrame的步伐跟着系统的刷新步伐走。

 

2、示例

<!DOCTYPE html>
<html lang="zh">

    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>requestAnimationFrame使用</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            #ani{
                width: 100px;
                height: 100px;
                border: 1px solid greenyellow;
            }
        </style>
    </head>

    <body>
        <div id="ani">

        </div>
        <script type="text/javascript">
            var start = null;
            var element = document.getElementById('ani');
            element.style.position = 'absolute';
            function step(timestamp) {
                if(!start) start = timestamp;
                var progress = timestamp - start;
                element.style.left = Math.min(progress / 10, 400) + 'px';
                //动画执行时间
                if(progress < 4000) {
                    //在动画没有结束前,递归渲染
                    window.requestAnimationFrame(step);
                }
            }
            //第一帧渲染
            window.requestAnimationFrame(step);
        </script>
    </body>

</html>

优点:

  • CPU节能:使用setTimeout实现的动画,当页面被隐藏或最小化时,setTimeout 仍然在后台执行动画任务,由于此时页面处于不可见或不可用状态,刷新动画是没有意义的,完全是浪费CPU资源。而requestAnimationFrame则完全不同,当页面处理未激活的状态下,该页面的屏幕刷新任务也会被系统暂停,因此跟着系统步伐走的requestAnimationFrame也会停止渲染,当页面被激活时,动画就从上次停留的地方继续执行,有效节省了CPU开销。
  • 函数节流:在高频率事件(resize,scroll等)中,为了防止在一个刷新间隔内发生多次函数执行,使用requestAnimationFrame可保证每个刷新间隔内,函数只被执行一次,这样既能保证流畅性,也能更好的节省函数执行的开销。一个刷新间隔内函数执行多次时没有意义的,因为显示器每16.7ms刷新一次,多次绘制并不会在屏幕上体现出来。

相关文章:

  • Flutter实战之自定义日志打印组件
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • 36.Azure制作自定义的Windows虚拟机映像
  • apollo客户端springboot实战(四)
  • python 全栈开发,Day4
  • 概率生成函数学习笔记
  • Qt托盘程序
  • LayaAir疑难杂症之一:List渲染无法生效
  • Spring aop详解
  • 解决Linux下普通用户无法使用root连接MySQL服务
  • BZOJ4514: [Sdoi2016]数字配对(费用流)
  • Leetcode PHP题解--D10 942. DI String Match
  • Java学习笔记之ArrayList基本用法
  • 阿里巴巴2020届校招实习生内推开始啦
  • ionic3 学习记录
  • 分享一款快速APP功能测试工具
  • Android优雅地处理按钮重复点击
  • CentOS7简单部署NFS
  • Cumulo 的 ClojureScript 模块已经成型
  • Effective Java 笔记(一)
  • flask接收请求并推入栈
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Netty源码解析1-Buffer
  • nginx 配置多 域名 + 多 https
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 开源SQL-on-Hadoop系统一览
  • 每天一个设计模式之命令模式
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端设计模式
  • 巧用 TypeScript (一)
  • 写代码的正确姿势
  • 应用生命周期终极 DevOps 工具包
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • $().each和$.each的区别
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (七)c52学习之旅-中断
  • (七)理解angular中的module和injector,即依赖注入
  • (转)Unity3DUnity3D在android下调试
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .axf 转化 .bin文件 的方法
  • .NET CLR基本术语
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .Net6 Api Swagger配置
  • .net反混淆脱壳工具de4dot的使用
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @html.ActionLink的几种参数格式