MODULO 2.3

Scroll-Based Motion

Aprenda a criar animacoes vinculadas ao scroll para experiencias interativas e envolventes.

6
Topicos
~50
Minutos
Intermediario
Nivel
Pratico
Tipo
1

O Poder do Scroll

O scroll e um dos gatilhos mais poderosos para animacoes. Ele permite revelar conteudo conforme o usuario navega pela pagina, criando uma sensacao de controle e descoberta que mantem o visitante engajado.

🎯 Por que usar Scroll Animations?

  • Controle do Usuario: O visitante determina o ritmo da experiencia
  • Revelacao Progressiva: Conteudo aparece no momento certo
  • Narrativa Visual: Conta uma historia conforme o usuario navega
  • Engajamento: Mantem a atencao e incentiva a exploracao

📊 Dado Interessante

Sites com scroll animations bem implementadas tem em media 25% mais tempo de permanencia comparado a sites estaticos.

2

Intersection Observer API

A Intersection Observer API e uma API nativa do navegador que permite detectar quando elementos entram ou saem da viewport. E a forma moderna e performatica de implementar scroll animations.

⚙️ Configuracoes do Observer

root

O elemento que serve como viewport. null = viewport do navegador.

rootMargin

Margem ao redor do root. Ex: "0px 0px -100px 0px" para disparar 100px antes.

threshold

Porcentagem de visibilidade para disparar. 0.5 = 50% visivel.

💻 Exemplo de Codigo

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('visible');
    }
  });
}, {
  threshold: 0.1,
  rootMargin: '0px 0px -50px 0px'
});

document.querySelectorAll('.animate-on-scroll')
  .forEach(el => observer.observe(el));

Performance

Intersection Observer e muito mais eficiente que scroll events tradicionais. Ele roda de forma assincrona e nao bloqueia a thread principal, evitando problemas de performance.

3

Scroll Scrubbing

Scroll Scrubbing e a tecnica de vincular o progresso de uma animacao diretamente a posicao do scroll. Ao inves de animacoes que disparam e rodam automaticamente, voce controla o estado da animacao pelo scroll.

🆕 CSS Scroll-Driven Animations (Novo!)

O CSS agora suporta animacoes vinculadas ao scroll nativamente, sem JavaScript!

@keyframes reveal {
  from { opacity: 0; transform: translateY(50px); }
  to { opacity: 1; transform: translateY(0); }
}

.scroll-animate {
  animation: reveal linear;
  animation-timeline: view();
  animation-range: entry 0% cover 40%;
}

💻 JavaScript com Scroll Progress

function getScrollProgress() {
  const scrollTop = window.scrollY;
  const docHeight = document.documentElement.scrollHeight;
  const winHeight = window.innerHeight;
  return scrollTop / (docHeight - winHeight);
}

window.addEventListener('scroll', () => {
  const progress = getScrollProgress();
  element.style.opacity = progress;
  element.style.transform = `translateX(${progress * 100}px)`;
});

Fluxo do Scroll Scrubbing:

1. Detectar scroll
2. Calcular progresso
3. Aplicar estilos
4

Patterns de Reveal

Existem varios patterns classicos para revelar elementos no scroll. Cada um cria uma sensacao diferente e pode ser combinado para resultados mais interessantes.

Fade In

O elemento aparece suavemente, de transparente para opaco.

opacity: 0 → 1
➡️

Slide In

O elemento entra deslizando de um lado da tela.

translateX(-100px) → 0
🔍

Scale In

O elemento cresce de um tamanho pequeno ate o normal.

scale(0.8) → scale(1)
📊

Stagger

Multiplos elementos aparecem em sequencia, um apos o outro.

delay: 0.1s * index

💡 Dica Pratica

Combine fade + slide para resultados mais naturais. Evite usar apenas scale isolado, pois pode parecer abrupto. O stagger funciona muito bem em listas e grids.

5

Boas Praticas e Armadilhas

Scroll animations podem melhorar muito a experiencia, mas tambem podem prejudicar a performance e usabilidade se mal implementadas. Siga estas diretrizes.

✓ Fazer

  • Animar com transform e opacity
  • Usar throttle no scroll event
  • Testar performance em mobile
  • Preferir Intersection Observer
  • Manter animacoes sutis e rapidas

✗ Evitar

  • Animar tudo ao mesmo tempo
  • Animacoes muito longas (>500ms)
  • Ignorar prefers-reduced-motion
  • Animar width, height, top, left
  • Bloquear scroll para animacoes

Acessibilidade

Sempre respeite as preferencias do usuario para movimento reduzido:

@media (prefers-reduced-motion: reduce) {
  .animate-on-scroll {
    animation: none;
    opacity: 1;
    transform: none;
  }
}
6

Implementacao Pratica

Vamos ver algumas implementacoes praticas que voce pode usar imediatamente em seus projetos.

📦 Secoes que Aparecem no Scroll

/* CSS */
.reveal-section {
  opacity: 0;
  transform: translateY(30px);
  transition: all 0.6s ease-out;
}
.reveal-section.visible {
  opacity: 1;
  transform: translateY(0);
}
// JavaScript
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('visible');
    }
  });
}, { threshold: 0.1 });

document.querySelectorAll('.reveal-section')
  .forEach(el => observer.observe(el));

🖼️ Parallax Simples

const parallax = document.querySelector('.parallax-bg');

window.addEventListener('scroll', () => {
  const scrolled = window.scrollY;
  parallax.style.transform = `translateY(${scrolled * 0.5}px)`;
});

📊 Progress Bar do Scroll

/* CSS */
.scroll-progress {
  position: fixed;
  top: 0;
  left: 0;
  height: 4px;
  background: linear-gradient(90deg, #3b82f6, #8b5cf6);
  transform-origin: left;
  z-index: 9999;
}
// JavaScript
const progressBar = document.querySelector('.scroll-progress');

window.addEventListener('scroll', () => {
  const scrollTop = window.scrollY;
  const docHeight = document.documentElement.scrollHeight - window.innerHeight;
  const progress = scrollTop / docHeight;
  progressBar.style.transform = `scaleX(${progress})`;
});

📋 Resumo do Modulo

Poder do Scroll - Scroll como gatilho para criar engajamento e descoberta
Intersection Observer - API nativa performatica para detectar visibilidade
Scroll Scrubbing - Vincular progresso da animacao ao scroll
Patterns de Reveal - Fade, Slide, Scale e Stagger
Boas Praticas - Performance, acessibilidade e evitar armadilhas

Proximo Modulo:

2.4 - Bibliotecas de Animacao