Casos de éxito de animaciones basadas en desplazamientos

Swetha Gopalakrishnan
Swetha Gopalakrishnan
Saurabh Rajpal
Saurabh Rajpal

Las animaciones controladas por desplazamiento son un patrón de UX común en la Web. Una animación basada en el desplazamiento está vinculada a la posición de desplazamiento de un contenedor de desplazamiento. Esto significa que, a medida que te desplazas hacia arriba o hacia abajo, la animación vinculada se arrastra hacia adelante o hacia atrás en respuesta directa. Algunos ejemplos son los efectos como las imágenes de fondo con paralaje o los indicadores de lectura que se mueven a medida que te desplazas.

Por lo general, los desarrolladores crean animaciones controladas por desplazamiento con JavaScript para responder a los eventos de desplazamiento en el subproceso principal. Esto dificulta la creación de animaciones basadas en el desplazamiento con un buen rendimiento y sincronizadas con el desplazamiento, ya que los eventos de desplazamiento se entregan de forma asíncrona y, a menudo, generan tirones debido a que se ejecutan en el subproceso principal.

Sin embargo, como parte de las nuevas funciones de CSS y de IU que se lanzarán en los navegadores, ahora puedes crear animaciones declarativas basadas en el desplazamiento. Con Scroll Timelines y View Timelines, nuevos conceptos que se integran con la API de Web Animations (WAAPI) y la API de CSS Animations existentes, ahora puedes tener animaciones basadas en el desplazamiento fluidas que se ejecutan fuera del subproceso principal con solo unas pocas líneas de código. En este caso de éxito, descubre cómo Tokopedia, redBus y Policybazaar ya se benefician de esta nueva función.

Browser Support

  • Chrome: 115.
  • Edge: 115.
  • Firefox: behind a flag.
  • Safari: 26.

Source

Tokopedia

Tokopedia reemplazó sus implementaciones personalizadas anteriores de JavaScript por animaciones controladas por desplazamiento para optimizar el rendimiento de sus páginas y mejorar la experiencia de navegación general en su embudo de conversiones de comercio electrónico.

Logramos reducir hasta el 80% de nuestras líneas de código en comparación con el uso de eventos de desplazamiento convencionales de JavaScript y observamos que el uso promedio de la CPU se redujo del 50% al 2% durante el desplazamiento. Andy Wihalim, Ingeniero de software sénior, Tokopedia

Visibilidad cambiante animada de la barra fija superior según la posición de desplazamiento del usuario.

Código

La siguiente implementación usa la función scroll() para establecer un cronograma anónimo del progreso del desplazamiento para controlar el progreso de la animación CSS. La visibilidad de la barra fija superior cambia según la posición de desplazamiento dentro del animationRange definido.

const toggleBar = keyframes({
  to: { height: 48 },
});

export const cssWrapper = css({
  position: 'fixed',
  left: 0,
  width: '100vw',
  pointerEvents: 'none',
  marginTop: 120,
  height: 0,
  overflow: 'hidden',
  display: 'flex',
  flexDirection: 'column',
  justifyContent: 'flex-end',
  animation: `${toggleBar} linear both`,
  animationTimeline: 'scroll()',
  animationRange: '20px 70px',
});

redBus

redBus tiene diferentes animaciones para dispositivos móviles y computadoras en su página de destino de actividades, que se muestra al principio del embudo de conversión a todos los usuarios. Con las animaciones basadas en el desplazamiento, pudieron reemplazar estas implementaciones personalizadas de JavaScript por CSS para lograr el mismo efecto.

Casos de uso

Galería de fotos con Revelación de imágenes (para dispositivos móviles) y Cover Flow (para computadoras).

Efecto de revelación de imágenes con animación controlada por desplazamiento para cargar imágenes en la galería de fotos de "Cosas para hacer" de redBus.

Código (dispositivos móviles)

En el ejemplo anterior, Tokopedia usó el cronograma anónimo del progreso del desplazamiento. En el siguiente código, redBus usa el cronograma del progreso de visualización con nombre. La animación cambia los valores opacity y clip-path del elemento <img> dentro del animation-range definido en el elemento de desplazamiento principal más cercano, que, en este caso, es el elemento de desplazamiento de la galería de fotos.

const reveal = keyframes`
   from {
       opacity: 0;
       clip-path: inset(45% 20% 45% 20%);
   }
   to {
       opacity: 1;
       clip-path: inset(0% 0% 0% 0%);
   }`

const CardImage = styled.div`
   width: 100%;
   height: 100%;
   img {
       border-top-left-radius: 0.75rem;
       border-top-right-radius: 0.75rem;
       height: 100%;
       width: 100%;
       object-fit: cover;
       view-timeline-name: --revealing-image;
       view-timeline-axis: block;
  
       /* Attach animation, linked to the  View Timeline */
       animation: linear ${reveal} both;
       animation-timeline: --revealing-image;
  
       /* Tweak range when effect should run*/
       animation-range: entry 25% cover 50%;
   }
`;

