HTML5 requestAnimationFrame( ) 动画API

本文介绍了requestAnimationFrame API的基本用法和优势,包括如何用它来创建更流畅的动画效果,并提供了兼容不同浏览器的封装代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


简介

当用JS做动画效果时,一般用setTimeout()setInterval()来进行动画效果的制作,现在好了,出现了一个专门用于处理动画的API——requestAnimationFrame(),表意为“请求动画帧”。


用法

基本语法:

requestAnimationFrame(callback)//callback为回调函数
cancelAnimationFrame(id) //requestAnimationFrame的返回值

requestAnimationFrame参数为一个回调函数,返回ID值。
cancelAnimationFrame用于取消requestAnimationFrame

可以看到和setTimeout/setInterval的用法差不多。

var globalID; //requestAnimationFrame的返回ID

//动画处理函数
function animate() {
    //动画相关的操作...
    globalID=requestAnimationFrame(animate);//参数为函数回调
}

//使用这个函数进行动画停止操作
cancelAnimationFrame(globalID);

优势

浏览器进行优化,动画更流畅;

按浏览器的时间间隔绘制,动画不会掉帧;

窗口没激活时或标签页不可见时,动画将暂停,省计算资源,减少CPU和内存的压力;

更省电,尤其是对移动终端。


兼容性

各浏览器对于API的兼容性:

可以看到,除了IE9-、OpearMini和AndroidBrowser4.3-之外全部都支持,支持率为91.71%,总体还不错。


封装代码

requestAnimationFrame兼容封装代码:

(function() {
    var lastTime = 0;
    var vendors = ['webkit', 'moz'];
    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
        window.cancelAnimationFrame =
          window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
    }

    if (!window.requestAnimationFrame)
        window.requestAnimationFrame = function(callback, element) {
            var currTime = new Date().getTime();
            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
            var id = window.setTimeout(function() { callback(currTime + timeToCall); },
              timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        };

    if (!window.cancelAnimationFrame)
        window.cancelAnimationFrame = function(id) {
            clearTimeout(id);
        };
}());

代码源于:Paul Irish requestAnimationFrame for Smart Animating


参考文档

Timing control for script-based animations

Using requestAnimationFrame

MDN window.requestAnimationFrame()


博客名称:王乐平博客

博客地址:http://blog.lepingde.com

优快云博客地址:http://blog.youkuaiyun.com/lecepin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王乐平

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

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

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

打赏作者

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

抵扣说明:

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

余额充值