OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / tools / side_chain_tool / web / node_modules / jquery / src / effects.js
1 define( [
2         "./core",
3         "./core/camelCase",
4         "./var/document",
5         "./var/isFunction",
6         "./var/rcssNum",
7         "./var/rnothtmlwhite",
8         "./css/var/cssExpand",
9         "./css/var/isHiddenWithinTree",
10         "./css/var/swap",
11         "./css/adjustCSS",
12         "./data/var/dataPriv",
13         "./css/showHide",
14
15         "./core/init",
16         "./queue",
17         "./deferred",
18         "./traversing",
19         "./manipulation",
20         "./css",
21         "./effects/Tween"
22 ], function( jQuery, camelCase, document, isFunction, rcssNum, rnothtmlwhite, cssExpand,
23         isHiddenWithinTree, swap, adjustCSS, dataPriv, showHide ) {
24
25 "use strict";
26
27 var
28         fxNow, inProgress,
29         rfxtypes = /^(?:toggle|show|hide)$/,
30         rrun = /queueHooks$/;
31
32 function schedule() {
33         if ( inProgress ) {
34                 if ( document.hidden === false && window.requestAnimationFrame ) {
35                         window.requestAnimationFrame( schedule );
36                 } else {
37                         window.setTimeout( schedule, jQuery.fx.interval );
38                 }
39
40                 jQuery.fx.tick();
41         }
42 }
43
44 // Animations created synchronously will run synchronously
45 function createFxNow() {
46         window.setTimeout( function() {
47                 fxNow = undefined;
48         } );
49         return ( fxNow = Date.now() );
50 }
51
52 // Generate parameters to create a standard animation
53 function genFx( type, includeWidth ) {
54         var which,
55                 i = 0,
56                 attrs = { height: type };
57
58         // If we include width, step value is 1 to do all cssExpand values,
59         // otherwise step value is 2 to skip over Left and Right
60         includeWidth = includeWidth ? 1 : 0;
61         for ( ; i < 4; i += 2 - includeWidth ) {
62                 which = cssExpand[ i ];
63                 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
64         }
65
66         if ( includeWidth ) {
67                 attrs.opacity = attrs.width = type;
68         }
69
70         return attrs;
71 }
72
73 function createTween( value, prop, animation ) {
74         var tween,
75                 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
76                 index = 0,
77                 length = collection.length;
78         for ( ; index < length; index++ ) {
79                 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
80
81                         // We're done with this property
82                         return tween;
83                 }
84         }
85 }
86
87 function defaultPrefilter( elem, props, opts ) {
88         var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
89                 isBox = "width" in props || "height" in props,
90                 anim = this,
91                 orig = {},
92                 style = elem.style,
93                 hidden = elem.nodeType && isHiddenWithinTree( elem ),
94                 dataShow = dataPriv.get( elem, "fxshow" );
95
96         // Queue-skipping animations hijack the fx hooks
97         if ( !opts.queue ) {
98                 hooks = jQuery._queueHooks( elem, "fx" );
99                 if ( hooks.unqueued == null ) {
100                         hooks.unqueued = 0;
101                         oldfire = hooks.empty.fire;
102                         hooks.empty.fire = function() {
103                                 if ( !hooks.unqueued ) {
104                                         oldfire();
105                                 }
106                         };
107                 }
108                 hooks.unqueued++;
109
110                 anim.always( function() {
111
112                         // Ensure the complete handler is called before this completes
113                         anim.always( function() {
114                                 hooks.unqueued--;
115                                 if ( !jQuery.queue( elem, "fx" ).length ) {
116                                         hooks.empty.fire();
117                                 }
118                         } );
119                 } );
120         }
121
122         // Detect show/hide animations
123         for ( prop in props ) {
124                 value = props[ prop ];
125                 if ( rfxtypes.test( value ) ) {
126                         delete props[ prop ];
127                         toggle = toggle || value === "toggle";
128                         if ( value === ( hidden ? "hide" : "show" ) ) {
129
130                                 // Pretend to be hidden if this is a "show" and
131                                 // there is still data from a stopped show/hide
132                                 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
133                                         hidden = true;
134
135                                 // Ignore all other no-op show/hide data
136                                 } else {
137                                         continue;
138                                 }
139                         }
140                         orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
141                 }
142         }
143
144         // Bail out if this is a no-op like .hide().hide()
145         propTween = !jQuery.isEmptyObject( props );
146         if ( !propTween && jQuery.isEmptyObject( orig ) ) {
147                 return;
148         }
149
150         // Restrict "overflow" and "display" styles during box animations
151         if ( isBox && elem.nodeType === 1 ) {
152
153                 // Support: IE <=9 - 11, Edge 12 - 15
154                 // Record all 3 overflow attributes because IE does not infer the shorthand
155                 // from identically-valued overflowX and overflowY and Edge just mirrors
156                 // the overflowX value there.
157                 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
158
159                 // Identify a display type, preferring old show/hide data over the CSS cascade
160                 restoreDisplay = dataShow && dataShow.display;
161                 if ( restoreDisplay == null ) {
162                         restoreDisplay = dataPriv.get( elem, "display" );
163                 }
164                 display = jQuery.css( elem, "display" );
165                 if ( display === "none" ) {
166                         if ( restoreDisplay ) {
167                                 display = restoreDisplay;
168                         } else {
169
170                                 // Get nonempty value(s) by temporarily forcing visibility
171                                 showHide( [ elem ], true );
172                                 restoreDisplay = elem.style.display || restoreDisplay;
173                                 display = jQuery.css( elem, "display" );
174                                 showHide( [ elem ] );
175                         }
176                 }
177
178                 // Animate inline elements as inline-block
179                 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
180                         if ( jQuery.css( elem, "float" ) === "none" ) {
181
182                                 // Restore the original display value at the end of pure show/hide animations
183                                 if ( !propTween ) {
184                                         anim.done( function() {
185                                                 style.display = restoreDisplay;
186                                         } );
187                                         if ( restoreDisplay == null ) {
188                                                 display = style.display;
189                                                 restoreDisplay = display === "none" ? "" : display;
190                                         }
191                                 }
192                                 style.display = "inline-block";
193                         }
194                 }
195         }
196
197         if ( opts.overflow ) {
198                 style.overflow = "hidden";
199                 anim.always( function() {
200                         style.overflow = opts.overflow[ 0 ];
201                         style.overflowX = opts.overflow[ 1 ];
202                         style.overflowY = opts.overflow[ 2 ];
203                 } );
204         }
205
206         // Implement show/hide animations
207         propTween = false;
208         for ( prop in orig ) {
209
210                 // General show/hide setup for this element animation
211                 if ( !propTween ) {
212                         if ( dataShow ) {
213                                 if ( "hidden" in dataShow ) {
214                                         hidden = dataShow.hidden;
215                                 }
216                         } else {
217                                 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
218                         }
219
220                         // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
221                         if ( toggle ) {
222                                 dataShow.hidden = !hidden;
223                         }
224
225                         // Show elements before animating them
226                         if ( hidden ) {
227                                 showHide( [ elem ], true );
228                         }
229
230                         /* eslint-disable no-loop-func */
231
232                         anim.done( function() {
233
234                         /* eslint-enable no-loop-func */
235
236                                 // The final step of a "hide" animation is actually hiding the element
237                                 if ( !hidden ) {
238                                         showHide( [ elem ] );
239                                 }
240                                 dataPriv.remove( elem, "fxshow" );
241                                 for ( prop in orig ) {
242                                         jQuery.style( elem, prop, orig[ prop ] );
243                                 }
244                         } );
245                 }
246
247                 // Per-property setup
248                 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
249                 if ( !( prop in dataShow ) ) {
250                         dataShow[ prop ] = propTween.start;
251                         if ( hidden ) {
252                                 propTween.end = propTween.start;
253                                 propTween.start = 0;
254                         }
255                 }
256         }
257 }
258
259 function propFilter( props, specialEasing ) {
260         var index, name, easing, value, hooks;
261
262         // camelCase, specialEasing and expand cssHook pass
263         for ( index in props ) {
264                 name = camelCase( index );
265                 easing = specialEasing[ name ];
266                 value = props[ index ];
267                 if ( Array.isArray( value ) ) {
268                         easing = value[ 1 ];
269                         value = props[ index ] = value[ 0 ];
270                 }
271
272                 if ( index !== name ) {
273                         props[ name ] = value;
274                         delete props[ index ];
275                 }
276
277                 hooks = jQuery.cssHooks[ name ];
278                 if ( hooks && "expand" in hooks ) {
279                         value = hooks.expand( value );
280                         delete props[ name ];
281
282                         // Not quite $.extend, this won't overwrite existing keys.
283                         // Reusing 'index' because we have the correct "name"
284                         for ( index in value ) {
285                                 if ( !( index in props ) ) {
286                                         props[ index ] = value[ index ];
287                                         specialEasing[ index ] = easing;
288                                 }
289                         }
290                 } else {
291                         specialEasing[ name ] = easing;
292                 }
293         }
294 }
295
296 function Animation( elem, properties, options ) {
297         var result,
298                 stopped,
299                 index = 0,
300                 length = Animation.prefilters.length,
301                 deferred = jQuery.Deferred().always( function() {
302
303                         // Don't match elem in the :animated selector
304                         delete tick.elem;
305                 } ),
306                 tick = function() {
307                         if ( stopped ) {
308                                 return false;
309                         }
310                         var currentTime = fxNow || createFxNow(),
311                                 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
312
313                                 // Support: Android 2.3 only
314                                 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
315                                 temp = remaining / animation.duration || 0,
316                                 percent = 1 - temp,
317                                 index = 0,
318                                 length = animation.tweens.length;
319
320                         for ( ; index < length; index++ ) {
321                                 animation.tweens[ index ].run( percent );
322                         }
323
324                         deferred.notifyWith( elem, [ animation, percent, remaining ] );
325
326                         // If there's more to do, yield
327                         if ( percent < 1 && length ) {
328                                 return remaining;
329                         }
330
331                         // If this was an empty animation, synthesize a final progress notification
332                         if ( !length ) {
333                                 deferred.notifyWith( elem, [ animation, 1, 0 ] );
334                         }
335
336                         // Resolve the animation and report its conclusion
337                         deferred.resolveWith( elem, [ animation ] );
338                         return false;
339                 },
340                 animation = deferred.promise( {
341                         elem: elem,
342                         props: jQuery.extend( {}, properties ),
343                         opts: jQuery.extend( true, {
344                                 specialEasing: {},
345                                 easing: jQuery.easing._default
346                         }, options ),
347                         originalProperties: properties,
348                         originalOptions: options,
349                         startTime: fxNow || createFxNow(),
350                         duration: options.duration,
351                         tweens: [],
352                         createTween: function( prop, end ) {
353                                 var tween = jQuery.Tween( elem, animation.opts, prop, end,
354                                                 animation.opts.specialEasing[ prop ] || animation.opts.easing );
355                                 animation.tweens.push( tween );
356                                 return tween;
357                         },
358                         stop: function( gotoEnd ) {
359                                 var index = 0,
360
361                                         // If we are going to the end, we want to run all the tweens
362                                         // otherwise we skip this part
363                                         length = gotoEnd ? animation.tweens.length : 0;
364                                 if ( stopped ) {
365                                         return this;
366                                 }
367                                 stopped = true;
368                                 for ( ; index < length; index++ ) {
369                                         animation.tweens[ index ].run( 1 );
370                                 }
371
372                                 // Resolve when we played the last frame; otherwise, reject
373                                 if ( gotoEnd ) {
374                                         deferred.notifyWith( elem, [ animation, 1, 0 ] );
375                                         deferred.resolveWith( elem, [ animation, gotoEnd ] );
376                                 } else {
377                                         deferred.rejectWith( elem, [ animation, gotoEnd ] );
378                                 }
379                                 return this;
380                         }
381                 } ),
382                 props = animation.props;
383
384         propFilter( props, animation.opts.specialEasing );
385
386         for ( ; index < length; index++ ) {
387                 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
388                 if ( result ) {
389                         if ( isFunction( result.stop ) ) {
390                                 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
391                                         result.stop.bind( result );
392                         }
393                         return result;
394                 }
395         }
396
397         jQuery.map( props, createTween, animation );
398
399         if ( isFunction( animation.opts.start ) ) {
400                 animation.opts.start.call( elem, animation );
401         }
402
403         // Attach callbacks from options
404         animation
405                 .progress( animation.opts.progress )
406                 .done( animation.opts.done, animation.opts.complete )
407                 .fail( animation.opts.fail )
408                 .always( animation.opts.always );
409
410         jQuery.fx.timer(
411                 jQuery.extend( tick, {
412                         elem: elem,
413                         anim: animation,
414                         queue: animation.opts.queue
415                 } )
416         );
417
418         return animation;
419 }
420
421 jQuery.Animation = jQuery.extend( Animation, {
422
423         tweeners: {
424                 "*": [ function( prop, value ) {
425                         var tween = this.createTween( prop, value );
426                         adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
427                         return tween;
428                 } ]
429         },
430
431         tweener: function( props, callback ) {
432                 if ( isFunction( props ) ) {
433                         callback = props;
434                         props = [ "*" ];
435                 } else {
436                         props = props.match( rnothtmlwhite );
437                 }
438
439                 var prop,
440                         index = 0,
441                         length = props.length;
442
443                 for ( ; index < length; index++ ) {
444                         prop = props[ index ];
445                         Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
446                         Animation.tweeners[ prop ].unshift( callback );
447                 }
448         },
449
450         prefilters: [ defaultPrefilter ],
451
452         prefilter: function( callback, prepend ) {
453                 if ( prepend ) {
454                         Animation.prefilters.unshift( callback );
455                 } else {
456                         Animation.prefilters.push( callback );
457                 }
458         }
459 } );
460
461 jQuery.speed = function( speed, easing, fn ) {
462         var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
463                 complete: fn || !fn && easing ||
464                         isFunction( speed ) && speed,
465                 duration: speed,
466                 easing: fn && easing || easing && !isFunction( easing ) && easing
467         };
468
469         // Go to the end state if fx are off
470         if ( jQuery.fx.off ) {
471                 opt.duration = 0;
472
473         } else {
474                 if ( typeof opt.duration !== "number" ) {
475                         if ( opt.duration in jQuery.fx.speeds ) {
476                                 opt.duration = jQuery.fx.speeds[ opt.duration ];
477
478                         } else {
479                                 opt.duration = jQuery.fx.speeds._default;
480                         }
481                 }
482         }
483
484         // Normalize opt.queue - true/undefined/null -> "fx"
485         if ( opt.queue == null || opt.queue === true ) {
486                 opt.queue = "fx";
487         }
488
489         // Queueing
490         opt.old = opt.complete;
491
492         opt.complete = function() {
493                 if ( isFunction( opt.old ) ) {
494                         opt.old.call( this );
495                 }
496
497                 if ( opt.queue ) {
498                         jQuery.dequeue( this, opt.queue );
499                 }
500         };
501
502         return opt;
503 };
504
505 jQuery.fn.extend( {
506         fadeTo: function( speed, to, easing, callback ) {
507
508                 // Show any hidden elements after setting opacity to 0
509                 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
510
511                         // Animate to the value specified
512                         .end().animate( { opacity: to }, speed, easing, callback );
513         },
514         animate: function( prop, speed, easing, callback ) {
515                 var empty = jQuery.isEmptyObject( prop ),
516                         optall = jQuery.speed( speed, easing, callback ),
517                         doAnimation = function() {
518
519                                 // Operate on a copy of prop so per-property easing won't be lost
520                                 var anim = Animation( this, jQuery.extend( {}, prop ), optall );
521
522                                 // Empty animations, or finishing resolves immediately
523                                 if ( empty || dataPriv.get( this, "finish" ) ) {
524                                         anim.stop( true );
525                                 }
526                         };
527                         doAnimation.finish = doAnimation;
528
529                 return empty || optall.queue === false ?
530                         this.each( doAnimation ) :
531                         this.queue( optall.queue, doAnimation );
532         },
533         stop: function( type, clearQueue, gotoEnd ) {
534                 var stopQueue = function( hooks ) {
535                         var stop = hooks.stop;
536                         delete hooks.stop;
537                         stop( gotoEnd );
538                 };
539
540                 if ( typeof type !== "string" ) {
541                         gotoEnd = clearQueue;
542                         clearQueue = type;
543                         type = undefined;
544                 }
545                 if ( clearQueue && type !== false ) {
546                         this.queue( type || "fx", [] );
547                 }
548
549                 return this.each( function() {
550                         var dequeue = true,
551                                 index = type != null && type + "queueHooks",
552                                 timers = jQuery.timers,
553                                 data = dataPriv.get( this );
554
555                         if ( index ) {
556                                 if ( data[ index ] && data[ index ].stop ) {
557                                         stopQueue( data[ index ] );
558                                 }
559                         } else {
560                                 for ( index in data ) {
561                                         if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
562                                                 stopQueue( data[ index ] );
563                                         }
564                                 }
565                         }
566
567                         for ( index = timers.length; index--; ) {
568                                 if ( timers[ index ].elem === this &&
569                                         ( type == null || timers[ index ].queue === type ) ) {
570
571                                         timers[ index ].anim.stop( gotoEnd );
572                                         dequeue = false;
573                                         timers.splice( index, 1 );
574                                 }
575                         }
576
577                         // Start the next in the queue if the last step wasn't forced.
578                         // Timers currently will call their complete callbacks, which
579                         // will dequeue but only if they were gotoEnd.
580                         if ( dequeue || !gotoEnd ) {
581                                 jQuery.dequeue( this, type );
582                         }
583                 } );
584         },
585         finish: function( type ) {
586                 if ( type !== false ) {
587                         type = type || "fx";
588                 }
589                 return this.each( function() {
590                         var index,
591                                 data = dataPriv.get( this ),
592                                 queue = data[ type + "queue" ],
593                                 hooks = data[ type + "queueHooks" ],
594                                 timers = jQuery.timers,
595                                 length = queue ? queue.length : 0;
596
597                         // Enable finishing flag on private data
598                         data.finish = true;
599
600                         // Empty the queue first
601                         jQuery.queue( this, type, [] );
602
603                         if ( hooks && hooks.stop ) {
604                                 hooks.stop.call( this, true );
605                         }
606
607                         // Look for any active animations, and finish them
608                         for ( index = timers.length; index--; ) {
609                                 if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
610                                         timers[ index ].anim.stop( true );
611                                         timers.splice( index, 1 );
612                                 }
613                         }
614
615                         // Look for any animations in the old queue and finish them
616                         for ( index = 0; index < length; index++ ) {
617                                 if ( queue[ index ] && queue[ index ].finish ) {
618                                         queue[ index ].finish.call( this );
619                                 }
620                         }
621
622                         // Turn off finishing flag
623                         delete data.finish;
624                 } );
625         }
626 } );
627
628 jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
629         var cssFn = jQuery.fn[ name ];
630         jQuery.fn[ name ] = function( speed, easing, callback ) {
631                 return speed == null || typeof speed === "boolean" ?
632                         cssFn.apply( this, arguments ) :
633                         this.animate( genFx( name, true ), speed, easing, callback );
634         };
635 } );
636
637 // Generate shortcuts for custom animations
638 jQuery.each( {
639         slideDown: genFx( "show" ),
640         slideUp: genFx( "hide" ),
641         slideToggle: genFx( "toggle" ),
642         fadeIn: { opacity: "show" },
643         fadeOut: { opacity: "hide" },
644         fadeToggle: { opacity: "toggle" }
645 }, function( name, props ) {
646         jQuery.fn[ name ] = function( speed, easing, callback ) {
647                 return this.animate( props, speed, easing, callback );
648         };
649 } );
650
651 jQuery.timers = [];
652 jQuery.fx.tick = function() {
653         var timer,
654                 i = 0,
655                 timers = jQuery.timers;
656
657         fxNow = Date.now();
658
659         for ( ; i < timers.length; i++ ) {
660                 timer = timers[ i ];
661
662                 // Run the timer and safely remove it when done (allowing for external removal)
663                 if ( !timer() && timers[ i ] === timer ) {
664                         timers.splice( i--, 1 );
665                 }
666         }
667
668         if ( !timers.length ) {
669                 jQuery.fx.stop();
670         }
671         fxNow = undefined;
672 };
673
674 jQuery.fx.timer = function( timer ) {
675         jQuery.timers.push( timer );
676         jQuery.fx.start();
677 };
678
679 jQuery.fx.interval = 13;
680 jQuery.fx.start = function() {
681         if ( inProgress ) {
682                 return;
683         }
684
685         inProgress = true;
686         schedule();
687 };
688
689 jQuery.fx.stop = function() {
690         inProgress = null;
691 };
692
693 jQuery.fx.speeds = {
694         slow: 600,
695         fast: 200,
696
697         // Default speed
698         _default: 400
699 };
700
701 return jQuery;
702 } );