一、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);//转化为numbervar 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);//转化为numbervar 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];}












网友评论