Tween.js 的下载地址: https://github.com/tweenjs/tween.js
HTML代码:
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>tween.js的简单应用-演示</title> <script type="text/javascript" src="./js/Tween.min.js"></script> <!--<script type="text/javascript" src="./js/Tween.js"></script>--> <style type="text/css"> .box { position: relative; margin: 20px 0 30px 0; width: 100px; height: 100px; background: #089a86; border-radius: 50% 50% 50% 50%; } </style> </head> <body> <div id="box" style="width: 100px;height: 100px;background-color: #008800"></div> <div id="num" style="margin: 100px 0 0 0;font-size: 30px;">0</div> <p>TWEEN.Easing.Linear.None</p> <div id="TWEEN.Easing.Linear.None" class="box" style=""></div> <p>TWEEN.Easing.Quadratic.In</p> <div id="TWEEN.Easing.Quadratic.In" class="box" style=""></div> <p>TWEEN.Easing.Quadratic.Out</p> <div id="TWEEN.Easing.Quadratic.Out" class="box" style=""></div> <p>TWEEN.Easing.Quadratic.InOut</p> <div id="TWEEN.Easing.Quadratic.InOut" class="box" style=""></div> <p>TWEEN.Easing.Cubic.In</p> <div id="TWEEN.Easing.Cubic.In" class="box" style=""></div> <p>TWEEN.Easing.Cubic.Out</p> <div id="TWEEN.Easing.Cubic.Out" class="box" style=""></div> <p>TWEEN.Easing.Cubic.InOut</p> <div id="TWEEN.Easing.Cubic.InOut" class="box" style=""></div> <p>TWEEN.Easing.Quartic.In</p> <div id="TWEEN.Easing.Quartic.In" class="box" style=""></div> <p>TWEEN.Easing.Quartic.Out</p> <div id="TWEEN.Easing.Quartic.Out" class="box" style=""></div> <p>TWEEN.Easing.Quartic.InOut</p> <div id="TWEEN.Easing.Quartic.InOut" class="box" style=""></div> <p>TWEEN.Easing.Quintic.In</p> <div id="TWEEN.Easing.Quintic.In" class="box" style=""></div> <p>TWEEN.Easing.Quintic.Out</p> <div id="TWEEN.Easing.Quintic.Out" class="box" style=""></div> <p>TWEEN.Easing.Quintic.InOut</p> <div id="TWEEN.Easing.Quintic.InOut" class="box" style=""></div> <p>TWEEN.Easing.Sinusoidal.In</p> <div id="TWEEN.Easing.Sinusoidal.In" class="box" style=""></div> <p>TWEEN.Easing.Sinusoidal.Out</p> <div id="TWEEN.Easing.Sinusoidal.Out" class="box" style=""></div> <p>TWEEN.Easing.Sinusoidal.InOut</p> <div id="TWEEN.Easing.Sinusoidal.InOut" class="box" style=""></div> <p>TWEEN.Easing.Exponential.In</p> <div id="TWEEN.Easing.Exponential.In" class="box" style=""></div> <p>TWEEN.Easing.Exponential.Out</p> <div id="TWEEN.Easing.Exponential.Out" class="box" style=""></div> <p>TWEEN.Easing.Exponential.InOut</p> <div id="TWEEN.Easing.Exponential.InOut" class="box" style=""></div> <p>TWEEN.Easing.Circular.In</p> <div id="TWEEN.Easing.Circular.In" class="box" style=""></div> <p>TWEEN.Easing.Circular.Out</p> <div id="TWEEN.Easing.Circular.Out" class="box" style=""></div> <p>TWEEN.Easing.Circular.InOut</p> <div id="TWEEN.Easing.Circular.InOut" class="box" style=""></div> <p>TWEEN.Easing.Elastic.In</p> <div id="TWEEN.Easing.Elastic.In" class="box" style=""></div> <p>TWEEN.Easing.Elastic.Out</p> <div id="TWEEN.Easing.Elastic.Out" class="box" style=""></div> <p>TWEEN.Easing.Elastic.InOut</p> <div id="TWEEN.Easing.Elastic.InOut" class="box" style=""></div> <p>TWEEN.Easing.Back.In</p> <div id="TWEEN.Easing.Back.In" class="box" style=""></div> <p>TWEEN.Easing.Back.Out</p> <div id="TWEEN.Easing.Back.Out" class="box" style=""></div> <p>TWEEN.Easing.Back.InOut</p> <div id="TWEEN.Easing.Back.InOut" class="box" style=""></div> <p>TWEEN.Easing.Bounce.In</p> <div id="TWEEN.Easing.Bounce.In" class="box" style=""></div> <p>TWEEN.Easing.Bounce.Out</p> <div id="TWEEN.Easing.Bounce.Out" class="box" style=""></div> <p>TWEEN.Easing.Bounce.InOut</p> <div id="TWEEN.Easing.Bounce.InOut" class="box" style=""></div> <script type="text/javascript"> /** * 判断是否是数组 * @param argument * @param {number|boolean} opt 是否用严格模式 * @return {*} */ function is_array(argument, opt) { if (opt === 1 || opt === true) { return Object.prototype.toString.call(argument) === "[object Array]"; } return argument && (typeof argument === "object") && ("length" in argument) && (typeof argument.length === "number"); } /** * 判断是否是对象 * @param argument * @return {*} */ function is_object(argument) { if (argument && (typeof argument === "object") && ("length" in argument)) { return Object.prototype.toString.call(argument) === "[object Object]"; } return argument && (typeof argument === "object") && !("length" in argument); } /** * 判断是否是函数 * @param argument * @return {*|boolean} */ function is_function(argument) { return typeof argument === "function"; } /** * 判断是否是字符串 * @param argument * @return {*|boolean} */ function is_string(argument) { return typeof argument === "string"; } /** * 判断是否是数字 * @param argument * @return {boolean} */ function is_number(argument) { return typeof argument === "number"; } (function () { var lastTime = 0; var vendors = ['ms', 'moz', 'webkit', 'o']; 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); }; }()); /*(function () { var lastTime = 0; 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; //console.log("lastTime:"+lastTime+";timeToCall:"+timeToCall); return id; }; window.cancelAnimationFrame = function (id) { clearTimeout(id); }; }());*/ /** * 动画二次封装 * @param {object} attr 初始属性 * @param {object} new_attr 变化后的属性 * @param {number} t 动画运行时间(毫秒) * @param {object|TWEEN.Easing} easing 动画曲线 * @param {number} delay 动画之间的延迟 * @param {function} onUpdate 动画每次更新后执行 * @param {function} onStart 动画开始前的回调函数 * @param {function} onStop 动画结束后的回调函数 * @param {function} onComplete 动画全部结束后执行 * @param {string} AnimateName 动画名称,用来停止循环 * @return {*} */ function toAnimate(attr, new_attr, t, easing, delay, onUpdate, onStart, onStop, onComplete, AnimateName) { AnimateName || (AnimateName = "aID"); if (!is_object(attr)) { throw new Error("初始属性 attr 必须是对象"); } if (!is_object(new_attr)) { throw new Error("变化后的属性 attr 必须是对象"); } if (typeof t !== "number") { throw new Error("动画运行时间 t 必须是整数"); } else if (typeof t === "number" && t < 1) { throw new Error("动画运行时间 t 必须是正整数"); } var tween = new TWEEN.Tween(attr).to(new_attr, t); easing ? tween.easing(easing) : tween.easing(TWEEN.Easing.Quadratic.Out); (delay && typeof delay === "number") && tween.delay(delay); typeof onUpdate === "function" && tween.onUpdate(function () { onUpdate.call(tween, attr, new_attr, t, easing, delay); }); typeof onStart === "function" && tween.onStart(function () { onStart.call(tween, attr, new_attr, t, easing, delay) }); typeof onStop === "function" && tween.onStop(function () { onStop.call(tween, attr, new_attr, t, easing, delay); }); tween.onComplete(function () { typeof onComplete === "function" && onComplete.call(tween, attr, new_attr, t, easing, delay); //停止动画 cancelAnimationFrame(window["animateID"][AnimateName]); }); tween.start(); (Object.prototype.toString.call(window["animateID"]) === "[object Object]") || (window["animateID"] = {}); function animate() { cancelAnimationFrame(window["animateID"][AnimateName]); //清除上一次 console.log(window["animateID"][AnimateName] = requestAnimationFrame(animate)); TWEEN.update(); } requestAnimationFrame(animate); return tween; } var box = document.getElementById("box"); var tween = toAnimate({x: 0, y: 0, n: 0}, { x: 500, y: 200, n: 5000 }, 2000, TWEEN.Easing.Quadratic.Out, false, function () { var args = arguments; console.log(args[0]); num.innerHTML = ~~(args[0].n); box.style.setProperty('transform', 'translate(' + args[0].x + 'pt,' + args[0].y + 'pt)'); }, false, false, function () { setTimeout(function () { toAnimate({x: 500, y: 200,}, {x: 0, y: 0,}, 2000, TWEEN.Easing.Quadratic.Out, false, function () { var args = arguments; console.log(args[0]); //num.innerHTML = ~~(args[0].x); box.style.setProperty('transform', 'translate(' + args[0].x + 'pt,' + args[0].y + 'pt)'); }, false, false, false, "_2233"); }, 3000); }, "_2233"); //暂停动画 //tween.pause(); //继续动画 //tween.resume(); document.body.addEventListener("click", function (e) { var e = e || window.event; var target = e.target || e.srcElement; if (target.tagName.toLocaleLowerCase() === "div" && target.className === "box") { var tween = toAnimate({x: 0, y: 0}, { x: 500, y: 200 }, 1000, eval(target.getAttribute("id")), false, function () { var args = arguments; target.style.setProperty("left", args[0].x + "px"); }, false, false, false, target.getAttribute("id")); } }, false); </script> </body> </html>
如图:
tween.js 代码解压
tween.js代码就不写了,自己去下载,我这个版本是18.3.2的,或者可以区演示地址浏览器F12拿代码