208
208
* * `start` - The method to start the animation. This will return a `Promise` when called.
209
209
* * `end` - This method will cancel the animation and remove all applied CSS classes and styles.
210
210
*/
211
-
212
- // Detect proper transitionend/animationend event names.
213
- var CSS_PREFIX = '' , TRANSITION_PROP , TRANSITIONEND_EVENT , ANIMATION_PROP , ANIMATIONEND_EVENT ;
214
-
215
- // If unprefixed events are not supported but webkit-prefixed are, use the latter.
216
- // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.
217
- // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`
218
- // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.
219
- // Register both events in case `window.onanimationend` is not supported because of that,
220
- // do the same for `transitionend` as Safari is likely to exhibit similar behavior.
221
- // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit
222
- // therefore there is no reason to test anymore for other vendor prefixes:
223
- // http://caniuse.com/#search=transition
224
- if ( window . ontransitionend === undefined && window . onwebkittransitionend !== undefined ) {
225
- CSS_PREFIX = '-webkit-' ;
226
- TRANSITION_PROP = 'WebkitTransition' ;
227
- TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend' ;
228
- } else {
229
- TRANSITION_PROP = 'transition' ;
230
- TRANSITIONEND_EVENT = 'transitionend' ;
231
- }
232
-
233
- if ( window . onanimationend === undefined && window . onwebkitanimationend !== undefined ) {
234
- CSS_PREFIX = '-webkit-' ;
235
- ANIMATION_PROP = 'WebkitAnimation' ;
236
- ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend' ;
237
- } else {
238
- ANIMATION_PROP = 'animation' ;
239
- ANIMATIONEND_EVENT = 'animationend' ;
240
- }
241
-
242
- var DURATION_KEY = 'Duration' ;
243
- var PROPERTY_KEY = 'Property' ;
244
- var DELAY_KEY = 'Delay' ;
245
- var TIMING_KEY = 'TimingFunction' ;
246
- var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount' ;
247
- var ANIMATION_PLAYSTATE_KEY = 'PlayState' ;
248
- var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3 ;
249
- var CLOSING_TIME_BUFFER = 1.5 ;
250
211
var ONE_SECOND = 1000 ;
251
212
var BASE_TEN = 10 ;
252
213
253
- var SAFE_FAST_FORWARD_DURATION_VALUE = 9999 ;
254
-
255
- var ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY ;
256
- var ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY ;
257
-
258
- var TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY ;
259
- var TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY ;
214
+ var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3 ;
215
+ var CLOSING_TIME_BUFFER = 1.5 ;
260
216
261
217
var DETECT_CSS_PROPERTIES = {
262
218
transitionDuration : TRANSITION_DURATION_PROP ,
@@ -274,6 +230,15 @@ var DETECT_STAGGER_CSS_PROPERTIES = {
274
230
animationDelay : ANIMATION_DELAY_PROP
275
231
} ;
276
232
233
+ function getCssKeyframeDurationStyle ( duration ) {
234
+ return [ ANIMATION_DURATION_PROP , duration + 's' ] ;
235
+ }
236
+
237
+ function getCssDelayStyle ( delay , isKeyframeAnimation ) {
238
+ var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP ;
239
+ return [ prop , delay + 's' ] ;
240
+ }
241
+
277
242
function computeCssStyles ( $window , element , properties ) {
278
243
var styles = Object . create ( null ) ;
279
244
var detectedStyles = $window . getComputedStyle ( element ) || { } ;
@@ -330,37 +295,6 @@ function getCssTransitionDurationStyle(duration, applyOnlyDuration) {
330
295
return [ style , value ] ;
331
296
}
332
297
333
- function getCssKeyframeDurationStyle ( duration ) {
334
- return [ ANIMATION_DURATION_PROP , duration + 's' ] ;
335
- }
336
-
337
- function getCssDelayStyle ( delay , isKeyframeAnimation ) {
338
- var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP ;
339
- return [ prop , delay + 's' ] ;
340
- }
341
-
342
- function blockTransitions ( node , duration ) {
343
- // we use a negative delay value since it performs blocking
344
- // yet it doesn't kill any existing transitions running on the
345
- // same element which makes this safe for class-based animations
346
- var value = duration ? '-' + duration + 's' : '' ;
347
- applyInlineStyle ( node , [ TRANSITION_DELAY_PROP , value ] ) ;
348
- return [ TRANSITION_DELAY_PROP , value ] ;
349
- }
350
-
351
- function blockKeyframeAnimations ( node , applyBlock ) {
352
- var value = applyBlock ? 'paused' : '' ;
353
- var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY ;
354
- applyInlineStyle ( node , [ key , value ] ) ;
355
- return [ key , value ] ;
356
- }
357
-
358
- function applyInlineStyle ( node , styleTuple ) {
359
- var prop = styleTuple [ 0 ] ;
360
- var value = styleTuple [ 1 ] ;
361
- node . style [ prop ] = value ;
362
- }
363
-
364
298
function createLocalCacheLookup ( ) {
365
299
var cache = Object . create ( null ) ;
366
300
return {
@@ -392,10 +326,8 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
392
326
var gcsLookup = createLocalCacheLookup ( ) ;
393
327
var gcsStaggerLookup = createLocalCacheLookup ( ) ;
394
328
395
- this . $get = [ '$window' , '$$jqLite' , '$$AnimateRunner' , '$timeout' ,
396
- '$document' , '$sniffer' , '$$rAF' ,
397
- function ( $window , $$jqLite , $$AnimateRunner , $timeout ,
398
- $document , $sniffer , $$rAF ) {
329
+ this . $get = [ '$window' , '$$jqLite' , '$$AnimateRunner' , '$timeout' , '$$forceReflow' , '$sniffer' , '$$rAF' ,
330
+ function ( $window , $$jqLite , $$AnimateRunner , $timeout , $$forceReflow , $sniffer , $$rAF ) {
399
331
400
332
var applyAnimationClasses = applyAnimationClassesFactory ( $$jqLite ) ;
401
333
@@ -452,7 +384,6 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
452
384
return stagger || { } ;
453
385
}
454
386
455
- var bod = getDomNode ( $document ) . body ;
456
387
var cancelLastRAFRequest ;
457
388
var rafWaitQueue = [ ] ;
458
389
function waitUntilQuiet ( callback ) {
@@ -465,20 +396,14 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
465
396
gcsLookup . flush ( ) ;
466
397
gcsStaggerLookup . flush ( ) ;
467
398
468
- //the line below will force the browser to perform a repaint so
469
- //that all the animated elements within the animation frame will
470
- //be properly updated and drawn on screen. This is required to
471
- //ensure that the preparation animation is properly flushed so that
472
- //the active state picks up from there. DO NOT REMOVE THIS LINE.
473
- //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH
474
- //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND
475
- //WILL TAKE YEARS AWAY FROM YOUR LIFE.
476
- var width = bod . offsetWidth + 1 ;
399
+ // DO NOT REMOVE THIS LINE OR REFACTOR OUT THE `pageWidth` variable.
400
+ // PLEASE EXAMINE THE `$$forceReflow` service to understand why.
401
+ var pageWidth = $$forceReflow ( ) ;
477
402
478
403
// we use a for loop to ensure that if the queue is changed
479
404
// during this looping then it will consider new requests
480
405
for ( var i = 0 ; i < rafWaitQueue . length ; i ++ ) {
481
- rafWaitQueue [ i ] ( width ) ;
406
+ rafWaitQueue [ i ] ( pageWidth ) ;
482
407
}
483
408
rafWaitQueue . length = 0 ;
484
409
} ) ;
@@ -534,20 +459,20 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
534
459
var addRemoveClassName = '' ;
535
460
536
461
if ( isStructural ) {
537
- structuralClassName = pendClasses ( method , 'ng-' , true ) ;
462
+ structuralClassName = pendClasses ( method , EVENT_CLASS_PREFIX , true ) ;
538
463
} else if ( method ) {
539
464
structuralClassName = method ;
540
465
}
541
466
542
467
if ( options . addClass ) {
543
- addRemoveClassName += pendClasses ( options . addClass , '-add' ) ;
468
+ addRemoveClassName += pendClasses ( options . addClass , ADD_CLASS_SUFFIX ) ;
544
469
}
545
470
546
471
if ( options . removeClass ) {
547
472
if ( addRemoveClassName . length ) {
548
473
addRemoveClassName += ' ' ;
549
474
}
550
- addRemoveClassName += pendClasses ( options . removeClass , '-remove' ) ;
475
+ addRemoveClassName += pendClasses ( options . removeClass , REMOVE_CLASS_SUFFIX ) ;
551
476
}
552
477
553
478
// there may be a situation where a structural animation is combined together
@@ -563,7 +488,7 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
563
488
564
489
var preparationClasses = [ structuralClassName , addRemoveClassName ] . join ( ' ' ) . trim ( ) ;
565
490
var fullClassName = classes + ' ' + preparationClasses ;
566
- var activeClasses = pendClasses ( preparationClasses , '-active' ) ;
491
+ var activeClasses = pendClasses ( preparationClasses , ACTIVE_CLASS_SUFFIX ) ;
567
492
var hasToStyles = styles . to && Object . keys ( styles . to ) . length > 0 ;
568
493
var containsKeyframeAnimation = ( options . keyframeStyle || '' ) . length > 0 ;
569
494
0 commit comments