Estudos de caso de animações com rolagem

Swetha Gopalakrishnan
Swetha Gopalakrishnan
Saurabh Rajpal
Saurabh Rajpal

As animações de rolagem são um padrão comum de UX na Web. Uma animação acionada por rolagem é vinculada à posição de rolagem de um contêiner de rolagem. Isso significa que, conforme você rola para cima ou para baixo, a animação vinculada vai para frente ou para trás em resposta direta. Exemplos disso são efeitos como imagens de fundo com efeito paralaxe ou indicadores de leitura que se movem conforme você rola a tela.

Normalmente, os desenvolvedores criam animações controladas por rolagem usando JavaScript para responder a eventos de rolagem na linha de execução principal. Isso dificulta a criação de animações de rolagem eficientes que estejam sincronizadas com a rolagem, já que os eventos de rolagem são entregues de forma assíncrona e geralmente causam instabilidade por estarem na linha de execução principal.

No entanto, como parte dos novos recursos de CSS e UI que estão chegando aos navegadores, agora é possível criar animações declarativas de rolagem. Com as linhas do tempo de rolagem e de visualização, novos conceitos que se integram à API Web Animations (WAAPI) e à API CSS Animations, agora é possível ter animações suaves acionadas por rolagem executadas fora da linha de execução principal com apenas algumas linhas de código. Neste estudo de caso, descubra como a Tokopedia, a redBus e a Policybazaar já estão aproveitando esse novo recurso.

Browser Support

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

Source

Tokopedia

A Tokopedia substituiu as implementações personalizadas de JavaScript anteriores por animações baseadas em rolagem para otimizar o desempenho da página e melhorar a experiência de navegação geral no funil de conversão de e-commerce.

Conseguimos reduzir até 80% das nossas linhas de código em comparação com o uso de eventos de rolagem JavaScript convencionais e observamos que o uso médio da CPU diminuiu de 50% para 2% durante a rolagem. Andy Wihalim, engenheiro de software sênior, Tokopedia

Mudança animada na visibilidade da barra fixa superior com base na posição de rolagem do usuário.

Código

A implementação a seguir usa a função scroll() para definir uma linha do tempo anônima de progresso de rolagem para controlar o progresso da animação CSS. A visibilidade da barra fixa superior muda de acordo com a posição de rolagem no 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

O redBus tem animações diferentes para dispositivos móveis e computadores na página de destino coisas para fazer, que é mostrada no início do funil de conversão para todos os usuários. Com as animações de rolagem, eles puderam substituir essas implementações personalizadas de JavaScript por CSS para alcançar o mesmo efeito.

Casos de uso

Galeria de fotos com Revelação de imagem (para dispositivos móveis) e Cover Flow (para computadores).

Efeito de revelação de imagem de animação controlada por rolagem para carregar imagens na galeria de fotos "O que fazer" do redBus.

Código (dispositivos móveis)

No exemplo anterior, a Tokopedia usou a linha do tempo anônima de progresso de rolagem. No código a seguir, a redBus usa a linha do tempo do progresso de visualização nomeada. A animação muda o opacity e o clip-path do elemento <img> no animation-range definido dentro do botão de rolagem ancestral mais próximo do elemento, que é o botão de rolagem da galeria de fotos neste caso.

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%;
   }
`;

Estamos muito felizes com esse recurso, já que ele é uma combinação perfeita de performance com uma experiência melhor, impulsionando nossos indicadores de experiência na página para SEO. Além disso, a curva de aprendizado mínima faz dele um recurso indispensável para todos os sites de e-commerce. Também recebemos feedback positivo e apoio de outras equipes para aproveitar o SDA em mais jornadas do usuário.— Amit Kumar, gerente sênior de engenharia, redBus.

Policybazaar

Comparar planos de seguro é uma ação principal repetida pelos usuários para orientar o processo de tomada de decisão. Usando animações controladas por rolagem, a Policybazaar diminuiu o tamanho dos elementos de baixa prioridade em resposta à rolagem da tabela pelo usuário. Isso resultou em uma experiência de rolagem suave e melhorou a legibilidade.

Com as animações baseadas em rolagem, maximizamos o espaço da janela de visualização para que o usuário compare planos, garantindo uma experiência de leitura focada e sem distrações.—Rishabh Mehrotra, chefe de design da BU de seguros de vida, PolicyBazaar.

Animação controlada por rolagem animate-timeline na tabela de comparação de planos na LOB (linha de negócios) de investimentos e vida.

Código

Semelhante ao exemplo anterior da Tokopedia, a Policybazaar usa a função scroll() para definir uma linha do tempo anônima de progresso de rolagem para controlar o progresso da animação CSS. Nesse caso, diminuindo o tamanho da fonte e esmaecendo o cabeçalho com base na posição de rolagem dentro do 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;
  }
}

Animações baseadas em rolagem como um padrão comum na jornada do usuário

Todas as empresas de e-commerce em destaque usaram animações baseadas em rolagem em páginas com cards, animando-os para chamar a atenção do usuário . Os exemplos a seguir mostram efeitos de rolagem em cards em diferentes partes da jornada do usuário. Isso geralmente é feito usando uma linha do tempo anônima de progresso da visualização para controlar o progresso da animação CSS personalizada, como mostrado no snippet de CSS a seguir.

@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 inicial)

Efeito de entrada gradual da animação controlada por rolagem para carregar cards de produtos na página de destino "O que fazer" do redBus.

Policybazaar (página de informações do produto)

Animação de entrada e saída gradual de cards de produtos orientada por rolagem na LOB (linha de negócios) de investimentos e vida.

Tokopedia (página de detalhes do produto)

Animação de exibição e esmaecimento gradual ao rolar pelos produtos listados.

Considerações ao usar a API Scroll-driven Animations

É possível fazer polyfill de animações baseadas em rolagem para navegadores sem suporte, por exemplo, com o polyfill de linha do tempo de rolagem. Se você fizer isso, será necessário realizar mais testes para garantir que ele funcione bem com seu framework e que os navegadores que usam o polyfill não tenham falhas de animação ou experiências instáveis.

No CSS, use @supports para testar a compatibilidade com animation-timeline antes de usar animações de rolagem. Exemplo:

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

}

Recursos

Confira os outros artigos desta série, que mostram como as empresas de e-commerce se beneficiaram do uso de novos recursos de CSS e UI, como transições de visualização, popover, consultas de contêiner e o seletor has().