@@ -1365,6 +1365,7 @@ angular.module('ngAnimate', ['ng'])
1365
1365
var PROPERTY_KEY = 'Property' ;
1366
1366
var DELAY_KEY = 'Delay' ;
1367
1367
var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount' ;
1368
+ var ANIMATION_PLAYSTATE_KEY = 'PlayState' ;
1368
1369
var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey' ;
1369
1370
var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data' ;
1370
1371
var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3 ;
@@ -1436,47 +1437,32 @@ angular.module('ngAnimate', ['ng'])
1436
1437
var transitionDelay = 0 ;
1437
1438
var animationDuration = 0 ;
1438
1439
var animationDelay = 0 ;
1439
- var transitionDelayStyle ;
1440
- var animationDelayStyle ;
1441
- var transitionDurationStyle ;
1442
- var transitionPropertyStyle ;
1443
1440
1444
1441
//we want all the styles defined before and after
1445
1442
forEach ( element , function ( element ) {
1446
1443
if ( element . nodeType == ELEMENT_NODE ) {
1447
1444
var elementStyles = $window . getComputedStyle ( element ) || { } ;
1448
1445
1449
- transitionDurationStyle = elementStyles [ TRANSITION_PROP + DURATION_KEY ] ;
1450
-
1446
+ var transitionDurationStyle = elementStyles [ TRANSITION_PROP + DURATION_KEY ] ;
1451
1447
transitionDuration = Math . max ( parseMaxTime ( transitionDurationStyle ) , transitionDuration ) ;
1452
1448
1453
- transitionPropertyStyle = elementStyles [ TRANSITION_PROP + PROPERTY_KEY ] ;
1454
-
1455
- transitionDelayStyle = elementStyles [ TRANSITION_PROP + DELAY_KEY ] ;
1456
-
1449
+ var transitionDelayStyle = elementStyles [ TRANSITION_PROP + DELAY_KEY ] ;
1457
1450
transitionDelay = Math . max ( parseMaxTime ( transitionDelayStyle ) , transitionDelay ) ;
1458
1451
1459
- animationDelayStyle = elementStyles [ ANIMATION_PROP + DELAY_KEY ] ;
1460
-
1461
- animationDelay = Math . max ( parseMaxTime ( animationDelayStyle ) , animationDelay ) ;
1452
+ var animationDelayStyle = elementStyles [ ANIMATION_PROP + DELAY_KEY ] ;
1453
+ animationDelay = Math . max ( parseMaxTime ( elementStyles [ ANIMATION_PROP + DELAY_KEY ] ) , animationDelay ) ;
1462
1454
1463
1455
var aDuration = parseMaxTime ( elementStyles [ ANIMATION_PROP + DURATION_KEY ] ) ;
1464
-
1465
1456
if ( aDuration > 0 ) {
1466
1457
aDuration *= parseInt ( elementStyles [ ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY ] , 10 ) || 1 ;
1467
1458
}
1468
-
1469
1459
animationDuration = Math . max ( aDuration , animationDuration ) ;
1470
1460
}
1471
1461
} ) ;
1472
1462
data = {
1473
1463
total : 0 ,
1474
- transitionPropertyStyle : transitionPropertyStyle ,
1475
- transitionDurationStyle : transitionDurationStyle ,
1476
- transitionDelayStyle : transitionDelayStyle ,
1477
1464
transitionDelay : transitionDelay ,
1478
1465
transitionDuration : transitionDuration ,
1479
- animationDelayStyle : animationDelayStyle ,
1480
1466
animationDelay : animationDelay ,
1481
1467
animationDuration : animationDuration
1482
1468
} ;
@@ -1552,18 +1538,17 @@ angular.module('ngAnimate', ['ng'])
1552
1538
running : formerData . running || 0 ,
1553
1539
itemIndex : itemIndex ,
1554
1540
blockTransition : blockTransition ,
1555
- blockAnimation : blockAnimation ,
1556
1541
closeAnimationFns : closeAnimationFns
1557
1542
} ) ;
1558
1543
1559
1544
var node = extractElementNode ( element ) ;
1560
1545
1561
1546
if ( blockTransition ) {
1562
- node . style [ TRANSITION_PROP + PROPERTY_KEY ] = 'none' ;
1547
+ blockTransitions ( node , true ) ;
1563
1548
}
1564
1549
1565
1550
if ( blockAnimation ) {
1566
- node . style [ ANIMATION_PROP ] = 'none 0s' ;
1551
+ blockAnimations ( node , true ) ;
1567
1552
}
1568
1553
1569
1554
return true ;
@@ -1578,22 +1563,42 @@ angular.module('ngAnimate', ['ng'])
1578
1563
}
1579
1564
1580
1565
if ( elementData . blockTransition ) {
1581
- node . style [ TRANSITION_PROP + PROPERTY_KEY ] = '' ;
1582
- }
1583
-
1584
- if ( elementData . blockAnimation ) {
1585
- node . style [ ANIMATION_PROP ] = '' ;
1566
+ blockTransitions ( node , false ) ;
1586
1567
}
1587
1568
1588
1569
var activeClassName = '' ;
1570
+ var pendingClassName = '' ;
1589
1571
forEach ( className . split ( ' ' ) , function ( klass , i ) {
1590
- activeClassName += ( i > 0 ? ' ' : '' ) + klass + '-active' ;
1572
+ var prefix = ( i > 0 ? ' ' : '' ) + klass ;
1573
+ activeClassName += prefix + '-active' ;
1574
+ pendingClassName += prefix + '-pending' ;
1591
1575
} ) ;
1592
1576
1593
- element . addClass ( activeClassName ) ;
1577
+ var style = '' , appliedStyles = [ ] ;
1578
+ var itemIndex = elementData . itemIndex ;
1579
+ var stagger = elementData . stagger ;
1580
+ var staggerTime = 0 ;
1581
+ if ( itemIndex > 0 ) {
1582
+ var transitionStaggerDelay = 0 ;
1583
+ if ( stagger . transitionDelay > 0 && stagger . transitionDuration === 0 ) {
1584
+ transitionStaggerDelay = stagger . transitionDelay * itemIndex ;
1585
+ }
1586
+
1587
+ var animationStaggerDelay = 0 ;
1588
+ if ( stagger . animationDelay > 0 && stagger . animationDuration === 0 ) {
1589
+ animationStaggerDelay = stagger . animationDelay * itemIndex ;
1590
+ appliedStyles . push ( CSS_PREFIX + 'animation-play-state' ) ;
1591
+ }
1592
+
1593
+ staggerTime = Math . round ( Math . max ( transitionStaggerDelay , animationStaggerDelay ) * 100 ) / 100 ;
1594
+ }
1595
+
1596
+ if ( ! staggerTime ) {
1597
+ element . addClass ( activeClassName ) ;
1598
+ }
1599
+
1594
1600
var eventCacheKey = elementData . cacheKey + ' ' + activeClassName ;
1595
1601
var timings = getElementAnimationDetails ( element , eventCacheKey ) ;
1596
-
1597
1602
var maxDuration = Math . max ( timings . transitionDuration , timings . animationDuration ) ;
1598
1603
if ( maxDuration === 0 ) {
1599
1604
element . removeClass ( activeClassName ) ;
@@ -1603,57 +1608,43 @@ angular.module('ngAnimate', ['ng'])
1603
1608
}
1604
1609
1605
1610
var maxDelay = Math . max ( timings . transitionDelay , timings . animationDelay ) ;
1606
- var stagger = elementData . stagger ;
1607
- var itemIndex = elementData . itemIndex ;
1608
1611
var maxDelayTime = maxDelay * ONE_SECOND ;
1609
1612
1610
- var style = '' , appliedStyles = [ ] ;
1611
- if ( timings . transitionDuration > 0 ) {
1612
- var propertyStyle = timings . transitionPropertyStyle ;
1613
- if ( propertyStyle . indexOf ( 'all' ) == - 1 ) {
1614
- style += CSS_PREFIX + 'transition-property: ' + propertyStyle + ';' ;
1615
- style += CSS_PREFIX + 'transition-duration: ' + timings . transitionDurationStyle + ';' ;
1616
- appliedStyles . push ( CSS_PREFIX + 'transition-property' ) ;
1617
- appliedStyles . push ( CSS_PREFIX + 'transition-duration' ) ;
1618
- }
1619
- }
1620
-
1621
- if ( itemIndex > 0 ) {
1622
- if ( stagger . transitionDelay > 0 && stagger . transitionDuration === 0 ) {
1623
- var delayStyle = timings . transitionDelayStyle ;
1624
- style += CSS_PREFIX + 'transition-delay: ' +
1625
- prepareStaggerDelay ( delayStyle , stagger . transitionDelay , itemIndex ) + '; ' ;
1626
- appliedStyles . push ( CSS_PREFIX + 'transition-delay' ) ;
1627
- }
1628
-
1629
- if ( stagger . animationDelay > 0 && stagger . animationDuration === 0 ) {
1630
- style += CSS_PREFIX + 'animation-delay: ' +
1631
- prepareStaggerDelay ( timings . animationDelayStyle , stagger . animationDelay , itemIndex ) + '; ' ;
1632
- appliedStyles . push ( CSS_PREFIX + 'animation-delay' ) ;
1633
- }
1634
- }
1635
-
1636
1613
if ( appliedStyles . length > 0 ) {
1637
1614
//the element being animated may sometimes contain comment nodes in
1638
1615
//the jqLite object, so we're safe to use a single variable to house
1639
1616
//the styles since there is always only one element being animated
1640
1617
var oldStyle = node . getAttribute ( 'style' ) || '' ;
1641
- node . setAttribute ( 'style' , oldStyle + '; ' + style ) ;
1618
+ if ( oldStyle . charAt ( oldStyle . length - 1 ) !== ';' ) {
1619
+ oldStyle += ';' ;
1620
+ }
1621
+ node . setAttribute ( 'style' , oldStyle + ' ' + style ) ;
1642
1622
}
1643
1623
1644
1624
var startTime = Date . now ( ) ;
1645
1625
var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT ;
1626
+ var animationTime = ( maxDelay + maxDuration ) * CLOSING_TIME_BUFFER ;
1627
+ var totalTime = ( staggerTime + animationTime ) * ONE_SECOND ;
1628
+
1629
+ var staggerTimeout ;
1630
+ if ( staggerTime > 0 ) {
1631
+ element . addClass ( pendingClassName ) ;
1632
+ staggerTimeout = $timeout ( function ( ) {
1633
+ staggerTimeout = null ;
1634
+ element . addClass ( activeClassName ) ;
1635
+ element . removeClass ( pendingClassName ) ;
1636
+ if ( timings . animationDuration > 0 ) {
1637
+ blockAnimations ( node , false ) ;
1638
+ }
1639
+ } , staggerTime * ONE_SECOND , false ) ;
1640
+ }
1646
1641
1647
1642
element . on ( css3AnimationEvents , onAnimationProgress ) ;
1648
1643
elementData . closeAnimationFns . push ( function ( ) {
1649
1644
onEnd ( ) ;
1650
1645
activeAnimationComplete ( ) ;
1651
1646
} ) ;
1652
1647
1653
- var staggerTime = itemIndex * ( Math . max ( stagger . animationDelay , stagger . transitionDelay ) || 0 ) ;
1654
- var animationTime = ( maxDelay + maxDuration ) * CLOSING_TIME_BUFFER ;
1655
- var totalTime = ( staggerTime + animationTime ) * ONE_SECOND ;
1656
-
1657
1648
elementData . running ++ ;
1658
1649
animationCloseHandler ( element , totalTime ) ;
1659
1650
return onEnd ;
@@ -1664,6 +1655,10 @@ angular.module('ngAnimate', ['ng'])
1664
1655
function onEnd ( cancelled ) {
1665
1656
element . off ( css3AnimationEvents , onAnimationProgress ) ;
1666
1657
element . removeClass ( activeClassName ) ;
1658
+ element . removeClass ( pendingClassName ) ;
1659
+ if ( staggerTimeout ) {
1660
+ $timeout . cancel ( staggerTimeout ) ;
1661
+ }
1667
1662
animateClose ( element , className ) ;
1668
1663
var node = extractElementNode ( element ) ;
1669
1664
for ( var i in appliedStyles ) {
@@ -1693,13 +1688,12 @@ angular.module('ngAnimate', ['ng'])
1693
1688
}
1694
1689
}
1695
1690
1696
- function prepareStaggerDelay ( delayStyle , staggerDelay , index ) {
1697
- var style = '' ;
1698
- forEach ( delayStyle . split ( ',' ) , function ( val , i ) {
1699
- style += ( i > 0 ? ',' : '' ) +
1700
- ( index * staggerDelay + parseInt ( val , 10 ) ) + 's' ;
1701
- } ) ;
1702
- return style ;
1691
+ function blockTransitions ( node , bool ) {
1692
+ node . style [ TRANSITION_PROP + PROPERTY_KEY ] = bool ? 'none' : '' ;
1693
+ }
1694
+
1695
+ function blockAnimations ( node , bool ) {
1696
+ node . style [ ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY ] = bool ? 'paused' : '' ;
1703
1697
}
1704
1698
1705
1699
function animateBefore ( animationEvent , element , className , calculationDecorator ) {
0 commit comments