Mixin
O.AnimatableView
Mix this into an O.View class to automatically animate all changes to the view's O.View#layerStyles property.
"use strict";
( function ( NS ) {
NS.AnimatableView = {
Property
O.AnimatableView#animateLayer
- Boolean
If true, changes to the view's O.View#layerStyles property will be animated. If false, the changes will be set without animation.
animateLayer: true,
Property
O.AnimatableView#animateLayerDuration
- Number
The length of time in milliseconds to animate changes to the view's layer styles.
animateLayerDuration: 300,
Property
O.AnimatableView#animateLayerEasing
- Function
The easing function to use for the animation of the view's layer styles.
animateLayerEasing: NS.Easing.ease,
Property
O.AnimatableView#animating
- Number
The number of properties on the view currently being animated. Note, O.View#layerStyles counts as a single property.
animating: 0,
Method
O.AnimatableView#willAnimate()
This method is called by the O.Animation class when it begins animating a property on the object. Increments the <#animating> property.
willAnimate: function () {
this.increment( 'animating', 1 );
},
Method
O.AnimatableView#didAnimate()
This method is called by the O.Animation class when it finshes animating a property on the object. Decrements the <#animating> property.
didAnimate: function () {
this.increment( 'animating', -1 );
},
Property
O.AnimatableView#layerAnimation
- O.CSSStyleAnimation|O.StyleAnimation
An appropriate animation object (depending on browser support) to animate the layer styles. Automatically generated when first accessed.
layerAnimation: function () {
var Animation = NS.UA.cssProps.transition ?
NS.CSSStyleAnimation : NS.StyleAnimation;
return new Animation({
object: this,
element: this.get( 'layer' )
});
}.property(),
Method
O.AnimatableView#redrawLayerStyles( layer, oldStyles )
Overrides O.View#redrawLayerStyles to animate the change in styles instead of setting them immediately.
Parameters
layer | Element The view's layer. |
---|---|
oldStyles | Object|null The previous layer styles for the view. |
redrawLayerStyles: function ( layer, oldStyles ) {
var newStyles = this.get( 'layerStyles' ),
layerAnimation = this.get( 'layerAnimation' ),
setStyle = NS.Element.setStyle,
property, value;
// Animate
if ( this.get( 'animateLayer' ) && this.get( 'isInDocument' ) ) {
if ( !layerAnimation.current ) {
layerAnimation.current = oldStyles || newStyles;
}
layerAnimation.animate(
newStyles,
this.get( 'animateLayerDuration' ),
this.get( 'animateLayerEasing' )
);
}
// Or just set.
else {
layerAnimation.stop();
layerAnimation.current = newStyles;
setStyle( layer, 'transition-property', 'none' );
for ( property in newStyles ) {
value = newStyles[ property ];
if ( value !== oldStyles[ property ] ) {
setStyle( layer, property, value );
}
}
}
// Just remove styles that are not specified in the new styles, but were
// in the old styles
for ( property in oldStyles ) {
if ( !( property in newStyles ) ) {
setStyle( layer, property, null );
}
}
}
};
}( O ) );