jquery-ui/ui/jquery.effects.bounce.js

121 lines
3.0 KiB
JavaScript
Raw Normal View History

/*
* jQuery UI Effects Bounce @VERSION
*
2011-01-17 14:13:18 +00:00
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Bounce
*
* Depends:
* jquery.effects.core.js
*/
(function( $, undefined ) {
2008-05-23 09:26:18 +00:00
$.effects.effect.bounce = function(o) {
2008-05-23 09:26:18 +00:00
return this.queue( function( next ) {
2011-03-03 01:46:46 +00:00
var el = $( this ),
props = [ "position", "top", "bottom", "left", "right" ],
2011-03-04 23:10:02 +00:00
// defaults:
mode = $.effects.setMode( el, o.mode || "effect" ),
hide = mode === "hide",
show = mode === "show",
direction = o.direction || "up",
distance = o.distance,
times = o.times || 5,
// number of internal animations
anims = times * 2 + ( show || hide ? 1 : 0 ),
speed = o.duration / anims,
easing = o.easing,
2011-03-04 23:10:02 +00:00
// utility:
ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
motion = ( direction === "up" || direction === "left" ),
i,
upAnim,
downAnim,
// we will need to re-assemble the queue to stack our animations in place
queue = el.queue(),
queuelen = queue.length;
2011-03-04 23:10:02 +00:00
// Avoid touching opacity to prevent clearType and PNG issues in IE
if ( show || hide ) {
props.push( "opacity" );
2011-03-07 00:48:14 +00:00
}
2008-05-23 09:26:18 +00:00
2011-03-07 00:48:14 +00:00
$.effects.save( el, props );
el.show();
$.effects.createWrapper( el ); // Create Wrapper
2011-03-04 23:10:02 +00:00
// default distance for the BIGGEST bounce is the outer Distance / 3
2011-03-04 23:10:02 +00:00
if ( !distance ) {
distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
2011-03-04 23:10:02 +00:00
}
if ( show ) {
downAnim = { opacity: 1 };
downAnim[ ref ] = 0;
// if we are showing, force opacity 0 and set the initial position
// then do the "first" animation
el.css( "opacity", 0 )
.css( ref, motion ? -distance*2 : distance*2 )
.animate( downAnim, speed, easing );
}
// start at the smallest distance if we are hiding
if ( hide ) {
distance = distance / Math.pow( 2, times - 1 );
}
downAnim = {};
downAnim[ ref ] = 0;
// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
for ( i = 0; i < times; i++ ) {
upAnim = {};
upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
// add the finish callback to the last animation if we aren't hiding
el.animate( upAnim, speed, easing )
.animate( downAnim, speed, easing,
( ( i === times - 1 ) && !hide ) ? finish : undefined );
distance = hide ? distance * 2 : distance / 2;
2011-03-07 00:48:14 +00:00
}
// Last Bounce when Hiding
if ( hide ) {
upAnim = { opacity: 0 };
upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
el.animate( upAnim, speed, easing, function(){
2011-03-07 00:48:14 +00:00
el.hide();
finish();
});
}
function finish() {
$.effects.restore( el, props );
$.effects.removeWrapper( el );
if ( o.complete ) {
o.complete.apply( el[ 0 ] );
}
}
// inject all the animations we just queued to be first in line (after "inprogress")
if ( queuelen > 1) {
queue.splice.apply( queue,
[ 1, 0 ].concat( queue.splice( queuelen, anims ) ) );
2011-03-07 00:48:14 +00:00
}
next();
});
};
2008-05-23 09:26:18 +00:00
})(jQuery);