Cómo hacer animaciones con AngularJS: El servicio $animate

En este post explicaré cómo realizar animaciones con angularJS. Aunque AngularJS nos proporcione el servicio $animate, no vamos a interactuar con él directamente. En su lugar usaremos CSS ya que AngularJS no proporciona ninguna función como podría ser jQuery.

Para poder animar con AngularJS será preciso llamar al módulo ngAnimate, por tanto, será preciso descargarlo de la página oficial y llamarlo de la misma manera que ngRoute.

Antes de continuar, es necesario que sepas en que consisten las transiciones y animaciones en CSS. Aunque voy a emplear ejemplos sencillos, te recomiendo que veas este post sobre transiciones y este sobre animaciones en CSS para que puedas sacar el máximo partido a este tutorial.

Aplicar animaciones con angularJS

Como comenté anteriormente, no trabajaremos directamente con el servicio $animate. En su lugar, vamos a emplear directivas y nomenclaturas especiales (clases) cuando escribamos nuestro CSS ya que el servicio $animate tiene como medio los ganchos (hooks) que empleemos en nuestro CSS y serán los que activan las animaciones.

En el siguiente ejemplo lo que vamos hacer es que al pulsar un botón mostremos un texto. Para que el texto no se muestre de manera brusca, emplearemos una transición,

Comenzamos llamando al modulo ngAnimate y creamos un controlador que se encargará de gestionar la animación. La variable activarAnimacion se encargará de mostrar o no el texto.

El siguiente paso será crear el CSS que será el eje principal de la animación.

En principio no parece algo nuevo pero, salvo por 2 clases que nos proporciona Angular: ng-enter y ng-enter-acitve. Estas clases representan eventos que indican el inicio de la animación  (ng-enter) y su respectivo fin (ng-enter-active) y serán los ganchos que empleará ngAnimate.

Y el HTML con las directivas de Angular correspondientes

Al pulsar el boton (ng-click) el valor de activarAnimacion será su contrario (de false a true y viceversa). Y mediante la directiva ng-if , la cuál dependerá del valor activarAnimacion, se encargará de ejecutar la animación. Y por qué de esto? Cuando ng-if contenga true, al div ‘mi-animacion’ le añadirá la clase ng-enter-active. Muchas directivas de angular ejecutan animaciones cuando un evento ocurre gracias al servicio $animate.

Directivas y eventos de animación

Directiva Eventos
ngRepeat enter, leave, y move
ngView enter y leave
ngInclude enter y leave
ngSwitch enter y leave
ngIf enter y leave
ngClass add yremove
ngShow y ngHide add y remove (ngHide)

En el ejemplo anterior empleamos ngIf, por tanto, los eventos ng-enter y ng-leave son soportados. Vamos a darle la misma transición cuando se quiera ocultar el texto.

En esta ocasión sería al revés, empezamos con opacidad 1 y cuando la animación se complete será 0. Todo ello con una transición de 0.5s. Basicamente, el sufijo -active nos sirve para indicar el inicio y final de la animación. 

See the Pen Animaciones en AngularJS – Ejemplo 1 by guidacode (@guidacode) on CodePen.0

Cuando ocurren los eventos

Vamos a ver un poco más en detalle cuando ocurren los eventos como enter, leave o add y qué directivas están implicadas.

Evento Descripción Clases
enter Cuando un contenido va a “aparecer”. ng-enter, ng-enter-active
leave El elemento va a “desaparecer”. ng-leave, ng-leave-active
move Solo sucede en ngRepeat, se produce cuando un elemento del DOM es movido de una posicion a otra. ng-move, ng-move-active
add Cuando se agrega una clase CSS ng-add, ng-add-active
remove Cuando se quita una clase CSS ng-remove, ng-remove-active

Voy a poner un último ejemplo de animaciones con AngularJS. Supongamos que tenemos una lista de enemigos y queremos darle una animación tanto a la hora de agregar como eliminar. Comenzamos declarando el controlador que contendrá la lista

Además de la lista, tenemos 2 funciones que serán llamados por los botones. La función agregar enemigo lo que hace es añadir al array de enemigos el enemigo que creamos en el formulario. En cuanto la función eliminarEnemigo(), está ascoaido a un botón que se crea junto la lista. Al recorrer la lista en el ng-repeat, que veremos a continuación, también le asignamos el índice como parámetro para que luego podamos eliminar el elemento del array con splice().

Y ahora el diseño y las animaciones

Esta vez vamos a emplear animaciones con CSS. Básicamente cuando se añada un elemento del a la lista (ng-enter), partirá la “izquierda de todo” invisible y se irá desplazando hacia la derecha hasta que se muestre (margin-left:0). Como parte con una opacidad de 0 y termina con una de 1, el elemento a medida que avance irá apareciendo suavemente. Al eliminar un elemento (ng-leave) hará lo contrario, empezará con opacidad e irá despareciendo a medida que se desplaza. Todo ello con una transición de 1 segundo.

See the Pen Animaciones en AngularJS – Ejemplo 2 by guidacode (@guidacode) on CodePen.0

Espero que os haya gustado este tutorial sobre animaciones con AngularJS. A seguir picando 🙂