一、requestAnimationFrame()
当然最原始的你还可以使用
window.setTimout()
或者window.setInterval()
通过不断更新元素的状态位置等来实现动画,前提是画面的更新频率要达到每秒60次才能让肉眼看到流畅的动画效果。
现在又多了一种实现动画的方案,那就是window.requestAnimationFrame()
方法。
1、基本方法使用
var num = 0;
function fn() {
num++;
document.title = num;
//在内部根据用户浏览器(电脑性能)情况,重复调用 fn,
requestAnimationFrame(fn);
}
//requestAnimationFrame(fn);调用一次fn;
//也可以如下
fn();
2、cancelRequestAnimationFrame( timer )
添加 manage
定时管理器
var num = 0;
var timer;
function fn() {
num++;
document.title = num;
//在内部根据用户浏览器情况,重复调用 fn,
timer = requestAnimationFrame(fn);
if (num == 250) {
cancelAnimationFrame(timer);
}
}
// requestAnimationFrame(fn); 调用一次fn;
//也可以如下
fn();
把 requestAnimationFrame(fn)
赋值给 timer,timer
就是定时管理器
3、RequestAnimationFrame( )兼容
window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || function (fn) {
setTimeout(fn, 1000 / 60);
};
4、cancelAnimationFrame( ) 兼容
window.cancelAnimationFrame = window.cancelAnimationFrame || window.mozCanceltAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame || clearTimeout;
二、速度版运动框架
var Obox = document.getElementById('box');
move(Obox,'left',20,-6);//调用move函数,指定传递实参
function move(obj,attr,target,speed){//指定接受形参
target = parseFloat(target);//转化为number
var init = parseFloat( getStyle(obj,attr));//获取初始样式值
var time;//动画管理器
(function rQAF(){
init+= speed;
time = window.requestAnimationFrame(rQAF);//调用requestAnimationFramerQAF函数
if( Math.abs(target-init)<=Math.abs(speed) ){//用绝对值判断是否到达目标值
init = target;//
window.cancelAnimationFrame(time);//删除requestAnimationFrame动画
}
obj.style[attr] = init+'px';//设置样式
})()
}
function getStyle(obj,attr){//定义获取样式函数
return window.getComputedStyle? window.getComputedStyle(obj)[attr]:obj.currentStyle[attr];
}
三、时间版运动框架
move(Obox,'left','800px',1000);//调用move函数,指定传递实参
function move(obj,attr,target,tar_t){//指定接受形参
target = parseFloat(target);//转化为number
var init = parseFloat( getStyle(obj,attr));//获取初始样式值
var init_t = new Date();//获取开始时间
var style_val;
(function rQAF(){
var cur_t = new Date()- init_t;//获取动画时长
var prop =cur_t/tar_t;//获取动画执行时长与动画预设总时间比值
if( prop>=1 ){//动画执行时长与动画预设总时间比值大于等于1时,
prop=1;
}else{
window.requestAnimationFrame(rQAF);
}
style_val = (target-init)*prop;//根据时间比例获取运动路程比例
obj.style[attr] = init+style_val+'px';//设置样式
})()
}
function getStyle(obj,attr){//定义获取样式函数
return window.getComputedStyle? window.getComputedStyle(obj)[attr]:obj.currentStyle[attr];
}
网友评论