| define( [ | |
| "../core", | |
| "../var/rcssNum" | |
| ], function( jQuery, rcssNum ) { | |
| "use strict"; | |
| function adjustCSS( elem, prop, valueParts, tween ) { | |
| var adjusted, scale, | |
| maxIterations = 20, | |
| currentValue = tween ? | |
| function() { | |
| return tween.cur(); | |
| } : | |
| function() { | |
| return jQuery.css( elem, prop, "" ); | |
| }, | |
| initial = currentValue(), | |
| unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), | |
| // Starting value computation is required for potential unit mismatches | |
| initialInUnit = elem.nodeType && | |
| ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && | |
| rcssNum.exec( jQuery.css( elem, prop ) ); | |
| if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { | |
| // Support: Firefox <=54 | |
| // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) | |
| initial = initial / 2; | |
| // Trust units reported by jQuery.css | |
| unit = unit || initialInUnit[ 3 ]; | |
| // Iteratively approximate from a nonzero starting point | |
| initialInUnit = +initial || 1; | |
| while ( maxIterations-- ) { | |
| // Evaluate and update our best guess (doubling guesses that zero out). | |
| // Finish if the scale equals or crosses 1 (making the old*new product non-positive). | |
| jQuery.style( elem, prop, initialInUnit + unit ); | |
| if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { | |
| maxIterations = 0; | |
| } | |
| initialInUnit = initialInUnit / scale; | |
| } | |
| initialInUnit = initialInUnit * 2; | |
| jQuery.style( elem, prop, initialInUnit + unit ); | |
| // Make sure we update the tween properties later on | |
| valueParts = valueParts || []; | |
| } | |
| if ( valueParts ) { | |
| initialInUnit = +initialInUnit || +initial || 0; | |
| // Apply relative offset (+=/-=) if specified | |
| adjusted = valueParts[ 1 ] ? | |
| initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : | |
| +valueParts[ 2 ]; | |
| if ( tween ) { | |
| tween.unit = unit; | |
| tween.start = initialInUnit; | |
| tween.end = adjusted; | |
| } | |
| } | |
| return adjusted; | |
| } | |
| return adjustCSS; | |
| } ); |