Cuando hablamos de Motion UI (Motion User Interface) hablamos de una técnica o principio que se basa en utilizar animaciones, transiciones y otros recursos visuales para ayudar a atraer a los usuarios y a mejorar la apariencia y usabilidad del sitio web.
A continuación vamos a ver los principales componentes de Motion UI con algunos ejemplos de cómo los usamos en Chispa:
Con esto nos referimos a elementos que cambian su forma o tamaño, que se desplazan por la pantalla, o modificaciones de los mismos cuando pasamos el cursor sobre ellos.
Algunos ejemplos de esto:
Nuestra interacción favorita en Chispa se basa en animar distintos elementos del sitio a medida que el usuario lo recorre. Esto da sentido de profundidad e interacción, que mejora la experiencia e incentiva a continuar desplazándose o prestarle más atención a un elemento que está siendo animado por el scroll.
Les dejamos algunos ejemplos a continuación:
Reacciones a las interacciones con el sitio web. Por ejemplo, un icono de notificación rebota ligeramente para llamar la atención, un mensaje que aparece con algún efecto para indicar un error cuando queremos enviar un formulario, o uno de éxito cuando pudimos enviarlo satisfactoriamente.
Veamos algunas:
Hay distintas formas de hacer Motion UI en la web, desde animar con CSS hasta librerías de JavaScript. En Chispa utilizamos ambos métodos, pero los más complejos los hacemos con JavaScript, principalmente con GSAP (GreenSock Animation Platform) y Framer Motion, dos de las mejores herramientas para animar.
Para cerrar, les dejo un ejemplo de código de GSAP para hacer los círculos de colores que van apareciendo con el scroll y el link al demo:
gsap.registerPlugin(ScrollTrigger); gsap.set('.container', { autoAlpha: 1 }); const targets = gsap.utils.toArray('.item'); const timeline = gsap.timeline({ defaults: { overwrite: 'auto' }, scrollTrigger: { end: '+=1000', pin: true, pinSpacing: true, scrub: 1, start: 'top top', trigger: '.container' } }); const stagger = 0.3; const duration = 2; timeline.set(targets, { transformOrigin: 'center center' }); timeline .from(targets, { duration: duration, stagger: stagger, scale: function (index, target, list) { if (index === 0) { return 0.2; } return 0; } }) .to( targets, { duration: duration, stagger: stagger }, 0 );