/* * jQuery-animations v0.4.3 * https://github.com/emn178/jquery-animations * * Copyright 2014, emn178@gmail.com * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ ;(function($, window, document, undefined) { var animationstart = 'animationstart webkitAnimationStart oAnimationStart'; var animationend = 'animationend webkitAnimationEnd oAnimationEnd'; var animationiteration = 'animationiteration webkitAnimationIteration oAnimationIteration'; var vendorPrefix = ''; $(['WebkitTransform', 'MozTransform', 'msTransform', 'OTransform']).each(function(i, v) { if(v in document.documentElement.style) vendorPrefix = ['-webkit-', '-moz-', '-ms-', '-o-'][i]; }); var testElement = document.createElement('DIV'); testElement.style.display = 'inline-flex'; var supportFlex = testElement.style.display == 'inline-flex'; testElement = null; var firefox = navigator.userAgent.toLowerCase().indexOf('firefox') != -1; var id = 0; var taskId = 0; var observations = []; function Action(elements, animations, options) { this.elements = elements; this.animations = animations; this.options = options; } Action.prototype.start = function() { this.prepare(); if(this.jobsOptions.length == 0) { if(this.shortcuts.length > 0) { this.shortcuts[0].prepare = [this.taskOptions.prepare, this.shortcuts[0].prepare]; this.shortcuts[0].start = [this.taskOptions.start, this.shortcuts[0].start]; this.shortcuts[0].complete = [this.taskOptions.complete, this.shortcuts[0].complete]; this.shortcuts[0].always = [this.taskOptions.always, this.shortcuts[0].always]; this.shortcuts[0].fail = [this.taskOptions.fail, this.shortcuts[0].fail]; this.shortcuts[0].end = [this.taskOptions.end, this.shortcuts[0].end]; this.shortcuts[0].clear = [this.taskOptions.clear, this.shortcuts[0].clear]; } } else { this.elements.each(function(i, element) { new Task(element, this.taskOptions, this.jobsOptions).start(); }.bind(this)); } for(var i = 0;i < this.shortcuts.length;++i) animate.call(this.elements, this.shortcuts[i].shortcut, this.shortcuts[i]); }; Action.prototype.prepare = function() { this.taskOptions = $.extend({}, this.options); delete this.taskOptions.prepare; delete this.taskOptions.start; delete this.taskOptions.complete; delete this.taskOptions.always; delete this.taskOptions.fail; delete this.taskOptions.end; delete this.taskOptions.clear; this.jobsOptions = []; this.shortcuts = []; var custom = this.taskOptions.custom || {}; for(var i = 0;i < this.animations.length;++i) { // prepare options var animation = this.animations[i]; var options; if(animation.shortcut) { options = $.extend({}, this.taskOptions, animation, custom[animation.id]); this.taskOptions.combinable = true; options.combinable = true; options.shortcut = animation.shortcut; this.shortcuts.push(options); continue; } options = $.extend({}, this.taskOptions, custom[animation.id]); options.id = animation.id; options.duration = options.duration || animation.duration || 400; options.direction = calculateDirection(animation.direction, options.direction); options.easing = options.easing || animation.easing || 'ease'; options.delay = options.delay || animation.delay || 0; options.repeat = options.repeat || animation.repeat || 1; options.fillMode = options.fillMode || animation.fillMode || 'none'; options.timeout = options.timeout || animation.timeout || 500; options.prepare = [options.prepare, animation.prepare]; options.start = [options.start, animation.start]; options.complete = [animation.complete, options.complete]; options.always = [animation.always, options.always]; options.fail = [animation.fail, options.fail]; options.end = [animation.end, options.end]; options.clear = [animation.clear, options.clear]; options.resize = animation.resize; options.name = animation.name; options.keyframes = animation.keyframes; options.emptyAnimation = animation.emptyAnimation; options.wrap = animation.wrap || options.wrap; options.variables = {}; for(var variableName in animation.variables) { options.variables[variableName] = options[variableName]; if(options[variableName] === undefined) options.variables[variableName] = animation.variables[variableName]; } this.jobsOptions.push(options); } this.taskOptions.prepare = this.options.prepare; this.taskOptions.start = this.options.start; this.taskOptions.complete = this.options.complete; this.taskOptions.always = this.options.always; this.taskOptions.fail = this.options.fail; this.taskOptions.end = this.options.end; this.taskOptions.clear = this.options.clear; if(this.taskOptions.autoWrap === undefined) this.taskOptions.autoWrap = true; }; function Task(element, options, jobsOptions) { this.taskId = taskId++; this.element = $(element); this.options = options; this.options.element = this.element; this.options.originalElement = this.element; this.jobsOptions = jobsOptions; this.reset = true; this.started = false; this.counter = { complete: 0, fail: 0, always: 0 }; } Task.prototype.start = function() { this.element.reset(); this.combine(); var tasks = parseInt(this.element.attr('animation-tasks')) || 0; if(tasks == 0) this.cleaner = true; this.element.attr('animation-tasks', tasks + 1); addTaskId(this.element, this.taskId); if(!this.options.derivative && !this.element.attr('animation-wrapper')) { this.styleState = $.saveStyle(this.element, ['marginLeft', 'marginRight', 'marginTop', 'marginBottom', 'width', 'height', 'display', 'position', 'top', 'right', 'bottom', 'left']); this.styleState2 = $.saveStyle(this.element.children().first(), ['marginTop']); } this.ontasksend = this.ontasksend.bind(this); this.onstart = this.onstart.bind(this); this.oncancel = this.oncancel.bind(this); this.onfinish = this.onfinish.bind(this); this.onresize = this.onresize.bind(this); this.onremove = this.onremove.bind(this); this.element.on('animationtasksend', this.ontasksend); this.element.on('animationcancel', this.oncancel); this.element.on('animationfinish', this.onfinish); this.element.on('animationresize', this.onresize); this.element.on('remove', this.onremove); callback(this.options.prepare, this.element[0], [this.options]); this.actor = this.element; this.jobs = []; this.jobsOptions.sort(function(a, b) { return a.wrap ? -1 : (b.wrap ? 1 : 0); }); if(!this.options.autoWrap) this.combineOptions(); var css = ''; for(var i = 0;i < this.jobsOptions.length;++i) { var options = $.extend({}, this.jobsOptions[i]); var logs = []; if(this.options.combinable || i > 0) { var element = this.actor; this.actor = wrap(this.actor); logs.push({element: element, wrapper: this.actor}); } if(options.fillMode == 'forwards' || options.fillMode == 'both') this.reset = false; if(options.wrap) { options.wrapper = wrap(this.actor); logs.push({element: this.actor, wrapper: options.wrapper}); } var preparesOptions = options.combinedJobs || [options]; for(var j = 0;j < preparesOptions.length;++j) { var prepareOptions = preparesOptions[j]; prepareOptions.variables = $.extend({}, prepareOptions.variables); callback(prepareOptions.prepare, this.actor[0], [prepareOptions]); if(prepareOptions.keyframes) { prepareOptions.name = 'a' + ++id; prepareOptions.keyframeCss = generateKeyframeCss({ name: prepareOptions.name, keyframes: prepareOptions.keyframes, variables: prepareOptions.variables }); css += prepareOptions.keyframeCss; } } options.start = [options.start, this.onstart.bind(this)]; options.complete = [options.complete, this.oncomplete.bind(this)]; options.fail = [options.fail, this.onfail.bind(this)]; options.always = [options.always, this.onalways.bind(this)]; options.originalElement = this.element; options.element = this.actor; var job = new Job(this.actor, options); job.logs = logs; this.jobs.push(job); if(options.wrap) this.actor = options.wrapper; } if(css) { this.style = $(''); this.style.html(css); $('head').append(this.style); } for(var i = 0;i < this.jobs.length;++i) this.jobs[i].start(); this.actor.find('[animation-prepare]').each(function() { var element = $(this); element.vendorCss('animation', element.attr('animation-prepare')); element.removeAttr('animation-prepare'); }); }; Task.prototype.combine = function() { var animating = this.element.attr('animation-tasks'); if(!animating) { if(this.options.combinable) this.element.attr('animation-combinable', 1); return; } if(!this.options.combinable) { this.element.trigger('animationcancel'); return; } var previousCombinable = this.element.attr('animation-combinable'); if(previousCombinable) return; this.element.trigger('animationcancel'); this.element.attr('animation-combinable', 1); }; Task.prototype.combineOptions = function() { var newJobsOptions = []; var combinedOptions = []; for(var i = 0;i < this.jobsOptions.length;++i) { var jobOptions = this.jobsOptions[i]; if(isCombiableOptions(jobOptions)) combinedOptions.push(jobOptions); else newJobsOptions.push(jobOptions); } if(combinedOptions.length > 0) { var first = combinedOptions[0]; first.combinedJobs = combinedOptions; newJobsOptions.push(first); } this.jobsOptions = newJobsOptions; }; Task.prototype.onresize = function(e) { e.stopPropagation(); if(!this.options.derivative) { $.restoreStyle(this.element, this.styleState); $.restoreStyle(this.element.children().first(), this.styleState2); } var changed = false; var css = ''; for(var i = 0;i < this.jobs.length;++i) { var job = this.jobs[i]; for(var j = 0;j < job.logs.length;++j) { var log = job.logs[j]; formatStyle(log.element, log.wrapper); } job.resize(); var preparesOptions = job.preparesOptions; for(var j = 0;j < preparesOptions.length;++j) { var prepareOptions = preparesOptions[j]; if(prepareOptions.keyframes) { var keyframeCss = generateKeyframeCss({ name: prepareOptions.name, keyframes: prepareOptions.keyframes, variables: prepareOptions.variables }); css += keyframeCss; if(prepareOptions.keyframeCss != keyframeCss) { job.refresh(prepareOptions.name); prepareOptions.keyframeCss = keyframeCss; changed = true; } } } } if(changed && this.style) this.style.html(css); }; Task.prototype.onstart = function() { if(this.started) return; this.started = true; callback(this.options.start, this.element[0], [this.options]); }; Task.prototype.oncomplete = function() { ++this.counter.complete; }; Task.prototype.onfail = function() { ++this.counter.fail; }; Task.prototype.onalways = function() { ++this.counter.always; if(!this.isDone()) return; if(this.counter.complete > 0) callback(this.options.complete, this.element[0], [this.options]); if(this.counter.fail == this.counter.always) callback(this.options.fail, this.element[0], [this.options]); callback(this.options.always, this.element[0], [this.options]); var tasks = parseInt(this.element.attr('animation-tasks')); if(tasks == 1 && !this.hasOtherTasks()) { this.element.removeAttr('animation-tasks'); this.element.trigger('animationtasksend'); } else this.element.attr('animation-tasks', tasks - 1); }; Task.prototype.ontasksend = function() { if(!this.isDone()) return; this.element.off('animationtasksend', this.onend); this.element.off('animationcancel', this.oncancel); this.element.off('animationfinish', this.onfinish); this.element.removeAttr('animation-combinable'); if(!this.options.derivative && (this.reset || this.counter.fail == this.counter.always)) this.clear(); else { this.element.attr('animation-resetable', 1); this.onreset = this.onreset.bind(this); this.element.on('animationreset animationcancel animationfinish', this.onreset); } for(var i = 0;i < this.jobs.length;++i) this.jobs[i].end(); callback(this.options.end, this.element[0], [this.options]); }; Task.prototype.oncancel = function(e) { if(e.target != this.element[0]) e.stopPropagation(); }; Task.prototype.onfinish = function(e) { if(e.target != this.element[0]) e.stopPropagation(); }; Task.prototype.onreset = function(e) { e.stopPropagation(); if(e.target != this.element[0]) return; this.element.off('animationreset', this.onreset); this.element.off('animationcancel', this.onreset); this.element.off('animationfinish', this.onreset); this.element.removeAttr('animation-resetable'); this.clear(); }; Task.prototype.onremove = function(e) { if(this.style) this.style.remove(); }; Task.prototype.isDone = function() { return this.counter.always == this.jobsOptions.length }; Task.prototype.hasOtherTasks = function() { return this.element.find('[animation-tasks]').length > 0; }; Task.prototype.clear = function() { this.element.off('animationresize', this.onresize); this.element.off('remove', this.onremove); removeTaskId(this.element, this.taskId); this.element.removeAttr('animation-display'); this.element.vendorCss('animation', ''); if(this.style) this.style.remove(); if(!this.cleaner) return; for(var i = 0;i < this.jobs.length;++i) this.jobs[i].clear(); callback(this.options.clear, this.element[0], [this.options]); var wrapper = this.actor; while(wrapper.parent().attr('animation-wrapper') == 1) wrapper = wrapper.parent(); if(wrapper != this.element) { var inner = this.element; while(!inner.parent().attr('animation-wrapper')) inner = inner.parent(); wrapper.replaceWith(inner); } $.restoreStyle(this.element, this.styleState); $.restoreStyle(this.element.children().first(), this.styleState2); }; function Job(element, options) { this.element = $(element); this.options = options; this.updateAnimations = {}; this.prepare(); this.counter = { complete: 0, fail: 0, always: 0, start: 0 }; } Job.prototype.start = function() { var options = this.options; var element = this.element; this.onstart = this.onstart.bind(this); this.onfail = this.onfail.bind(this); this.oncancel = this.oncancel.bind(this); this.onfinish = this.onfinish.bind(this); element.on(animationstart, this.onstart); element.on('animationfail', this.onfail); element.on('animationcancel', this.oncancel); element.on('animationfinish', this.onfinish); if(options.emptyAnimation) { for(var i = 0;i < this.preparesOptions.length;++i) { var prepareOptions = this.preparesOptions[i]; this.startTimer = setTimeout(this.execStart.bind(this), prepareOptions.delay); var repeat = parseInt(prepareOptions.repeat); if(!isNaN(repeat)) { this.endTimer = setTimeout(function() { this.finish(true); }.bind(this), prepareOptions.delay + prepareOptions.duration * repeat); } } } else { element.vendorCss('animation', element.attr('animation-prepare')); element.removeAttr('animation-prepare'); this.onend = this.onend.bind(this); this.oniteration = this.oniteration.bind(this); element.on(animationend, this.onend); element.on(animationiteration, this.oniteration); for(var i = 0;i < this.preparesOptions.length;++i) observe(element, new Date().getTime() + this.preparesOptions[i].delay + this.preparesOptions[i].timeout); } }; Job.prototype.prepare = function() { this.preparesOptions = this.options.combinedJobs || [this.options]; for(var i = 0;i < this.preparesOptions.length;++i) this.preparesOptions[i].remainingRepeat = this.preparesOptions[i].repeat; this.combinedCount = this.preparesOptions.length; this.element.attr('animation-prepare', this.generateAnimationCss(this.preparesOptions)); }; Job.prototype.generateAnimationCss = function(preparesOptions) { var properties = []; for(var i = 0;i < preparesOptions.length;++i) { var options = preparesOptions[i]; properties.push([ options.name, options.duration / 1000 + 's', options.easing, options.delay / 1000 + 's', options.remainingRepeat, options.direction, options.fillMode ].join(' ')); } return properties.join(','); }; Job.prototype.onstart = function(e) { e.stopPropagation(); this.execStart(); }; Job.prototype.execStart = function() { ++this.counter.start; if(this.combinedCount == this.counter.start) unobserve(this.element); callback(this.options.start, this.element[0], [this.options]); }; Job.prototype.onfail = function(e) { e.stopPropagation(); ++this.counter.always; ++this.counter.fail; if(this.combinedCount == this.counter.always) { if(this.counter.fail == this.counter.always) this.finish(false); else this.finish(true); } }; Job.prototype.oncancel = function(e) { this.finish(false); }; Job.prototype.onend = function(e) { e.stopPropagation(); ++this.counter.always; ++this.counter.complete; if(this.combinedCount == this.counter.always) this.finish(true); }; Job.prototype.oniteration = function(e) { e.stopPropagation(); var animationName = e.originalEvent.animationName; var tempOptions = [] for(var i = 0;i < this.preparesOptions.length;++i) { var options = this.preparesOptions[i]; if(options.name != animationName) { tempOptions.push(options); continue; } if(options.remainingRepeat != 'infinite') --options.remainingRepeat; } if(!this.updateAnimations[animationName]) return; this.updateAnimations[animationName] = false; var element = this.element; element.vendorCss('animation', this.generateAnimationCss(tempOptions)); setTimeout(function() { element.vendorCss('animation', this.generateAnimationCss(this.preparesOptions)); }.bind(this), 1); }; Job.prototype.onfinish = function(e) { this.finish(true); }; Job.prototype.finish = function(success) { var options = this.options; var element = this.element; element.off(animationstart, this.onstart); element.off(animationend, this.onend); element.off(animationiteration, this.oniteration); element.off('animationfail', this.onfail); element.off('animationcancel', this.oncancel); element.off('animationfinish', this.onfinish); if(this.startTimer) clearTimeout(this.startTimer); if(this.endTimer) clearTimeout(this.endTimer); callback(success ? options.complete : options.fail, this.element[0], [options]); callback(options.always, this.element[0], [this.options]); }; Job.prototype.end = function() { callback(this.options.end, this.element[0], [this.options]); }; Job.prototype.clear = function() { callback(this.options.clear, this.element[0], [this.options]); }; Job.prototype.resize = function() { callback(this.options.resize, this.element[0], [this.options]); }; Job.prototype.refresh = function(animationName) { this.updateAnimations[animationName] = true; }; var directions = { 'alternate-reverse': -2, 'reverse': -1, 'normal': 1, 'alternate': 2 }; function calculateDirection(direction1, direction2) { direction1 = direction1 || 'normal'; direction2 = direction2 || 'normal'; switch(directions[direction1] * directions[direction2]) { case -2: case -4: return 'alternate-reverse'; case -1: return 'reverse'; case 2: return 'alternate'; case 1: return 'normal'; default: return direction1; } } function checkFail() { var remains = []; var now = new Date().getTime(); for(var i = 0;i < observations.length;++i) { var observation = observations[i]; var deadline = observation.attr('animation-deadline'); if(!deadline) continue; var deadlines = deadline.split(','); var result = []; for(var j = 0;j < deadlines.length;++j) { deadline = parseInt(deadlines[j]); if(now > deadline) observation.trigger('animationfail'); else result.push(deadline); } if(result.length == 0) observation.removeAttr('animation-deadline'); else { observation.attr('animation-deadline', result.join(',')); remains.push(observation); } } observations = remains; } function observe(element, deadline) { var pre = element.attr('animation-deadline'); if(pre) deadline = pre + ',' + deadline; element.attr('animation-deadline', deadline); observations.push(element); } function unobserve(element) { element.removeAttr('animation-deadline'); } function isCombiableOptions(options) { return !options.wrap && !options.emptyAnimation && isEmptyCallbacks(options.start) && isEmptyCallbacks(options.complete) && isEmptyCallbacks(options.always) && isEmptyCallbacks(options.fail) && isEmptyCallbacks(options.end) && isEmptyCallbacks(options.clear) && isEmptyCallbacks(options.reset); } function isEmptyCallbacks(callbacks) { if(!$.isArray(callbacks)) return !$.isFunction(callbacks); for(var i = 0;i < callbacks.length;++i) if(!isEmptyCallbacks(callbacks[i])) return false; return true; } function callback(callbacks, thisArg, argsArray) { if(!$.isArray(callbacks)) callbacks = [callbacks]; for(var i = 0;i < callbacks.length;++i) { if($.isFunction(callbacks[i])) callbacks[i].apply(thisArg, argsArray); else if($.isArray(callbacks[i])) callback(callbacks[i], thisArg, argsArray); } } function wrap(element) { var wrapper = $(''); formatStyle(element, wrapper); element.wrap(wrapper); return element.parent(); } function formatStyle(element, wrapper) { if(wrapper.attr('animation-display')) wrapper.css('display', wrapper.attr('animation-display')); else { var display = element.attr('animation-display') || element.css('display'); element.attr('animation-display', display); if(display == 'inline') { if(supportFlex) display = 'inline-flex'; else display = 'inline-block'; } wrapper.css('display', display); } wrapper.attr('animation-wrapper', 1); if(element.css('float') != 'none') wrapper.css('float', element.css('float')); var margin = { 'margin-left': element.css('margin-left'), 'margin-right': element.css('margin-right'), 'margin-top': element.css('margin-top'), 'margin-bottom': element.css('margin-bottom'), 'width': element.outerWidth(), 'height': element.outerHeight() }; if(firefox) { var rect = element[0].getBoundingClientRect(); element.css('margin', 0); var rect2 = element[0].getBoundingClientRect(); if(margin['margin-left'] == '0px') margin['margin-left'] = rect.left - rect2.left; } element.css({ width: element.width(), height: element.height(), margin: 0 }); wrapper.css(margin); if(!element.attr('animation-wrapper')) element.children().first().css('margin-top', 0); if(element.css('position') != 'static') { wrapper.css('position', element.css('position')); wrapper.css('z-index', element.css('z-index')); wrapper.css('left', element.css('left')); wrapper.css('right', element.css('right')); wrapper.css('top', element.css('top')); wrapper.css('bottom', element.css('bottom')); element.css('position', 'relative'); element.css('left', '0'); element.css('top', '0'); element.css('right', ''); element.css('bottom', ''); } } function saveStyle(element, properties) { element = $(element)[0]; if(!element) return; var style = {}; for(var i = 0;i < properties.length;++i) style[properties[i]] = element.style[properties[i]]; return style; } function restoreStyle(element, style) { element = $(element)[0]; if(!element) return; for(var propertyName in style) element.style[propertyName] = style[propertyName]; } function addTaskId(element, taskId) { var taskIds = getTaskIds(element); taskIds.push(taskId); element.attr('animation-tasksIds', taskIds.join(',')); } function removeTaskId(element, taskId) { var taskIds = getTaskIds(element).filter(function(id) { return id != taskId; }); var attr = taskIds.join(','); if(attr) element.attr('animation-tasksIds', attr); else element.removeAttr('animation-tasksIds'); } function getTaskIds(element) { var taskIds = element.attr('animation-tasksIds'); return taskIds ? taskIds.split(',') : []; } function generateKeyframeCss(options) { return generateKeyframeCssByPrefix('', options) + generateKeyframeCssByPrefix(vendorPrefix, options); } function generateKeyframeCssByPrefix(prefix, options) { var css = '@'; css += prefix + 'keyframes ' + options.name + '{'; for(var selector in options.keyframes) { var keyframe = options.keyframes[selector]; css += selector + '{'; for(var propertyName in keyframe) { var property = keyframe[propertyName]; if(typeof property == 'string') { for(var variableName in options.variables) { var reg = new RegExp('\\${' + variableName + '}', 'g'); property = property.replace(reg, options.variables[variableName]); } } css += propertyName + ':' + property + ';'; css += prefix + propertyName + ':' + property + ';'; } css += '}'; } css += '}'; return css; } function defineAnimation(name, keyframes) { var css = generateKeyframeCss({ name: name, keyframes: keyframes }); $('head').append($('').append(css)); } function animate(animationIds, options) { var animations = []; animationIds = animationIds.split(' '); for(var i = 0;i < animationIds.length;++i) { var id = animationIds[i]; if(!id) continue; var animation = $.animations[id]; if(!animation) animation = {name: id}; animation.id = id; animations.push(animation); } new Action(this, animations, options || {}).start(); } var exclusions = ['id', 'prepare', 'start', 'complete', 'always', 'fail', 'end', 'clear', 'resize', 'reset', 'name', 'keyframes', 'emptyAnimation', 'wrap', 'combinable', 'wrapper', 'element', 'originalElement', 'prepareOptions']; function cloneBasicOptions(options) { var cloneOptions = $.extend({}, options); exclusions.forEach(function(key) { delete cloneOptions[key]; }); return cloneOptions; } $.animations = {}; $.wrap = wrap; $.defineAnimation = defineAnimation; $.saveStyle = saveStyle; $.restoreStyle = restoreStyle; $.cloneBasicOptions = cloneBasicOptions; $.resizeDebouncing = 150; var origAnimate = $.fn.animate; $.fn.animate = function(param1, param2) { if(typeof param1 == 'string') animate.call(this, param1, param2); else if(typeof param1 == 'object' && param1.keyframes) { var options = $.cloneBasicOptions(param1); delete options.direction; new Action(this, [param1], options).start(); } else return origAnimate.apply(this, arguments); return this; }; var origStop = $.fn.stop; $.fn.stop = function() { if(arguments.length == 0) this.trigger('animationcancel'); return origStop.apply(this, arguments); }; var origFinish = $.fn.finish; $.fn.finish = function() { if(arguments.length == 0) this.trigger('animationfinish'); return origFinish.apply(this, arguments); }; $.fn.reset = function() { if(this.attr('animation-resetable')) return this.trigger('animationreset'); return this; }; $.fn.vendorCss = function(propertyName, value) { if(value === undefined) return this.css(vendorPrefix + propertyName) || this.css(propertyName); else { this.css(propertyName, value); return this.css(vendorPrefix + propertyName, value); } }; $.event.special.remove = { remove: function(o) { if (o.handler) { o.handler() } } }; var resizeTimer; function resize() { if(resizeTimer) { clearTimeout(resizeTimer); resizeTimer = null; } resizeTimer = setTimeout(function() { $('[animation-wrapper]').css({ display: '', width: '', height: '', 'float': '', position: '', margin: '' }); var tasks = []; var ids = {}; $('[animation-tasksIds]').each(function(){ var element = $(this); var taskIds = getTaskIds(element); for(var i = 0;i < taskIds.length;++i) { var id = taskIds[i]; if(ids[id]) continue; ids[id] = true; tasks.push({id: id, element: element}); } }); tasks = tasks.sort(function(a, b) { return a.id - b.id; }); for(var i = 0;i < tasks.length;++i) tasks[i].element.trigger('animationresize'); }, $.resizeDebouncing); } $(window).resize(resize); var timer = setInterval(checkFail, 100); })(jQuery, window, document); ;;(function($, window, document, undefined) { var keyframes = { '0%, 20%, 50%, 80%, 100%': { transform: 'translateY(0)' }, '40%': { transform: 'translateY(${strength1}px)' }, '60%': { transform: 'translateY(${strength2}px)' } }; $.animations['bounce'] = { duration: 1000, keyframes: keyframes, variables: { strength: 20 }, prepare: function(options) { var strength = options.variables.strength; if(!$.isNumeric(options.variables.strength)) strength = 20; options.variables.strength1 = -strength * 2; options.variables.strength2 = -strength; } }; })(jQuery, window, document); ;;(function($, window, document, undefined) { $.defineAnimation('fadeIn', { from: { opacity: 0 }, to: { opacity: 1 } }); var animation = { name: 'fadeIn', duration: 1000, easing: 'linear' }; $.animations['fadeIn'] = animation; $.animations['fadeOut'] = $.extend({ direction: 'reverse' }, animation); })(jQuery, window, document); ;;(function($, window, document, undefined) { var keyframes = { from: { transform: 'rotate${axis}(${startDeg}deg)', 'transform-origin': '${startOrigin}' }, to: { transform: 'rotate${axis}(${endDeg}deg)', 'transform-origin': '${endOrigin}' } }; var animation = { duration: 1000, wrap: true, keyframes: keyframes, variables: { startDeg: 0, endDeg: 360, startOrigin: '50% 50% 0', endOrigin: '50% 50% 0', perspective: 1000, perspectiveOrigin: '50% 50%' }, prepare: function(options) { options.variables.axis = options.id.match(/flip(.*)$/)[1]; $(this).vendorCss('transform-style', 'preserve-3d'); options.wrapper.vendorCss('perspective', options.variables.perspective); options.wrapper.vendorCss('perspective-origin', options.variables.perspectiveOrigin); } }; ['flipX', 'flipY'].forEach(function(name) { $.animations[name] = $.extend({}, animation); }); })(jQuery, window, document); ;;(function($, window, document, undefined) { var keyframes = { from: { transform: 'translate(${x}px,${y}px)' }, to: { transform: 'translate(0)' } }; var baseAnimation = { duration: 1000, keyframes: keyframes }; (function() { function setVariables(options, distance) { options.variables.x = 0; options.variables.y = 0; switch(options.variables.direction) { case 'up': options.variables.y = -distance || -documentHeight; break; case 'down': options.variables.y = distance || documentHeight; break; case 'left': options.variables.x = -distance || -documentWidth; break; case 'right': options.variables.x = distance || documentWidth; break; } } var animation = $.extend({}, baseAnimation, { variables: { distance: null }, prepare: function(options) { var variables = options.variables; var distance; if(variables.distance && $.isNumeric(variables.distance)) distance = variables.distance; else options.auto = true; variables.direction = options.id.match(/(From|To)(.*)$/)[2].toLowerCase(); setVariables(options, distance); }, resize: function(options) { if(!options.auto || options.remainingRepeat == 1) return; setVariables(options, 0); } }); ['flyFromUp', 'flyFromDown', 'flyFromRight', 'flyFromLeft', 'flyToUp', 'flyToDown', 'flyToRight', 'flyToLeft'].forEach(function(name) { $.animations[name] = $.extend({}, animation); if(name.indexOf('To') != -1) $.animations[name].direction = 'reverse'; }); }()); (function() { var animation = $.extend({}, baseAnimation, { variables: { x: 0, y: 0, relative: false }, prepare: function(options) { var variables = options.variables; var position = $(this).position(); if(!$.isNumeric(variables.x)) variables.x = 0; if(!$.isNumeric(variables.y)) variables.y = 0; if(!variables.relative) { var position = $(this).position(); variables.x -= position.left; variables.y -= position.top; } } }); ['flyFrom', 'flyTo'].forEach(function(name) { $.animations[name] = $.extend({}, animation); if(name.indexOf('To') != -1) $.animations[name].direction = 'reverse'; }); }()); (function() { function setVariables(options) { var deg = options.variables.degree; var theta = deg * Math.PI / 180; var x = documentWidth; var y = documentHeight; if(deg > 180) y = -y; if(deg > 90 && deg < 270) x = -x; if(deg == 0 || deg == 180) y = 0; else if(deg == 90 || deg == 270) x = 0; else { var cos = Math.cos(theta); var sin = Math.sin(theta); var r1 = x / cos; var r2 = y / sin; if(r1 < r2) y = sin * r1; else x = cos * r2; } options.variables.x = x; options.variables.y = -y; } var animation = $.extend({}, baseAnimation, { variables: { degree: null }, prepare: function(options) { if(!$.isNumeric(options.variables.degree)) options.variables.degree = Math.random() * 360; options.variables.degree %= 360; if(options.variables.degree < 0) options.variables.degree += 360; setVariables(options); }, resize: function(options) { if(options.remainingRepeat == 1) return; setVariables(options); } }); ['flyIn', 'flyOut'].forEach(function(name) { $.animations[name] = $.extend({}, animation); if(name == 'flyOut') $.animations[name].direction = 'reverse'; }); }()); var documentWidth, documentHeight; function resize() { documentWidth = $(document).width(); documentHeight = $(document).height(); } $(window).resize(resize); $(document).ready(resize); })(jQuery, window, document); ;;(function($, window, document, undefined) { var keyframes = { from: { transform: 'rotate(${startDeg}deg)', 'transform-origin': '${startOrigin}' }, to: { transform: 'rotate(${endDeg}deg)', 'transform-origin': '${endOrigin}' } }; $.animations['rotate'] = { duration: 1000, keyframes: keyframes, variables: { startDeg: 0, endDeg: 360, startOrigin: '50% 50% 0', endOrigin: '50% 50% 0' } }; })(jQuery, window, document); ;;(function($, window, document, undefined) { var keyframes = { '0%, 100%': { transform: 'translateX(0)' }, '10%, 30%, 50%, 70%, 90%': { transform: 'translateX(${strength1}px)' }, '20%, 40%, 60%, 80%': { transform: 'translateX(${strength2}px)' } }; $.animations['shake'] = { duration: 1000, keyframes: keyframes, variables: { strength: 10 }, prepare: function(options) { var strength = options.variables.strength; if(!$.isNumeric(options.variables.strength)) strength = 10; options.variables.strength1 = -strength; options.variables.strength2 = strength; } }; })(jQuery, window, document); ;;(function($, window, document, undefined) { var keyframes = { from: { transform: 'translate${axis}(${distance}px)' }, to: { transform: 'translate${axis}(0)' } }; function setVariables(options, element, distance) { var w = element.outerWidth(); var h = element.outerHeight(); switch(options.variables.direction) { case 'up': options.variables.axis = 'Y'; options.variables.distance = -distance || -h; break; case 'down': options.variables.axis = 'Y'; options.variables.distance = distance || h; break; case 'left': options.variables.axis = 'X'; options.variables.distance = -distance || -w; break; case 'right': options.variables.axis = 'X'; options.variables.distance = distance || w; break; } } var animation = { duration: 1000, keyframes: keyframes, wrap: true, variables: { distance: null }, prepare: function(options) { var variables = options.variables; var distance; if(variables.distance && $.isNumeric(variables.distance)) distance = variables.distance; else options.auto = true; options.variables.direction = options.id.match(/(From|To)(.*)$/)[2].toLowerCase(); setVariables(options, $(this), distance); options.wrapper.css('overflow', 'hidden'); }, resize: function(options) { if(!options.auto || options.remainingRepeat == 1) return; setVariables(options, $(this), 0); } }; ['slideFromUp', 'slideFromDown', 'slideFromRight', 'slideFromLeft', 'slideToUp', 'slideToDown', 'slideToRight', 'slideToLeft'].forEach(function(name) { $.animations[name] = $.extend({}, animation); if(name.indexOf('To') != -1) $.animations[name].direction = 'reverse'; }); })(jQuery, window, document); ;;(function($, window, document, undefined) { var keyframes = { from: { 'transform-origin': '${startOrigin}' }, to: { transform: 'scale(${x},${y})', 'transform-origin': '${endOrigin}' } }; var baseAnimation = { duration: 1000, keyframes: keyframes }; (function() { var animation = $.extend({ variables: { startOrigin: '50% 50% 0', endOrigin: '50% 50% 0' }, prepare: function(options) { options.variables.x = 0; options.variables.y = 0; } }, baseAnimation); $.animations['zoomAway'] = animation; $.animations['zoomNear'] = $.extend({direction: 'reverse'}, animation); }()); (function() { var animation = $.extend({ variables: { scale: 1.2, startOrigin: '50% 50% 0', endOrigin: '50% 50% 0' }, prepare: function(options) { options.variables.x = options.variables.scale; options.variables.y = options.variables.scale; } }, baseAnimation); $.animations['zoomIn'] = animation; $.animations['zoomOut'] = $.extend({direction: 'reverse'}, animation); }()); (function() { var animation = $.extend({ variables: { x: 1, y: 1, startOrigin: '50% 50% 0', endOrigin: '50% 50% 0' } }, baseAnimation); $.animations['scaleTo'] = animation; $.animations['scaleFrom'] = $.extend({direction: 'reverse'}, animation); }()); })(jQuery, window, document);