Las aplicaciones web a veces están equipadas con animaciones. Algunas 
animaciones son desencadenadas por eventos, como por ejemplo cuando el 
usuario pasa el mouse sobre un botón y este progresivamente expande su 
tamaño, o simplemente pueden suceder sin la interacción del usuario, un 
ejemplo seria un cuadrado parpadeante en la pantalla. Las animaciones 
proporcionan efectos visuales a las aplicaciones basadas en la web para 
hacerlas más interactivas y visualmente atractivas. Algunas aplicaciones
 son más adecuadas a tener elementos animados mas que otras, como en el 
caso de juegos interactivos. 
    Actualmente existen diferentes 
formas de lograr estos efectos visuales en la web. En este artículo voy a
 analizar los enfoques de animación web utilizando JavaScript y CSS. 
¿Qué método es más eficiente y bajo qué circunstancias? Cuál método es 
más fácil de implementar y mantener? 
    En el pasado, Flash era
 un método muy popular para crear aplicaciones animadas; sin embargo, 
llegada la demanda de dispositivos mobiles la utilización de Flash se 
volvió obsoleta. Esto se debió a que el rendimiento de la animación se 
convirtió en una aspecto muy importante y Flash no ofrecía las mejores 
capacidades. Mas adelante se introdujeron librerías de JavaScript, como 
es el caso de jQuery, que ofrece animaciones basadas en JavaScript. Sin 
embargo, tan conveniente como jQuery fue para los desarrolladores, este 
también quedo corto en lograr un alto rendimiento de animación [3]. 
Luego, la introducción de CSS3 se convirtió una mejor solución para 
animaciones que no implicaban instalar ninguna librería externa para 
nuestro proyecto, y por lo tanto era una opción prometedora para 
animaciones más eficientes. 
Hay dos formas diferentes de utilizar CSS para crear animaciones. Estos son Propiedades de animaciones y transiciones CSS: 
Transiciones
 CSS: muestra animaciones entre dos estados. Estos podrían ser, por 
ejemplo, animando un botón entre su estado de reposo y un hover. El 
botón podría mostrar un efecto de desvanecimiento mientras el usuario 
intenta seleccionar este botón. Las transiciones con CSS tienen 
diferentes propiedades que definen la propiedad de animación de destino,
 la duración de la animación, suavizado del efecto y retraso del mismo. 
Tanto la duración como el retraso se miden en segundos. 
Animaciones
 CSS: asigna animaciones entre un conjunto de propiedades iniciales y 
finales. Esta consta de keyframes clave para la progresión de las 
animaciones y el estilo de la apariencia de la misma [2]. 
   
 Ambos están programados de diferentes formas, pero también comparten 
deficiencias similares. Las animaciones utilizando CSS no permiten una 
gran interacción entre el programador/usuario y la animación. Por 
ejemplo, no hay forma de encontrar un keyframe especifico en una 
animacion programada solo con CSS, también una vez que la animación ha 
comenzado no se puede revertir o llevar a ningún punto en particular. 
Aparte de esto, solo algunos navegadores permiten al usuario pausar y 
reanudar una animación creada con CSS. Cuando se trata de valores 
relativos, las animaciones hechas con CSS no ofrecen gran flexibilidad 
tampoco, lo que significa que si el programador desea instruir a la 
animación un elemento para mover 50px a la derecha de donde comienzan 
las animaciones, no sería posible hacerlo simplemente utilizando 
animaciones con CSS [3]. 
    Otra alternativa popular para 
animar elementos de aplicaciones web es utilizando JavaScript. Cómo 
mencione anteriormente, hay ciertas librerías de JavaScript que se 
pueden utilizar para producir animaciones de una manera simple para los 
desarrolladores. jQuery hizo un intento de lograr esto, pero este 
también se quedo corto con relación al rendimiento. Aparte de jQuery 
existe otra librería basada en JavaScritpt llamada GSAP (GreenSock 
Animation Platform) que se construyó específicamente para crear 
animaciones para la web, teniendo en cuenta la optimización y la 
eficiencia de estas tareas [3]. Sin embargo, existe un enfoque más 
estándar para crear animaciones JavaScript, y esto es la API de 
animaciones web que funciona dirigiéndose a elementos DOM [6]. 
  
  JavaScript proporciona ciertas funcionalidades que no son posibles 
