UNPKG

vislite

Version:

灵活、快速、简单的数据可视化交互式跨端前端库

109 lines (96 loc) 3.36 kB
/*! * 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 };