jquery-ui/ui/jquery.effects.explode.js

104 lines
2.5 KiB
JavaScript
Raw Normal View History

/*
* jQuery UI Effects Explode @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/Explode
*
* Depends:
* jquery.effects.core.js
*/
(function( $, undefined ) {
2008-06-04 02:34:33 +00:00
$.effects.effect.explode = function( o ) {
2008-06-04 02:34:33 +00:00
return this.queue( function( next ) {
2011-03-06 21:24:24 +00:00
var rows = o.pieces ? Math.round(Math.sqrt(o.pieces)) : 3,
cells = rows,
el = $( this ),
2011-03-06 21:24:24 +00:00
mode = $.effects.setMode( el, o.mode || 'hide' ),
show = ( mode == 'show' ),
// show and then visibility:hidden the element before calculating offset
offset = el.show().css( 'visibility', 'hidden' ).offset(),
// width and height of a piece
width = Math.ceil( el.outerWidth() / cells ),
height = Math.ceil( el.outerHeight() / rows ),
pieces = [],
// loop
i, j, left, top, mx, my;
// clone the element for each row and cell.
for( i = 0; i < rows ; i++ ) { // ===>
top = offset.top + i * height;
my = i - ( rows - 1 ) / 2 ;
for( j = 0; j < cells ; j++ ) { // |||
left = offset.left + j * width;
mx = j - ( cells - 1 ) / 2 ;
// Create a clone of the now hidden main element that will be absolute positioned
// within a wrapper div off the -left and -top equal to size of our pieces
2011-03-06 21:24:24 +00:00
el
.clone()
.appendTo( 'body' )
.wrap( '<div></div>' )
2011-03-06 21:24:24 +00:00
.css({
position: 'absolute',
visibility: 'visible',
left: -j * width,
top: -i * height
2011-03-06 21:24:24 +00:00
})
// select the wrapper - make it overflow: hidden and absolute positioned based on
// where the original was located +left and +top equal to the size of pieces
2011-03-06 21:24:24 +00:00
.parent()
.addClass( 'ui-effects-explode' )
2011-03-06 21:24:24 +00:00
.css({
position: 'absolute',
overflow: 'hidden',
width: width,
height: height,
left: left + ( show ? mx * width : 0 ),
top: top + ( show ? my * height : 0 ),
opacity: show ? 0 : 1
2011-03-06 21:24:24 +00:00
}).animate({
left: left + ( show ? 0 : mx * width ),
top: top + ( show ? 0 : my * height ),
opacity: show ? 1 : 0
}, o.duration || 500, o.easing, childComplete );
2011-03-06 21:24:24 +00:00
}
2008-06-04 02:34:33 +00:00
}
// children animate complete:
function childComplete() {
pieces.push( this );
if ( pieces.length == rows * cells ) {
animComplete();
}
}
function animComplete() {
el.css({
visibility: 'visible'
});
$( pieces ).remove();
if ( !show ) {
el.hide();
}
if ( $.isFunction( o.complete ) ) {
o.complete.apply( el[ 0 ] );
}
next();
}
});
};
})(jQuery);