@@ -1586,14 +1586,15 @@ angular.module('ngAnimate', ['ng'])
1586
1586
}
1587
1587
1588
1588
var activeClassName = '' ;
1589
+ var pendingClassName = '' ;
1589
1590
forEach ( className . split ( ' ' ) , function ( klass , i ) {
1590
- activeClassName += ( i > 0 ? ' ' : '' ) + klass + '-active' ;
1591
+ var prefix = ( i > 0 ? ' ' : '' ) + klass ;
1592
+ activeClassName += prefix + '-active' ;
1593
+ pendingClassName += prefix + '-pending' ;
1591
1594
} ) ;
1592
1595
1593
- element . addClass ( activeClassName ) ;
1594
1596
var eventCacheKey = elementData . cacheKey + ' ' + activeClassName ;
1595
1597
var timings = getElementAnimationDetails ( element , eventCacheKey ) ;
1596
-
1597
1598
var maxDuration = Math . max ( timings . transitionDuration , timings . animationDuration ) ;
1598
1599
if ( maxDuration === 0 ) {
1599
1600
element . removeClass ( activeClassName ) ;
@@ -1603,8 +1604,6 @@ angular.module('ngAnimate', ['ng'])
1603
1604
}
1604
1605
1605
1606
var maxDelay = Math . max ( timings . transitionDelay , timings . animationDelay ) ;
1606
- var stagger = elementData . stagger ;
1607
- var itemIndex = elementData . itemIndex ;
1608
1607
var maxDelayTime = maxDelay * ONE_SECOND ;
1609
1608
1610
1609
var style = '' , appliedStyles = [ ] ;
@@ -1618,19 +1617,31 @@ angular.module('ngAnimate', ['ng'])
1618
1617
}
1619
1618
}
1620
1619
1620
+ var itemIndex = elementData . itemIndex ;
1621
+ var stagger = elementData . stagger ;
1622
+
1623
+ var staggerStyle , staggerTime = 0 ;
1621
1624
if ( itemIndex > 0 ) {
1625
+ var transitionStaggerDelay = 0 ;
1622
1626
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
+ transitionStaggerDelay = stagger . transitionDelay * itemIndex ;
1627
1628
}
1628
1629
1630
+ var animationStaggerDelay = 0 ;
1629
1631
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' ) ;
1632
+ animationStaggerDelay = stagger . animationDelay * itemIndex ;
1633
+
1634
+ staggerStyle = CSS_PREFIX + 'animation-play-state' ;
1635
+ appliedStyles . push ( staggerStyle ) ;
1636
+
1637
+ style += staggerStyle + ':paused;' ;
1633
1638
}
1639
+
1640
+ staggerTime = Math . round ( Math . max ( transitionStaggerDelay , animationStaggerDelay ) * 100 ) / 100 ;
1641
+ }
1642
+
1643
+ if ( ! staggerTime ) {
1644
+ element . addClass ( activeClassName ) ;
1634
1645
}
1635
1646
1636
1647
if ( appliedStyles . length > 0 ) {
@@ -1643,17 +1654,28 @@ angular.module('ngAnimate', ['ng'])
1643
1654
1644
1655
var startTime = Date . now ( ) ;
1645
1656
var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT ;
1657
+ var animationTime = ( maxDelay + maxDuration ) * CLOSING_TIME_BUFFER ;
1658
+ var totalTime = ( staggerTime + animationTime ) * ONE_SECOND ;
1659
+
1660
+ var staggerTimer ;
1661
+ if ( staggerTime > 0 ) {
1662
+ element . addClass ( pendingClassName ) ;
1663
+ staggerTimer = $timeout ( function ( ) {
1664
+ staggerTimer = null ;
1665
+ element . addClass ( activeClassName ) ;
1666
+ element . removeClass ( pendingClassName ) ;
1667
+ if ( staggerStyle ) {
1668
+ element . css ( staggerStyle , '' ) ;
1669
+ }
1670
+ } , staggerTime * ONE_SECOND , false ) ;
1671
+ }
1646
1672
1647
1673
element . on ( css3AnimationEvents , onAnimationProgress ) ;
1648
1674
elementData . closeAnimationFns . push ( function ( ) {
1649
1675
onEnd ( ) ;
1650
1676
activeAnimationComplete ( ) ;
1651
1677
} ) ;
1652
1678
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
1679
elementData . running ++ ;
1658
1680
animationCloseHandler ( element , totalTime ) ;
1659
1681
return onEnd ;
@@ -1664,6 +1686,10 @@ angular.module('ngAnimate', ['ng'])
1664
1686
function onEnd ( cancelled ) {
1665
1687
element . off ( css3AnimationEvents , onAnimationProgress ) ;
1666
1688
element . removeClass ( activeClassName ) ;
1689
+ element . removeClass ( pendingClassName ) ;
1690
+ if ( staggerTimer ) {
1691
+ $timeout . cancel ( staggerTimer ) ;
1692
+ }
1667
1693
animateClose ( element , className ) ;
1668
1694
var node = extractElementNode ( element ) ;
1669
1695
for ( var i in appliedStyles ) {
@@ -1693,15 +1719,6 @@ angular.module('ngAnimate', ['ng'])
1693
1719
}
1694
1720
}
1695
1721
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 ;
1703
- }
1704
-
1705
1722
function animateBefore ( animationEvent , element , className , calculationDecorator ) {
1706
1723
if ( animateSetup ( animationEvent , element , className , calculationDecorator ) ) {
1707
1724
return function ( cancelled ) {
0 commit comments