vislite
Version:
灵活、快速、简单的数据可视化交互式跨端前端库
109 lines (96 loc) • 3.36 kB
JavaScript
/*!
* animation of VISLite JavaScript Library v1.3.0
* git+https://github.com/oi-contrib/VISLite.git
*/
//当前正在运动的动画的tick函数堆栈
var $timers = [];
//唯一定时器的定时间隔
var $interval = 13;
//定时器ID
var $timerId;
/**
* 动画轮播
* @param {function} doback 轮询函数,有一个形参deep,0-1,表示执行进度
* @param {number} duration 动画时长,可选
* @param {function} callback 动画结束回调,可选,有一个形参deep,0-1,表示执行进度
*
* @returns {function} 返回一个函数,调用该函数,可以提前结束动画
*/
function animation(doback, duration, callback) {
if (arguments.length < 2) duration = 400;
if (arguments.length < 3) callback = function () { };
var clock = {
//把tick函数推入堆栈
"timer": function (tick, duration, callback) {
if (!tick) {
throw new Error('Tick is required!');
}
var id = new Date().valueOf() + "_" + (Math.random() * 1000).toFixed(0);
$timers.push({
"id": id,
"createTime": new Date(),
"tick": tick,
"duration": duration,
"callback": callback
});
clock.start();
return id;
},
//开启唯一的定时器timerId
"start": function () {
if (!$timerId) {
$timerId = setInterval(clock.tick, $interval);
}
},
//被定时器调用,遍历timers堆栈
"tick": function () {
var createTime, flag, tick, callback, timer, duration, passTime, timers = $timers;
$timers = [];
$timers.length = 0;
for (flag = 0; flag < timers.length; flag++) {
//初始化数据
timer = timers[flag];
createTime = timer.createTime;
tick = timer.tick;
duration = timer.duration;
callback = timer.callback;
//执行
passTime = (+new Date().valueOf() - createTime.valueOf()) / duration;
passTime = passTime > 1 ? 1 : passTime;
tick(passTime);
if (passTime < 1 && timer.id) {
//动画没有结束再添加
$timers.push(timer);
} else {
callback(passTime);
}
}
if ($timers.length <= 0) {
clock.stop();
}
},
//停止定时器,重置timerId=null
"stop": function () {
if ($timerId) {
clearInterval($timerId);
$timerId = null;
}
}
};
var id = clock.timer(function (deep) {
//其中deep为0-1,表示改变的程度
doback(deep);
}, duration, callback);
// 返回一个函数
// 用于在动画结束前结束动画
return function () {
var i;
for (i in $timers) {
if ($timers[i].id == id) {
$timers[i].id = void 0;
return;
}
}
};
}
export { animation as default };