utilizando simplemente animaciones basadas en CSS como son la 
posibilidad de pausar, reanudar, detener, y revertir una animación. Esto
 proporciona al usuario la capacidad de tener cierto control sobre la 
animación.  Esto hace que aplicación sea verdaderamente interactiva, una
 característica que no es posible con CSS [3]. Las animaciones 
desarrolladas con JavaScript también puede hacer uso de objetos, lo que 
hace posible integrar la Programación Orientada a Objetos a nuestras 
animaciones, permitiendo desarrollar diseños más complejos. Otra ventaja
 de JavaScript sobre las animaciones con CSS es poder animar otras 
objetos distintos de los elementos DOM [2]. 
    Aparte de la 
interactividad y la facilidad de desarrollo, hay otro, incluso más 
importante aspecto al comparar dos métodos de programación. Aqui estamos
 hablando del rendimiento. Primero vamos a discutir qué propiedades y 
componentes son menos y más costosos de animar. Las propiedades más 
baratas para animar los navegadores son: posición, escala, rotación, y 
opacidad [4]. Ahora, las propiedades más caras de animar son las que 
cambian el diseño completo de la página junto con ellos, así como la 
pintura en la pantalla. Por ejemplo, si tenemos un elemento de página 
web con ancho y alto medidos en porcentaje junto a otros elementos, 
cambiar estas propiedades constantemente hará que el los elementos en el
 entorno tengan que recalcular sus valores tambien, lo que hace que esta
 sea una tarea muy costosa. Estos problemas relacionados al  rendimiento
 se pueden atribuir a ambos tipos: animaciones basadas con JavaScript y 
también con CSS. 
    Cuando se trata de subprocesos de 
animaciones CSS, así como animaciones web basadas en JavaScript se 
ejecutan en un hilo llamado "hilo compositor". Este hilo es diferente 
del hilo donde el navegador hace la mayor parte del trabajo en cuanto a 
estilo, diseño, pintura y ejecución de JavaScript. El nombre de este 
hilo es "hilo principal". El hecho de que haya una hilo separado para 
CSS y animaciones web para ejecutar significa que se ejecutarán 
independientemente de la carga de trabajo que lleva el navegador de 
otros tareas. Esto hace que las animaciones basadas en CSS y JavaScript 
funcionen igualmente bien en eso sentido [2]. Otra ventaja que hace que 
las animaciones CSS y JavaScript se ejecuten sin problemas es la ventaja
 que ambos obtienen del hardware. La capa de GPU permite el aislamiento 
los elementos de las de animaciones que, a su vez, facilitan que la GPU 
mueva esas capas y las componga mas tarde. Sin embargo, para que 
JavaScript aproveche esta ventaja del GPU una capas que necesita para 
hacer uso de transformaciones 3D y matrices. La única desventaja de la 
estratificación de GPU sería un pequeño retraso al iniciar ambas 
aplicaciones debido al cálculo de la capa del navegador y la carga a la 
hora de la GPU [3]. 
    En conclusión, tanto las animaciones 
basadas en JavaScript como en CSS funcionan relativamente y casi 
igualmente bien cuando JavaScript está bien optimizado. La decisión de 
elegir uno sobre el otro tiene más que ver con la flexibilidad y la 
complejidad de la animación que quiere ser lograda. Para proyectos más 
pequeños y simples, se recomienda utilizar animaciones CSS. Vienen con 
la ventaja de ser más fáciles de escribir. Para animaciones más 
complejas que requieren pausar, detener, reanudar y ralentizar las 
animaciones, JavaScript es necesario. La API de animaciones web es la 
herramienta de referencia para el desarrollo de animaciones JavaScript; 
sin embargo, hay otras librerías de animación de alto rendimiento como 
GSAP.
Referencias:
[1] https://developers.google.com/web/fundamentals/design-and-ux/animations/css-vs-javascript
Updated 2019
[2]https://developers.google.com/web/fundamentals/design-and-ux/animations/animations-andperformance#
css-vs-javascript-performance Updated 2019
[3] https://css-tricks.com/myth-busting-css-animations-vs-javascript/ 2014 - Updated 2017
[4] https://www.html5rocks.com/en/tutorials/speed/high-performance-animations/