From a23e5096ecacc90caa2c3377da563a9bc14e2f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Thu, 26 Sep 2013 14:29:18 -0400 Subject: [PATCH] fix($animate): ensure transition-property is not changed when only keyframe animations are in use Closes #3933 --- src/ngAnimate/animate.js | 12 ++++++++---- test/ngAnimate/animateSpec.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index af607568662b..7f37f143b4f9 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -627,8 +627,10 @@ angular.module('ngAnimate', ['ng']) //temporarily disable the transition so that the enter styles //don't animate twice (this is here to avoid a bug in Chrome/FF). - node.style[w3cTransitionProp + propertyKey] = 'none'; - node.style[vendorTransitionProp + propertyKey] = 'none'; + if(transitionTime > 0) { + node.style[w3cTransitionProp + propertyKey] = 'none'; + node.style[vendorTransitionProp + propertyKey] = 'none'; + } var activeClassName = ''; forEach(className.split(' '), function(klass, i) { @@ -637,8 +639,10 @@ angular.module('ngAnimate', ['ng']) //this triggers a reflow which allows for the transition animation to kick in element.prop('clientWidth'); - node.style[w3cTransitionProp + propertyKey] = ''; - node.style[vendorTransitionProp + propertyKey] = ''; + if(transitionTime > 0) { + node.style[w3cTransitionProp + propertyKey] = ''; + node.style[vendorTransitionProp + propertyKey] = ''; + } element.addClass(activeClassName); var css3AnimationEvents = [w3cAnimationEvent, vendorAnimationEvent, diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index adedeac4bf1f..a3a1d0b0ffb4 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -1270,6 +1270,36 @@ describe("ngAnimate", function() { expect(child.hasClass('ng-enter-active')).toBe(false); })); + it("should not set the transition property flag if only CSS animations are used", + inject(function($compile, $rootScope, $animate, $sniffer) { + + if (!$sniffer.animations) return; + + ss.addRule('.ani.ng-enter', 'my_animation 2s linear;' + + vendorPrefix + 'animation: my_animation 2s linear'); + + ss.addRule('.trans.ng-enter', 'transition:1s linear all;' + + vendorPrefix + 'transition:1s linear all'); + + var element = html($compile('
...
')($rootScope)); + var child = $compile('
...
')($rootScope); + child.css('transition-property','background-color'); + + $animate.enter(child, element); + $rootScope.$digest(); + + browserTrigger(child,'transitionend', { timeStamp: Date.now() + 2000 }); + + expect(child.css('transition-property')).toBe('background-color'); + child.remove(); + + child.attr('class','trans'); + $animate.enter(child, element); + $rootScope.$digest(); + + expect(child.css('transition-property')).not.toBe('background-color'); + })); + it("should skip animations if the browser does not support CSS3 transitions and CSS3 animations", inject(function($compile, $rootScope, $animate, $sniffer) {