Nos complace mucho ver esta función, ya que es una combinación perfecta de rendimiento y una mejor experiencia, lo que impulsa nuestros indicadores de Experiencia de la página para el SEO. Además, la curva de aprendizaje mínima hace que sea una herramienta indispensable para todos los sitios web de comercio electrónico. También recibimos comentarios positivos y asistencia de otros equipos para aprovechar SDA en más recorridos del usuario.— Amit Kumar, gerente de Ingeniería sénior, redBus.

Policybazaar

Comparar planes de seguros es una acción clave repetida que realizan los usuarios para guiar su proceso de toma de decisiones. Con las animaciones controladas por desplazamiento, Policybazaar redujo el tamaño de los elementos de baja prioridad en respuesta al desplazamiento del usuario por la tabla. Esto generó una experiencia de desplazamiento fluida y mejoró la legibilidad.

Con las animaciones controladas por desplazamiento, pudimos maximizar el espacio del viewport para que el usuario comparara planes, lo que garantizó una experiencia de lectura enfocada y sin desorden.—Rishabh Mehrotra, jefe de diseño de la unidad de negocios de seguros de vida, PolicyBazaar.

Animación controlada por desplazamiento animate-timeline en la tabla de comparación de planes en la LOB (línea de negocios) de Inversión y Vida.

Código

Al igual que en el ejemplo anterior de Tokopedia, Policybazaar usa la función scroll() para establecer un cronograma anónimo del progreso del desplazamiento para controlar el progreso de la animación CSS. En este caso, se reduce el tamaño de la fuente y se atenúa el encabezado según la posición de desplazamiento dentro del animation-range definido.

@supports (animation-timeline: scroll()) {
.plan-comparison .inner-header {
animation: move-and-fade-header linear both;
}
.plan-comparison .left-side {
animation: shrink-name linear both;
}
.plan-comparison .inner-header, .plan-comparison .left-side {
animation-timeline: scroll();
animation-range: 0 150px;
}
}

@keyframes move-and-fade-header {
  to {
    translate: 0% -5%;
    top:103px;
}
}

@keyframes shrink-name {
  to {
    font-size: 1.5rem;
  }
}

Animaciones controladas por el desplazamiento como patrón común en todo el recorrido del usuario

Todas las empresas de comercio electrónico destacadas usaron animaciones controladas por desplazamiento en las páginas con tarjetas, y animaron las tarjetas para atraer la atención del usuario hacia ellas . En los siguientes ejemplos, se muestran efectos de desplazamiento en tarjetas en diferentes partes del recorrido del usuario. Por lo general, esto se logra con un cronograma anónimo del progreso de la vista para controlar el progreso de la animación CSS personalizada, como se muestra en el siguiente fragmento de CSS.

@keyframes animate-in {
 0% { opacity: 0; transform: translateY(10%); }
 100% { opacity: 1; transform: translateY(0); }
}

@keyframes animate-out {
 0% { opacity: 1; transform: translateY(0); }
 100% { opacity: 0; transform: translateY(-10%); }
}

.flyin_animate {
   animation: animate-in linear forwards;
   animation-timeline: view();
   animation-range: entry;
}

redBus (página principal)

Efecto de desplazamiento de la animación para cargar tarjetas de productos en la página de destino de "Cosas para hacer" de redBus.

Policybazaar (página de la ficha del producto)

Animación controlada por desplazamiento de entrada y salida gradual de las tarjetas de productos en la LOB (línea de negocio) de Inversión y Vida.

Tokopedia (página de detalles del producto)

Animación de fundido de entrada y salida mientras se desplaza por los productos que se muestran en la lista.

Aspectos que debes tener en cuenta cuando usas la API de Scroll-driven Animations

Es posible incluir animaciones basadas en desplazamientos con polyfill para navegadores que no las admiten, por ejemplo, con el polyfill de Scroll-timeline. Si lo haces, deberás realizar pruebas adicionales para asegurarte de que funcione bien junto con tu framework y de que los navegadores que usan el polyfill no experimenten fallas en la animación ni experiencias inestables.

Desde CSS, puedes usar @supports para probar la compatibilidad con animation-timeline antes de usar animaciones basadas en desplazamientos. Por ejemplo:

@supports (animation-timeline: scroll()) {

}

Recursos

Explora los otros artículos de esta serie, en los que se explica cómo las empresas de comercio electrónico se beneficiaron del uso de nuevas funciones de CSS y de IU, como View Transitions, Popover, Container Queries y el selector has().