Effects.scale: Update the position of the element post animation to avoid jumping - Fixed #4316 - Element jumps to wrong position after scale effect with origin: ['middle','center'] parameter

This commit is contained in:
gnarf 2011-06-13 13:02:16 -05:00
parent b0182d7822
commit c1f71f1c2f

View File

@ -118,8 +118,11 @@ $.effects.effect.size = function( o ) {
mode = $.effects.setMode( el, o.mode || 'effect' ), mode = $.effects.setMode( el, o.mode || 'effect' ),
restore = o.restore || mode !== "effect", restore = o.restore || mode !== "effect",
scale = o.scale || 'both', scale = o.scale || 'both',
origin = o.origin, origin = o.origin || [ "middle", "center" ],
original, baseline, factor; original, baseline, factor,
position = el.css( "position" ),
originalVerticalPositioning = el.css( "bottom" ) !== "auto" ? "bottom" : "top";
originalHorizontalPositioning = el.css( "right" ) !== "auto" ? "right" : "left";
if ( mode === "show" ) { if ( mode === "show" ) {
el.show(); el.show();
@ -250,6 +253,46 @@ $.effects.effect.size = function( o ) {
el.hide(); el.hide();
} }
$.effects.restore( el, restore ? props : props1 ); $.effects.restore( el, restore ? props : props1 );
// we need to recalculate our positioning based on the new scaling
if ( position === "static" ) {
el.css({
position: "relative",
top: el.to.top,
left: el.to.left
});
} else {
$.each([ originalVerticalPositioning, originalHorizontalPositioning ], function( idx, pos ) {
el.css( pos, function( _, str ) {
var val = parseInt( str, 10 ),
toRef = idx ? el.to.left : el.to.top,
delta = idx ? el.to.outerWidth - el.from.outerWidth: el.to.outerHeight - el.from.outerHeight,
same = origin[ idx ] === pos,
mid = origin[ idx ] === "middle" || origin[ idx ] === "center",
direction = pos == "left" || pos == "top";
// if original was "auto", recalculate the new value from wrapper
if ( str === "auto" ) {
return toRef + "px";
}
// if not setting left or top
if ( !direction ) {
// if the position is relative, bottom/right are reversed meaning
if ( position === "relative" ) {
toRef *= -1;
// otherwise, if its NOT a midpoint origin, compensate for the outerWidth difference
} else if ( !mid ) {
toRef -= delta * ( same ? -1 : 1 );
}
}
return val + toRef + "px";
});
});
}
$.effects.removeWrapper( el ); $.effects.removeWrapper( el );
$.isFunction( o.complete ) && o.complete.apply( this, arguments ); // Callback $.isFunction( o.complete ) && o.complete.apply( this, arguments ); // Callback
el.dequeue(); el.dequeue();