Animaciones con mejor rendimiento usando KUTE.js: Parte 1, Introducción
Spanish (Español) translation by Eva Collados Pascual (you can also view the original English article)
KUTE.js es un motor de animación basado en JavaScript que se centra en el rendimiento y la eficiencia de la memoria mientras anima diferentes elementos en una página web. Ya he escrito una serie de artículos sobre el uso de Anime.js para crear animaciones basadas en JavaScript. Esta vez aprenderemos sobre KUTE.js y cómo podemos usarlo para animar propiedades CSS, SVG y elementos de texto, entre otras cosas.
Instalación
Antes de profundizar en algunos ejemplos, vamos a instalar primero la librería. KUTE.js tiene un motor principal, y luego hay plugins para animar el valor de diferentes propiedades CSS, atributos SVG o texto. Puedes vincular directamente a la librería desde CDNs populares como cdnjs y jsDelivr.
1 |
<script src="https://cdnjs.cloudflare.com/ajax/libs/kute.js/1.6.2/kute.min.js"></script> |
2 |
<script src="https://cdn.jsdelivr.net/kute.js/1.6.2/kute.min.js"></script> |
También puedes instalar KUTE.js utilizando NPM o Bower con la ayuda de los siguientes comandos:
1 |
npm install --save kute.js |
2 |
bower install --save kute.js |
Una vez hayas incluido la librería en tus proyectos, podrás empezar a crear tus propias secuencias de animación.
Interpolar objetos
Al crear tu animación con KUTE.js, debes definir objetos de instrucción. Estos objetos de interpolación proporcionan toda la información relacionada con la animación para un elemento o elementos determinados. Esto incluye el propio elemento, las propiedades que deseas animar, la duración de la animación y otros atributos como el recuento de iteraciones, el retraso o el desplazamiento.
Puedes utilizar el método .to() o el método .fromTo() para animar un conjunto de propiedades CSS de un valor a otro. El método .to() anima las propiedades de su valor predeterminado o su valor calculado/actual a un valor final proporcionado. En el caso del método .fromTo(), debes proporcionar los valores de animación inicial y final.
El método .to() es útil cuando no conoces el valor actual o predeterminado de la propiedad que deseas animar. Una desventaja importante de este método es que la librería tiene que calcular el valor actual de todas las propiedades por sí misma. Esto da como resultado un retraso de unos milisegundos después de invocar .start() para iniciar la animación.
El método .fromTo() te permiten especificar, por ti mismo, los valores de animación inicial y final. Esto puede mejorar marginalmente el rendimiento de las animaciones. Aquí también puedes especificar las unidades para los valores iniciales y finales y evitar cualquier sorpresa durante el transcurso de la animación. Una desventaja de usar .fromTo() es que no podrás apilar varias propiedades de transformación en tablas encadenadas. En tales casos, tendrás que utilizar el método .to().
Recuerda que tanto .fromTo() como .to() están diseñados para usarse cuando se animan elementos individuales. Si deseas animar varios elementos a la vez, tendrás que utilizar .allTo() o .allFromTo(). Estos métodos funcionan igual que sus homólogos de un solo elemento y heredan todos sus atributos. También obtienen un atributo offset adicional que determina el retraso entre el inicio de la animación para distintos elementos. Este desplazamiento se define en milisegundos.
Este es un ejemplo que anima la opacidad de tres cuadrados diferentes en secuencia.
El siguiente JavaScript se utiliza para crear la secuencia de animación anterior:
1 |
var theBoxes = document.querySelectorAll(".box"); |
2 |
var startButton = document.querySelector(".start"); |
3 |
|
4 |
var animateOpacity = KUTE.allFromTo( |
5 |
theBoxes, |
6 |
{ opacity: 1 }, |
7 |
{ opacity: 0.1 }, |
8 |
{ offset: 700 } |
9 |
);
|
10 |
|
11 |
startButton.addEventListener( |
12 |
"click", |
13 |
function() { |
14 |
animateOpacity.start(); |
15 |
},
|
16 |
false
|
17 |
);
|
Todos los cuadrados anteriores tienen una clase box que se ha utilizado para seleccionarlos todos utilizando el método querySelectorAll(). El método allFromTo() en KUTE.js se utiliza para animar la opacidad de estos cuadros de 1 a 0,1 con un tiempo entre una y otra de 700 milisegundos. Como puedes ver, el objeto de interpolación no inicia la animación por sí mismo. Tienes que llamar al método start() para hacerlo.
Control de la reproducción de la animación
En la sección anterior, usamos el método start() para iniciar nuestras animaciones. La librería KUTE.js también proporciona algunos otros métodos que se pueden utilizar para controlar la reproducción de la animación.
Por ejemplo, puedes detener cualquier animación que esté actualmente en curso con la ayuda del método stop(). Ten en cuenta que puedes usar este método para detener la animación solo de los objetos que se han almacenado en una variable. La animación de cualquier objeto de interpolación que se haya creado sobre la marcha no se puede detener usando este método.
También puedes simplemente pausar una animación con la ayuda del método pause(). Esto es útil cuando deseas reanudar la animación de nuevo en un momento posterior. Puedes usar resume() o play() para reanudar cualquier animación que se haya pausado.
El ejemplo siguiente es una versión actualizada de la demostración anterior a la que hemos añadido los cuatro métodos.
Aquí está el código JavaScript necesario para agregar la funcionalidad de inicio, parada, reproducción y pausa.
1 |
var theBoxes = document.querySelectorAll(".box"); |
2 |
var startButton = document.querySelector(".start"); |
3 |
var stopButton = document.querySelector(".stop"); |
4 |
var pauseButton = document.querySelector(".pause"); |
5 |
var resumeButton = document.querySelector(".resume"); |
6 |
|
7 |
var animateOpacity = KUTE.allFromTo( |
8 |
theBoxes, |
9 |
{ opacity: 1 }, |
10 |
{ opacity: 0.1 }, |
11 |
{ offset: 700, duration: 2000 } |
12 |
);
|
13 |
|
14 |
startButton.addEventListener( |
15 |
"click", |
16 |
function() { |
17 |
animateOpacity.start(); |
18 |
},
|
19 |
false
|
20 |
);
|
21 |
|
22 |
stopButton.addEventListener( |
23 |
"click", |
24 |
function() { |
25 |
animateOpacity.stop(); |
26 |
},
|
27 |
false
|
28 |
);
|
29 |
|
30 |
pauseButton.addEventListener( |
31 |
"click", |
32 |
function() { |
33 |
animateOpacity.pause(); |
34 |
},
|
35 |
false
|
36 |
);
|
37 |
|
38 |
resumeButton.addEventListener( |
39 |
"click", |
40 |
function() { |
41 |
animateOpacity.resume(); |
42 |
},
|
43 |
false
|
44 |
);
|
He cambiado la duración de la animación a 2.000 milisegundos. Esto nos proporciona suficiente tiempo para presionar diferentes botones y ver cómo afectan a la reproducción de la animación.
Encadenar juntas interpolaciones
Puedes utilizar el método chain() para encadenar diferentes interpolaciones. Una vez se hayan encadenado diferentes interpolaciones, invocan el método start() en otras interpolaciones una vez haya terminado su propia animación.
De esta manera, podrás reproducir diferentes animaciones en secuencia. Puedes encadenar diferentes interpolaciones entre sí para reproducirlas en bucle. El siguiente ejemplo lo clarifica:
1 |
var animateOpacity = KUTE.allFromTo( |
2 |
theBoxes, |
3 |
{ opacity: 1 }, |
4 |
{ opacity: 0.1 }, |
5 |
{ offset: 100, duration: 800 } |
6 |
);
|
7 |
|
8 |
var animateRotation = KUTE.allFromTo( |
9 |
theBoxes, |
10 |
{ rotate: 0 }, |
11 |
{ rotate: 360 }, |
12 |
{ offset: 250, duration: 800 } |
13 |
);
|
14 |
|
15 |
opacityButton.addEventListener( |
16 |
"click", |
17 |
function() { |
18 |
animateOpacity.start(); |
19 |
},
|
20 |
false
|
21 |
);
|
22 |
|
23 |
rotateButton.addEventListener( |
24 |
"click", |
25 |
function() { |
26 |
animateRotation.start(); |
27 |
},
|
28 |
false
|
29 |
);
|
30 |
|
31 |
chainButton.addEventListener( |
32 |
"click", |
33 |
function() { |
34 |
animateOpacity.chain(animateRotation); |
35 |
animateOpacity.start(); |
36 |
},
|
37 |
false
|
38 |
);
|
39 |
|
40 |
loopButton.addEventListener( |
41 |
"click", |
42 |
function() { |
43 |
animateOpacity.chain(animateRotation); |
44 |
animateRotation.chain(animateOpacity); |
45 |
animateOpacity.start(); |
46 |
},
|
47 |
false
|
48 |
);
|
Ya teníamos una interpolación que anima la opacidad. Ahora hemos añadido otra que anima la rotación de nuestros cuadrados. Los dos primeros botones animan la opacidad y la rotación de uno en uno. El tercer botón desencadena el encadenamiento de animateOpacity con animateRotation.
El encadenamiento en sí no inicia la animación, por lo que también usamos el método start() para iniciar la animación de opacidad. El último botón se utiliza para encadenar las dos interpolaciones entre sí. Esta vez, las animaciones siguen reproduciéndose indefinidamente una vez que se han iniciado. Aquí tienes una demostración de CodePen que muestra todo el código anterior en acción:
Para entender completamente cómo funciona el encadenamiento, tendrás que presionar los botones en una secuencia específica. Primero haz clic en el botón Animate Opacity y verás que la animación de opacidad se reproduce una sola vez y después no pasa nada más. Ahora, pulsa el botón Animate Rotación y verás que los cuadrados giran una vez y después no pasa nada más.
Después de eso, presiona el botón Chain Animations y verás que la animación de opacidad se reproduce primero y, una vez que completa su iteración, la animación de rotación comienza a reproducirse por sí sola. Esto ocurre porque la animación de rotación ahora está encadenada a la animación de opacidad.
Ahora, pulsa el botón Animate Opacity de nuevo y verás que tanto la opacidad como la rotación se animan secuencialmente. Esto se debe a que ya habían sido encadenados antes de haber hecho clic en Chain Animations.
En este punto, al pulsar el botón Animate Rotation solo se animará la rotación. La razón de este comportamiento es que solo hemos encadenado la animación de rotación a la animación de opacidad. Esto significa que los cuadrados rotarán cada vez que se anime la opacidad, pero una animación de rotación no significa que la opacidad también se anime.
Por último, puedes hacer clic en el botón Play in a Loop. Esto encadenará las animaciones entre sí, y una vez que eso suceda, las animaciones seguirán reproduciéndose en un bucle indefinido. Esto se debe a que el final de una animación desencadena el inicio de la otra animación.
Reflexiones finales
En este tutorial introductorio de KUTE.js, aprendiste sobre los conceptos básicos de la librería. Empezamos con la instalación y luego pasamos a diferentes métodos que puedes usar para crear objetos de interpolación.
También has aprendido a controlar la reproducción de una animación y a encadenar diferentes interpolaciones. Una vez entiendas completamente el encadenamiento, podrás crear interesantes animaciones con esta librería.
En el siguiente tutorial de esta serie, aprenderás a animar diferentes tipos de propiedades CSS mediante KUTE.js.



