115 lines
2.9 KiB
JavaScript
115 lines
2.9 KiB
JavaScript
/*!
|
|
* jQuery UI Effects Explode 1.13.3
|
|
* https://jqueryui.com
|
|
*
|
|
* Copyright OpenJS Foundation and other contributors
|
|
* Released under the MIT license.
|
|
* https://jquery.org/license
|
|
*/
|
|
|
|
//>>label: Explode Effect
|
|
//>>group: Effects
|
|
/* eslint-disable max-len */
|
|
//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
|
|
/* eslint-enable max-len */
|
|
//>>docs: https://api.jqueryui.com/explode-effect/
|
|
//>>demos: https://jqueryui.com/effect/
|
|
|
|
( function( factory ) {
|
|
"use strict";
|
|
|
|
if ( typeof define === "function" && define.amd ) {
|
|
|
|
// AMD. Register as an anonymous module.
|
|
define( [
|
|
"jquery",
|
|
"../version",
|
|
"../effect"
|
|
], factory );
|
|
} else {
|
|
|
|
// Browser globals
|
|
factory( jQuery );
|
|
}
|
|
} )( function( $ ) {
|
|
"use strict";
|
|
|
|
return $.effects.define( "explode", "hide", function( options, done ) {
|
|
|
|
var i, j, left, top, mx, my,
|
|
rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
|
|
cells = rows,
|
|
element = $( this ),
|
|
mode = options.mode,
|
|
show = mode === "show",
|
|
|
|
// Show and then visibility:hidden the element before calculating offset
|
|
offset = element.show().css( "visibility", "hidden" ).offset(),
|
|
|
|
// Width and height of a piece
|
|
width = Math.ceil( element.outerWidth() / cells ),
|
|
height = Math.ceil( element.outerHeight() / rows ),
|
|
pieces = [];
|
|
|
|
// Children animate complete:
|
|
function childComplete() {
|
|
pieces.push( this );
|
|
if ( pieces.length === rows * cells ) {
|
|
animComplete();
|
|
}
|
|
}
|
|
|
|
// 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
|
|
element
|
|
.clone()
|
|
.appendTo( "body" )
|
|
.wrap( "<div></div>" )
|
|
.css( {
|
|
position: "absolute",
|
|
visibility: "visible",
|
|
left: -j * width,
|
|
top: -i * height
|
|
} )
|
|
|
|
// 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
|
|
.parent()
|
|
.addClass( "ui-effects-explode" )
|
|
.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
|
|
} )
|
|
.animate( {
|
|
left: left + ( show ? 0 : mx * width ),
|
|
top: top + ( show ? 0 : my * height ),
|
|
opacity: show ? 1 : 0
|
|
}, options.duration || 500, options.easing, childComplete );
|
|
}
|
|
}
|
|
|
|
function animComplete() {
|
|
element.css( {
|
|
visibility: "visible"
|
|
} );
|
|
$( pieces ).remove();
|
|
done();
|
|
}
|
|
} );
|
|
|
|
} );
|