SWCore / Animações / Vídeo no scroll

Vídeo no scroll Animações

O scroll da página escolhe o instante exato do vídeo (currentTime) — descer avança, subir volta, sempre pausado.

O que é

Diferente do Vídeo tradicional (onde o relógio avança sozinho com o play), no vídeo no scroll não existe botão play. O vídeo fica sempre pausado e a rodinha do mouse ou o toque do visitante é quem aponta para cada instante do arquivo.

Como funciona

Tudo se resume a uma única fórmula matemática: tempo = progresso × duração. Conforme a seção passa pela tela, o SWCore calcula o progresso de 0.0 a 1.0 e interpola o currentTime do vídeo suavemente via requestAnimationFrame, evitando travamentos bruscos nos quadros-chave (keyframes) do MP4.

Exemplos

00 · A Máquina da Fórmula (Modelo Mental) Ao vivo
ENTRADA (SCROLL) 50% (0.50)
×
DURAÇÃO DO MP4 3.83 s
=
INSTANTE NO VÍDEO 1.92 s
<!-- 
  Guarde apenas esta fórmula:
  tempo (segundos) = progresso do scroll (0.0 a 1.0) * duracao total
  Exemplo: 50% de scroll em vídeo de 3.83s = 1.92 segundos
-->
01 · Simulador de Scrubbing Manual (Slider 0 a 100%) Ao vivo
Arraste o slider para avançar ou recuar o vídeo: 0% · 0.00s
0% 100%
<!-- Teste a precisão milimétrica do cálculo antes de testar com a rolagem -->
<div class="demo-video-box">
  <video id="manual-scrub-video" playsinline preload="auto" poster="garden-poster.webp">
    <source src="garden-scroll.mp4" type="video/mp4">
  </video>
  <input type="range" id="manual-scrub-range" min="0" max="1000" value="0">
</div>
02 · Vídeo Controlado pelo Scroll Real da Página (data-sw="video-scroll") Ao vivo
VÍDEO NO SCROLL (SCRUB 0.3s) Role para baixo para avançar
<!-- O vídeo avança ou volta suavemente conforme você rola a tela -->
<div class="demo-video-box">
  <video data-sw="video-scroll" data-sw-scrub="0.3" playsinline preload="auto" poster="garden-poster.webp">
    <source src="garden-scroll.mp4" type="video/mp4">
  </video>
  <div class="demo-canvas-overlay-info">
    <span class="demo-canvas-pill">VÍDEO NO SCROLL (SCRUB 0.3s)</span>
    <span style="font-size:.8rem; color:#94a3b8;">Role para baixo ou para cima</span>
  </div>
</div>

Essa seção prende a tela de verdade e se solta da moldura enquanto você rola — role bem devagar pra ver o efeito.

01 · INTRODUÇÃO

A Câmera Inicia o Vôo

Conforme você rola a página, o vídeo avança sincronizado com a leitura.

02 · MEIO DA JORNADA

Exploração do Espaço

O vídeo responde instantaneamente no vai e vem do scroll sem travar.

03 · CONCLUSÃO

A Chegada ao Destino

O último milissegundo do vídeo estabiliza na entrega final.

<!-- O container prende o vídeo no centro enquanto você rola 3 capítulos de texto -->
<div class="demo-video-story" data-sw="video-scroll" data-sw-scrub="0.4">
  <div class="demo-video-story-stage">
    <video playsinline preload="auto" poster="garden-poster.webp">
      <source src="garden-scroll.mp4" type="video/mp4">
    </video>
  </div>
  <div class="demo-video-story-flow">
    <div class="demo-video-story-card">
      <span class="demo-canvas-pill" style="margin-bottom:.5rem; display:inline-block;">01 · INTRODUÇÃO</span>
      <h3 style="color:#fff; margin-bottom:.5rem;">A Câmera Inicia o Vôo</h3>
      <p style="color:var(--text-muted); font-size:.85rem; margin:0;">Conforme você rola a página, o vídeo avança sincronizado com a leitura.</p>
    </div>
    <div class="demo-video-story-card">
      <span class="demo-canvas-pill" style="margin-bottom:.5rem; display:inline-block;">02 · MEIO DA JORNADA</span>
      <h3 style="color:#fff; margin-bottom:.5rem;">Exploração do Espaço</h3>
      <p style="color:var(--text-muted); font-size:.85rem; margin:0;">O vídeo responde instantaneamente no vai e vem do scroll sem travar.</p>
    </div>
    <div class="demo-video-story-card">
      <span class="demo-canvas-pill" style="margin-bottom:.5rem; display:inline-block;">03 · CONCLUSÃO</span>
      <h3 style="color:#fff; margin-bottom:.5rem;">A Chegada ao Destino</h3>
      <p style="color:var(--text-muted); font-size:.85rem; margin:0;">O último milissegundo do vídeo estabiliza na entrega final.</p>
    </div>
  </div>
</div>
04 · Padrão de Produção Declarativo (1 Linha HTML) Referência
<!-- 
  Basta adicionar data-sw="video-scroll" e data-sw-scrub="0.3" na tag <video>:
-->
<video 
  data-sw="video-scroll" 
  data-sw-scrub="0.3" 
  playsinline 
  preload="auto" 
  poster="poster.webp">
  <source src="video-animacao.mp4" type="video/mp4">
</video>

Atributos

data-sw="video-scroll"
no <video> ou container para amarrar o tempo do vídeo ao scroll
data-sw-scrub="0.3"
suavização da interpolação (padrão: 0.3 segundos de inércia suave)
data-sw-start="top bottom"
ponto de gatilho onde o vídeo começa a avançar
data-sw-end="bottom top"
ponto onde o vídeo atinge o último segundo
data-sw-pin="true"
opcional: trava o container no centro da tela enquanto a rolagem dura
playsinline
obrigatório no Safari/iOS para não abrir player nativo em tela cheia
preload="auto"
permite ao navegador descompactar os dados necessários para o scrub suave

Variantes

Scrubbing Suave (Scrub)
Avanço com inércia para disfarçar a distância entre keyframes do arquivo MP4
Palco Sticky Cinematic
Vídeo fixo no centro da tela enquanto cartões e títulos passam flutuando sobre a cena

Eventos

timeupdate
disparado quando o scroll posiciona o vídeo em um novo instante

API (JavaScript)

SWMotion.videoScroll(element)
Inicializa programaticamente o elemento de vídeo no scroll com os atributos configurados.

Requisitos

  • Precisa do gsap-bundle.js carregado para cálculo do ScrollTrigger.
  • Sempre adicione playsinline para compatibilidade universal em navegadores móveis (Safari iOS e Android).

Limitações — o que ele não faz

  • O arquivo MP4 deve ter keyframes (quadros-chave) frequentes (ex: a cada 0.2s ou 6 frames) para que o navegador consiga fazer o salto milissegundo a milissegundo de forma suave.
  • Se a animação for muito curta (menos de 60 frames) com exigência de precisão pixel-perfect, uma sequência de imagens WebP (ver Frames) pode ser ainda mais nítida que vídeo comprimido.