/*! * GIT: https://github.com/shrekshrek/jstween **/ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.JT = factory()); }(this, (function () { 'use strict'; var JT = {}; // --------------------------------------------------------------------辅助方法 function each(obj, callback) { if (obj.length && obj.length > 0) { for (var i = 0; i < obj.length; i++) { callback.call(obj[i], i, obj[i]); } } else { callback.call(obj, 0, obj); } } // WebkitTransform 转 -webkit-transform function hyphenize(str) { return str.replace(/([A-Z])/g, "-$1").toLowerCase(); } // webkitTransform 转 WebkitTransform function firstUper(str) { return str.replace(/\b(\w)|\s(\w)/g, function (m) { return m.toUpperCase(); }); } function fixed(n) { return Math.round(n * 1000) / 1000; } // --------------------------------------------------------------------time fix Date.now = (Date.now || function () { return new Date().getTime(); }); var nowOffset = Date.now(); JT.now = function () { return Date.now() - nowOffset; }; // --------------------------------------------------------------------prefix var prefix = function () { var _d = document.createElement('div'); var _prefixes = ['Webkit', 'Moz', 'Ms', 'O']; for (var i in _prefixes) { if ((_prefixes[i] + 'Transform') in _d.style) return _prefixes[i]; } }(); function browserPrefix(str) { return prefix + (str ? firstUper(str) : ''); } var requestFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { window.setTimeout(callback, 1000 / 60); }; // --------------------------------------------------------------------dom style相关方法 function getElement(el) { if (!el) throw "el is undefined, can't tween!!!"; if (typeof (el) === 'string') { return document.querySelectorAll(el); } else { return el; } } var keywords = [ 'ease', 'delay', 'yoyo', 'repeat', 'repeatDelay', 'onStart', 'onStartScope', 'onStartParams', 'onRepeat', 'onRepeatScope', 'onRepeatParams', 'onEnd', 'onEndScope', 'onEndParams', 'onUpdate', 'onUpdateScope', 'onUpdateParams', 'interpolation', 'isReverse', 'timeScale', 'isFrom', 'isPlaying' ]; var specialProps = ['rotation', 'scale', 'autoAlpha']; function checkPropName(el, name, isDom) { for (var i = 0, l = keywords.length; i < l; i++) { if (name === keywords[i]) return undefined; } if (isDom) { for (var i = 0, l = specialProps.length; i < l; i++) { if (name === specialProps[i]) return name; } if (el._jt_obj[name] !== undefined) return name; if (el.style[name] !== undefined) return name; name = browserPrefix(name); if (el.style[name] !== undefined) return name; } else { if (typeof (el[name]) === 'string' || typeof (el[name]) === 'number') return name; } return undefined; } function checkValue(o1, o2) { var o = {}; if (Array.isArray(o2)) { o.num = [o1.num]; for (var i = 0, l = o2.length; i < l; i++) { var _o = calcValue(o1, o2[i]); o.num.push(_o.num); o.unit = _o.unit; } } else { o = calcValue(o1, o2); } return o; } function calcValue(o1, o2) { var _o2 = regValue(o2); if (o1.unit === 'rem' && _o2.unit !== 'rem') { checkRem(); o1.num = fixed(o1.num * remUnit); o1.unit = 'px'; } else if (o1.unit !== 'rem' && _o2.unit === 'rem') { checkRem(); o1.num = fixed(o1.num / remUnit); o1.unit = 'rem'; } var _value; switch (_o2.ext) { case '+=': _value = o1.num + _o2.num; break; case '-=': _value = o1.num - _o2.num; break; default: _value = _o2.num; break; } return { num: _value, unit: _o2.unit }; } function checkJtobj(el) { if (el._jt_obj === undefined) el._jt_obj = { x: 0, y: 0, z: 0, rotationX: 0, rotationY: 0, rotationZ: 0, scaleX: 1, scaleY: 1, scaleZ: 1, skewX: 0, skewY: 0, }; } function regValue(value) { var _r = /(\+=|-=|)(-|)(\d+\.\d+|\d+)(e[+-]?[0-9]{0,2}|)(rem|px|%|)/i; var _a = _r.exec(value); if (_a) return { num: fixed(_a[2] + _a[3] + _a[4]), unit: _a[5], ext: _a[1] }; else return { num: 0, unit: 'px', ext: '' }; } function checkString(value) { return /(,| |jpeg|jpg|png|gif|-3d)/g.test(value) || !/\d/g.test(value); } function getProp(el, name) { switch (name) { case 'x': case 'y': case 'z': case 'rotationX': case 'rotationY': case 'rotationZ': case 'scaleX': case 'scaleY': case 'scaleZ': case 'skewX': case 'skewY': return el._jt_obj[name]; case 'rotation': return el._jt_obj['rotationZ']; case 'scale': return el._jt_obj['scaleX']; case 'autoAlpha': return getStyle(el, 'opacity'); default: return getStyle(el, name); } } function getStyle(el, name) { if (el.style[name]) { return el.style[name]; } else { var _p = hyphenize(name); var _s = window.getComputedStyle(el, null); return _s[_p] || _s.getPropertyValue(_p); } } var cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1, 'opacity': 1, 'z-index': 1, 'zoom': 1, }; function setProp(el, name, value, unit) { switch (name) { case 'x': case 'y': case 'z': el._jt_obj[name] = value + (unit || 'px'); return true; case 'rotationX': case 'rotationY': case 'rotationZ': case 'skewX': case 'skewY': el._jt_obj[name] = value % 360 + 'deg'; return true; case 'scaleX': case 'scaleY': case 'scaleZ': el._jt_obj[name] = value; return true; case 'rotation': el._jt_obj['rotationZ'] = value % 360 + 'deg'; return true; case 'scale': el._jt_obj['scaleX'] = value; el._jt_obj['scaleY'] = value; return true; case 'autoAlpha': setStyle(el, 'opacity', value); setStyle(el, 'display', value > 0 ? 'block' : 'none'); return false; default: if (unit !== undefined) value = !cssNumber[hyphenize(name)] ? value + (unit || "px") : value + unit; setStyle(el, name, value); return false; } } function setStyle(el, name, value) { el.style[name] = value; } function checkDom(obj) { return typeof (obj) === 'object' && obj.nodeType === 1; } function updateTransform(obj) { var _t = ''; if (obj._jt_obj.x || obj._jt_obj.y || obj._jt_obj.z) _t += 'translate3d(' + obj._jt_obj.x + ',' + obj._jt_obj.y + ',' + obj._jt_obj.z + ') '; if (obj._jt_obj.rotationX) _t += 'rotateX(' + obj._jt_obj.rotationX + ') '; if (obj._jt_obj.rotationY) _t += 'rotateY(' + obj._jt_obj.rotationY + ') '; if (obj._jt_obj.rotationZ) _t += 'rotateZ(' + obj._jt_obj.rotationZ + ') '; if (obj._jt_obj.scaleX !== 1 || obj._jt_obj.scaleY !== 1 || obj._jt_obj.scaleZ !== 1) _t += 'scale3d(' + obj._jt_obj.scaleX + ', ' + obj._jt_obj.scaleY + ', ' + obj._jt_obj.scaleZ + ') '; if (obj._jt_obj.skewX || obj._jt_obj.skewY) _t += 'skew(' + obj._jt_obj.skewX + ',' + obj._jt_obj.skewY + ') '; obj.style[browserPrefix('transform')] = _t; } // --------------------------------------------------------------------计算1rem单位值 var body, tempDiv, remUnit; function checkRem() { if (!tempDiv) { tempDiv = document.createElement('div'); tempDiv.style.cssText = 'border:0 solid; position:absolute; line-height:0px;'; } if (!body) { body = document.getElementsByTagName('body')[0]; } body.appendChild(tempDiv); tempDiv.style.borderLeftWidth = '1rem'; remUnit = parseFloat(tempDiv.offsetWidth); body.removeChild(tempDiv); } // --------------------------------------------------------------------全局update var tweens = []; var tempTweens = []; var isUpdating = false; var lastTime = 0; function globalUpdate() { var _len = tweens.length; if (_len === 0) { isUpdating = false; return; } var _now = JT.now(); var _step = _now - lastTime; lastTime = _now; if (_step > 500) _step = 33; tempTweens = tweens.slice(0); for (var i = 0; i < _len; i++) { var _tween = tempTweens[i]; if (_tween && _tween.isPlaying && !_tween._update(_step)) _tween.pause(); } requestFrame(globalUpdate); } // --------------------------------------------------------------------tween function tween() { this.initialize.apply(this, arguments); } Object.assign(tween.prototype, { initialize: function (el, time, fromVars, toVars, isDom) { this.fromVars = fromVars; this.curVars = {}; this.toVars = toVars; this.el = el; this.duration = Math.max(time, 0) * 1000; this.ease = toVars.ease || JT.Linear.None; this.delay = Math.max(toVars.delay || 0, 0) * 1000; this.yoyo = toVars.yoyo || false; this.repeat = toVars.repeat || 0; this.repeatDelay = Math.max(toVars.repeatDelay || 0, 0) * 1000; this.onStart = toVars.onStart || null; this.onStartScope = toVars.onStartScope || this; this.onStartParams = toVars.onStartParams || []; this.onRepeat = toVars.onRepeat || null; this.onRepeatScope = toVars.onRepeatScope || this; this.onRepeatParams = toVars.onRepeatParams || []; this.onEnd = toVars.onEnd || null; this.onEndScope = toVars.onEndScope || this; this.onEndParams = toVars.onEndParams || []; this.onUpdate = toVars.onUpdate || null; this.onUpdateScope = toVars.onUpdateScope || this; this.onUpdateParams = toVars.onUpdateParams || []; this.isPlaying = false; this.interpolation = toVars.interpolation || null; this.isReverse = toVars.isReverse || false; this.timeScale = toVars.timeScale || 1; this.isFrom = toVars.isFrom || false; this.isInited = false; this.isSeek = false; this.isKeep = false; this.isYoReverse = false; this.isDom = isDom; this.repeat = this.repeat < 0 ? 999999999999 : Math.floor(this.repeat); this.curRepeat = 0; this.elapsed = null; this.startTime = this.delay; this.endTime = this.startTime + this.repeatDelay * this.repeat + this.duration * (this.repeat + 1); this.curTime = null; this.lastTime = null; if (toVars.isPlaying !== false) this.play(); }, _update: function (time) { this.isKeep = false; time = (this.isReverse ? -1 : 1) * time * this.timeScale; var _lastTime = this.curTime; var _curTime = Math.min(this.endTime, Math.max(0, _lastTime + time)); if (_curTime === this.curTime) return true; this.lastTime = _lastTime; this.curTime = _curTime; var _repeat = Math.min(this.repeat, Math.max(0, Math.floor((this.curTime - this.startTime) / (this.duration + this.repeatDelay)))); var _isRepeat = false; if (_repeat !== this.curRepeat) { this.curRepeat = _repeat; if (this.yoyo) this.isYoReverse = this.curRepeat % 2 !== 0; _isRepeat = true; } if (this.isFrom) { initData(this); this._updateProp(); } if (this.lastTime < this.startTime && this.curTime < this.startTime) return true; if (!this.isFrom) { initData(this); this._updateProp(); } if (this.lastTime < this.curTime) { if (this.lastTime <= this.startTime && this.curTime > this.startTime) { if (!this.isSeek && this.onStart) this.onStart.apply(this.onStartScope, this.onStartParams); } if (_isRepeat && !this.isSeek && this.onRepeat) this.onRepeat.apply(this.onRepeatScope, this.onRepeatParams); if (this.lastTime < this.endTime && this.curTime >= this.endTime) { if (!this.isSeek && this.onEnd) this.onEnd.apply(this.onEndScope, this.onEndParams); return this.isKeep; } } else { if (this.lastTime >= this.endTime && this.curTime < this.endTime) { if (!this.isSeek && this.onEnd) this.onEnd.apply(this.onEndScope, this.onEndParams); } if (_isRepeat && !this.isSeek && this.onRepeat) this.onRepeat.apply(this.onRepeatScope, this.onRepeatParams); if (this.lastTime > this.startTime && this.curTime <= this.startTime) { if (!this.isSeek && this.onStart) this.onStart.apply(this.onStartScope, this.onStartParams); return this.isKeep; } } return true; }, _updateProp: function () { var _elapsed = Math.min(1, Math.max(0, (this.curTime === this.endTime ? this.duration : (this.curTime - this.startTime) % (this.duration + this.repeatDelay)) / this.duration)); if (this.isYoReverse) _elapsed = 1 - _elapsed; if (_elapsed === this.elapsed) return; this.elapsed = _elapsed; var _radio = this.ease(_elapsed); var _trans = false; for (var prop in this.fromVars) { var _start = this.fromVars[prop]; var _end = this.toVars[prop]; var _n; if (Array.isArray(_end.num)) { _n = this.interpolation(_end.num, _radio); } else { _n = _start.num + (_end.num - _start.num) * _radio; } _n = fixed(_n); this.curVars[prop] = { num: _n, unit: _end.unit }; if (this.isDom) { if (setProp(this.el, prop, _n, _end.unit)) _trans = true; } else { this.el[prop] = _n + (_end.unit || 0); } } if (_trans) updateTransform(this.el); if (!this.isSeek && this.onUpdate) this.onUpdate.apply(this.onUpdateScope, this.onUpdateParams); }, _addSelf: function () { tweens.push(this); if (!isUpdating) { lastTime = JT.now(); isUpdating = true; requestFrame(globalUpdate); } }, _removeSelf: function () { var i = tweens.indexOf(this); if (i !== -1) tweens.splice(i, 1); }, play: function (time) { this.isReverse = false; if (time !== undefined) this.seek(time, true); if (this.curTime === this.endTime) return this.isKeep = false; else this.isKeep = true; if (this.isPlaying) return; this.isPlaying = true; this._addSelf(); }, pause: function () { this.isKeep = false; if (!this.isPlaying) return; this.isPlaying = false; this._removeSelf(); }, stop: function () { this.pause(); this.seek(0, true); }, reverse: function (time) { this.isReverse = true; if (time !== undefined) this.seek(time, true); if (this.curTime === 0) return this.isKeep = false; else this.isKeep = true; if (this.isPlaying) return; this.isPlaying = true; this._addSelf(); }, seek: function (time, isSeek) { var _time = Math.max(0, Math.min(this.endTime, time * 1000)); if (this.curTime === _time) return; this.isSeek = isSeek || false; this._update((this.isReverse ? -1 : 1) * (_time - this.curTime)); this.isSeek = false; }, setTimeScale: function (scale) { this.timeScale = scale; }, kill: function (toEnd) { this.pause(); if (toEnd) this.seek(this.endTime); this.duration = null; this.curTime = this.lastTime = this.startTime = this.endTime = null; this.el = this.onStart = this.onRepeat = this.onEnd = this.onUpdate = null; } }); // --------------------------------------------------------------------tween 全局方法 function initData(obj) { if (obj.isInited) return; obj.isInited = true; for (var i in obj.fromVars) { var _o = regValue(obj.isDom ? getProp(obj.el, i) : obj.el[i]); obj.fromVars[i] = obj.fromVars[i] === null ? _o : checkValue(_o, obj.fromVars[i]); obj.toVars[i] = obj.toVars[i] === null ? _o : checkValue(obj.fromVars[i], obj.toVars[i]); } } function createTween(type, el, time, fromVars, toVars) { if (typeof time !== "number") throw "The second parameter must be a number!"; checkBezier(toVars); var _el = getElement(el); var _tweens = []; each(_el, function (index, obj) { var _fromVars = {}; var _toVars = {}; var _isDom = checkDom(obj); var _vars; switch (type) { case 'fromTo': _vars = toVars; _vars.isFrom = true; break; case 'from': _vars = fromVars; _vars.isFrom = true; break; case 'to': _vars = toVars; _vars.isFrom = false; break; } if (_isDom) checkJtobj(obj); for (var i in _vars) { var _name = checkPropName(obj, i, _isDom); if (_name) { switch (type) { case 'fromTo': _fromVars[_name] = fromVars[i]; _toVars[_name] = toVars[i]; break; case 'from': _fromVars[_name] = fromVars[i]; _toVars[_name] = null; break; case 'to': _fromVars[_name] = null; _toVars[_name] = toVars[i]; break; } } else { _toVars[i] = _vars[i]; } } _tweens.push(new tween(obj, time, _fromVars, _toVars, _isDom)); }); if (_tweens.length === 0) return null; else if (_tweens.length === 1) return _tweens[0]; else return _tweens; } Object.assign(JT, { get: function (el, param) { var _el = getElement(el); if (_el.length !== undefined) { _el = _el[0]; } var _isDom = checkDom(_el); if (_isDom) { checkJtobj(_el); var _name = checkPropName(_el, param, _isDom); if (_name) return getProp(_el, _name); else return null; } else { return _el[param]; } }, set: function (el, params) { var _el = getElement(el); each(_el, function (index, obj) { var _isDom = checkDom(obj); if (_isDom) { checkJtobj(obj); var _trans = false; for (var i in params) { var _name = checkPropName(obj, i, _isDom); if (_name) { if (checkString(params[i])) { if (setProp(obj, _name, params[i])) _trans = true; } else { var _o = checkValue(regValue(getProp(obj, _name)), params[i]); if (setProp(obj, _name, _o.num, _o.unit)) _trans = true; } } } if (_trans) updateTransform(obj); } else { for (var i in params) { var _o = checkValue(regValue(obj[i]), params[i]); obj[i] = _o.num + (_o.unit || 0); } } }); }, fromTo: function (el, time, fromVars, toVars) { return (time || toVars.delay) ? createTween('fromTo', el, time, fromVars, toVars) : this.set(el, toVars); }, from: function (el, time, fromVars) { return (time || fromVars.delay) ? createTween('from', el, time, fromVars, {}) : this.set(el, fromVars); }, to: function (el, time, toVars) { return (time || toVars.delay) ? createTween('to', el, time, {}, toVars) : this.set(el, toVars); }, kill: function (el, toEnd) { var _el = getElement(el); each(_el, function (index, obj) { var _len = tweens.length; for (var i = _len - 1; i >= 0; i--) { var _tween = tweens[i]; if (_tween.el === obj) { _tween.kill(toEnd); } } }); }, killAll: function (toEnd) { var _len = tweens.length; for (var i = _len - 1; i >= 0; i--) { var _tween = tweens[i]; _tween.kill(toEnd); } }, play: function (el, time) { actionProxy(el, 'play', time); }, playAll: function (time) { actionProxyAll('play', time); }, pause: function (el) { actionProxy(el, 'pause'); }, pauseAll: function () { actionProxyAll('pause'); }, stop: function (el) { actionProxy(el, 'stop'); }, stopAll: function () { actionProxyAll('stop'); }, reverse: function (el, time) { actionProxy(el, 'reverse', time); }, reverseAll: function (time) { actionProxyAll('reverse', time); }, seek: function (el, time) { actionProxy(el, 'seek', time); }, seekAll: function (time) { actionProxyAll('seek', time); }, setTimeScale: function (el, scale) { actionProxy(el, 'setTimeScale', scale); }, setTimeScaleAll: function (scale) { actionProxyAll('setTimeScale', scale); }, isTweening: function (el) { var _el = getElement(el); _el = _el[0] || _el; var _len = tweens.length; for (var i = _len - 1; i >= 0; i--) { var _tween = tweens[i]; if (_tween.el === _el) return true; } return false; }, call: function (time, callback, params, isPlaying) { return time ? new tween({}, Math.max(0, time), {}, { onEnd: callback, onEndParams: params, isPlaying: isPlaying }, false) : callback.apply(callback, params); }, }); function actionProxy(el, action, params) { var _el = getElement(el); var _len = tweens.length; each(_el, function (index, obj) { for (var i = _len - 1; i >= 0; i--) { var _tween = tweens[i]; if (_tween.el === obj) { _tween[action](params); } } }); } function actionProxyAll(action, params) { var _len = tweens.length; for (var i = _len - 1; i >= 0; i--) { var _tween = tweens[i]; _tween[action](params); } } // --------------------------------------------------------------------bezier Object.assign(JT, { path: function (obj) { checkBezier(obj); var _ease = obj.ease || JT.Linear.None; var _step = obj.step || 1; var _radio, _arr = []; for (var i = 0; i <= _step; i++) { _radio = _ease(i / _step); var _o = {}; for (var j in obj) { if (Array.isArray(obj[j])) { _o[j] = obj.interpolation(obj[j], _radio); } } _arr.push(_o); } return _arr; } }); function checkBezier(obj) { if (obj.bezier) { sortBezier(obj, obj.bezier); obj.interpolation = Bezier; delete obj.bezier; } if (obj.through) { sortBezier(obj, obj.through); obj.interpolation = Through; delete obj.through; } if (obj.linear) { sortBezier(obj, obj.linear); obj.interpolation = Linear; delete obj.linear; } } function sortBezier(el, arr) { for (var i = 0, l = arr.length; i < l; i++) { for (var j in arr[i]) { if (i === 0) { el[j] = [arr[i][j]]; } else { el[j].push(arr[i][j]); } } } } function Linear(v, k) { var m = v.length - 1, f = m * k, i = Math.floor(f), fn = Utils.Linear; if (k < 0) return fn(v[0], v[1], f); if (k > 1) return fn(v[m], v[m - 1], m - f); return fn(v[i], v[i + 1 > m ? m : i + 1], f - i); } function Bezier(v, k) { var b = 0, n = v.length - 1, pw = Math.pow, bn = Utils.Bernstein, i; for (i = 0; i <= n; i++) { b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i); } return b; } function Through(v, k) { var m = v.length - 1, f = m * k, i = Math.floor(f), fn = Utils.Through; if (v[0] === v[m]) { if (k < 0) i = Math.floor(f = m * (1 + k)); return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i); } else { if (k < 0) return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]); if (k > 1) return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]); return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i); } } var Utils = { Linear: function (p0, p1, t) { return (p1 - p0) * t + p0; }, Bernstein: function (n, i) { var fc = Utils.Factorial; return fc(n) / fc(i) / fc(n - i); }, Factorial: (function () { var a = [1]; return function (n) { var s = 1, i; if (a[n]) return a[n]; for (i = n; i > 1; i--) s *= i; return a[n] = s; }; })(), Through: function (p0, p1, p2, p3, t) { var v0 = (p2 - p0) * 0.5, v1 = (p3 - p1) * 0.5, t2 = t * t, t3 = t * t2; return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1; } }; // --------------------------------------------------------------------缓动选项 Object.assign(JT, { Linear: { None: function (k) { return k; } }, Quad: { In: function (k) { return k * k; }, Out: function (k) { return k * (2 - k); }, InOut: function (k) { if ((k *= 2) < 1) return 0.5 * k * k; return -0.5 * (--k * (k - 2) - 1); } }, Cubic: { In: function (k) { return k * k * k; }, Out: function (k) { return --k * k * k + 1; }, InOut: function (k) { if ((k *= 2) < 1) return 0.5 * k * k * k; return 0.5 * ((k -= 2) * k * k + 2); } }, Quart: { In: function (k) { return k * k * k * k; }, Out: function (k) { return 1 - (--k * k * k * k); }, InOut: function (k) { if ((k *= 2) < 1) return 0.5 * k * k * k * k; return -0.5 * ((k -= 2) * k * k * k - 2); } }, Quint: { In: function (k) { return k * k * k * k * k; }, Out: function (k) { return --k * k * k * k * k + 1; }, InOut: function (k) { if ((k *= 2) < 1) return 0.5 * k * k * k * k * k; return 0.5 * ((k -= 2) * k * k * k * k + 2); } }, Sine: { In: function (k) { return 1 - Math.cos(k * Math.PI / 2); }, Out: function (k) { return Math.sin(k * Math.PI / 2); }, InOut: function (k) { return 0.5 * (1 - Math.cos(Math.PI * k)); } }, Expo: { In: function (k) { return k === 0 ? 0 : Math.pow(1024, k - 1); }, Out: function (k) { return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); }, InOut: function (k) { if (k === 0) return 0; if (k === 1) return 1; if ((k *= 2) < 1) return 0.5 * Math.pow(1024, k - 1); return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); } }, Circ: { In: function (k) { return 1 - Math.sqrt(1 - k * k); }, Out: function (k) { return Math.sqrt(1 - (--k * k)); }, InOut: function (k) { if ((k *= 2) < 1) return -0.5 * (Math.sqrt(1 - k * k) - 1); return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); } }, Elastic: { In: function (k) { var s, a = 0.1, p = 0.4; if (k === 0) return 0; if (k === 1) return 1; if (!a || a < 1) { a = 1; s = p / 4; } else s = p * Math.asin(1 / a) / (2 * Math.PI); return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); }, Out: function (k) { var s, a = 0.1, p = 0.4; if (k === 0) return 0; if (k === 1) return 1; if (!a || a < 1) { a = 1; s = p / 4; } else s = p * Math.asin(1 / a) / (2 * Math.PI); return (a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1); }, InOut: function (k) { var s, a = 0.1, p = 0.4; if (k === 0) return 0; if (k === 1) return 1; if (!a || a < 1) { a = 1; s = p / 4; } else s = p * Math.asin(1 / a) / (2 * Math.PI); if ((k *= 2) < 1) return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; } }, Back: { In: function (k) { var s = 1.70158; return k * k * ((s + 1) * k - s); }, Out: function (k) { var s = 1.70158; return --k * k * ((s + 1) * k + s) + 1; }, InOut: function (k) { var s = 1.70158 * 1.525; if ((k *= 2) < 1) return 0.5 * (k * k * ((s + 1) * k - s)); return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); } }, Bounce: { In: function (k) { return 1 - JT.Bounce.Out(1 - k); }, Out: function (k) { if (k < (1 / 2.75)) { return 7.5625 * k * k; } else if (k < (2 / 2.75)) { return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; } else if (k < (2.5 / 2.75)) { return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; } else { return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; } }, InOut: function (k) { if (k < 0.5) return JT.Bounce.In(k * 2) * 0.5; return JT.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; } } }); return JT; })));