O Scroll
como motor
Role a página e veja como o sm-trigger="scroll" transforma o ScrollTrigger do GSAP em algo que você escreve em segundos.
Trigger Simples — Entra na tela = anima
sm-trigger="scroll"Quando eu apareço,
eu animo.
A animação dispara quando a borda superior deste card cruza 80% da altura da janela. Role para cima e volte para ver repetir.
sm-animate="fade-up"
sm-trigger="scroll"
sm-scroll-start="top 80%"
sm-duration="1"
sm-ease="power3.out">
Controle de sm-scroll-start
sm-scroll-start="top XX%"Entra cedo
Quase antes de aparecer na tela.
Centro
Anima ao chegar no meio do viewport.
Entra tarde
Só anima quando quase passa pelo topo.
Scrub — Animação atrelada ao scroll
sm-scroll-scrub="0.5"Você controla a física
Com sm-scroll-scrub, a animação obedece à posição do scroll em tempo real.
Desliza proporcional ao scroll. Sem inércia.
sm-trigger="scroll"
sm-scroll-scrub="true"
sm-scroll-start="top 80%"
sm-scroll-end="top 20%"
Com inércia de 1.5s — o elemento atrasa levemente.
sm-trigger="scroll"
sm-scroll-scrub="1.5"
sm-scroll-start="top 80%"
sm-scroll-end="top 20%"
Parallax — Velocidades diferentes
sm-scroll-scrub + sm-from-yCada camada
em sua velocidade
Grid, blobs e cards flutuam em velocidades diferentes. Role devagar e observe cada camada se movendo em ritmo próprio.
<div sm-parallax="-150">
/* camada média */
<div sm-parallax="-400">
/* camada rápida */
<div sm-parallax="-700">
Pin — Seção travada, animação scrubada
sm-scroll-pin=".pin-live-section"Role e a seção fica parada
A seção abaixo trava na tela enquanto a caixa cresce com o scroll. Quando completa, o pin solta e a página continua.
Role o scroll para crescer a caixa →
<div sm-tl-box
sm-tl-steps='[{"scale":0.04},{"scale":1}]'>
</div>
</div>
Combinado — Todos os efeitos com scroll
stagger + trigger + easeMisture tudo
flip-left
sm-ease="power4.out"
blur-up
sm-duration="1"
skew-right
sm-duration="0.9"
reveal
sm-duration="1.2"
elastic-up
sm-duration="1.2"
rotate-in
sm-ease="back.out(2)"
sm-scroll-once — Anima uma vez ou repete
sm-scroll-once="true"Memória de animação
Role para cima e volte. O card azul vai repetir a animação. O card vermelho vai continuar visível — animou uma vez, nunca mais.
Repete sempre
Sai da tela → volta para o estado inicial. Entra de novo → anima de novo. Comportamento padrão do Smooll.
Anima uma vez
Após a primeira animação, o ScrollTrigger desativa toggleActions: "play none none none". Nunca mais reseta.
Progress Bar — Progresso visual do scroll
ScrollTrigger onUpdate → widthBarra no topo da tela
A barra azul no topo da página avança em tempo real com o scroll da página inteira. Implementada com ScrollTrigger.create + onUpdate.
<div sm-progress-bar="true"></div>
// vertical também funciona:
<div sm-progress-bar="vertical"></div>
Timeline Pinada — Sequência scrubada
sm-timeline + sm-tl-stepsEstado inicial
O elemento começa no centro, pequeno e invisível.
Aparece e cresce
Scale de 0 para 1 com fade-in enquanto você rola.
Move para a esquerda
Translação horizontal controlada pelo scroll.
Rotação + cor
Gira 360° e muda de cor. Tudo numa Timeline.
<div sm-tl-step>Passo 1</div> ...
<div sm-tl-box sm-tl-steps='[{"scale":0},{"x":-80},{"rotation":360}]'></div>
</div>
Batch — Grupos animando juntos
ScrollTrigger.batch()Muitos elementos, uma lógica
ScrollTrigger.batch() agrupa vários elementos e os anima com stagger automático conforme entram no viewport — sem criar um trigger por elemento.
<div sm-batch="true"
sm-batch-animate="fade-up"
sm-batch-stagger="0.07">
<div>item 1</div> <div>item 2</div> ...
</div>
Rocket
Launch ready
Speed
Ultra fast
Precision
Zero drift
Flow
Smooth motion
Hot
On fire
Diamond
Premium feel
Moon
Dark mode
Design
Pixel perfect
Bold
Strong presence
Rhythm
In sync
Smart
Intelligent
Spark
Pure magic
Counter — Números que contam no scroll
sm-counter="true"Dados que ganham vida
O valor final é o texto dentro da tag. O valor inicial é sm-counter-from (padrão: 0).
| Atributo | Descrição | Exemplo |
|---|---|---|
sm-counter="true" | Ativa o contador | obrigatório |
conteúdo da tag | Valor final — o número onde para | <span ...>2400</span> |
sm-counter-from | Valor inicial — onde começa (padrão: 0) | "1000" |
sm-counter-suffix | Texto após o número | "+", "%", "ms", "k" |
sm-counter-prefix | Texto antes do número | "R$", "$" |
sm-counter-decimals | Casas decimais | "2" |
sm-duration / sm-ease | Velocidade e física | "2" / "expo.out" |
sm-counter="true"
sm-counter-suffix="+"
sm-duration="2"
>2400</span>
// de 0 até 2400
sm-counter="true"
sm-counter-suffix="%"
>98</span>
// de 0 até 98
sm-counter="true"
sm-counter-suffix="ms"
sm-ease="expo.out"
>12</span>
sm-counter="true"
sm-counter-from="1000"
sm-counter-suffix="+"
>2400</span>
// de 1000 até 2400
sm-counter="true"
sm-counter-prefix="R$ "
sm-counter-decimals="2"
>9999</span>
sm-counter="true"
sm-counter-suffix="k"
>142</span>
sm-scroll-class — Estado reativo ao scroll
sm-scroll-class="is-visible"Classes que acendem e apagam
Com sm-scroll-class="is-visible", o Smooll adiciona a classe quando o elemento entra no viewport e remove quando sai — sem JavaScript extra.
sm-scroll-start="top 85%"
sm-scroll-end="bottom 15%">
/* CSS: .is-visible { background: rgba(0, 119, 255, 0.07); } */
Reativo
Role para fora da tela e volte. O dot vai acender e apagar.
CSS puro
O efeito visual é 100% CSS. O Smooll só gerencia o toggle da classe.
Combine
Use junto com sm-animate para animação + estado reativo no mesmo elemento.
Nav ativa
Ideal para marcar seções ativas na navegação quando a seção está visível.
Lazy load
Disparar carregamento de imagens ou dados quando o componente chega à tela.
Acessível
Funciona sem GSAP de animação — zero peso para interações puramente CSS.
Todos os 24 Efeitos — com sm-trigger="scroll"
sm-animate + sm-trigger="scroll"Vitrine completa
Cada card abaixo usa um efeito diferente do dicionário, todos ativados pelo scroll. Role devagar para ver cada transição disparar ao entrar na tela.
// Fades
fade-up
sm-animate="fade-up"
fade-down
sm-animate="fade-down"
fade-left
sm-animate="fade-left"
fade-right
sm-animate="fade-right"
fade-in
sm-animate="fade-in"
// Zooms
zoom-in
sm-animate="zoom-in"
zoom-out
sm-animate="zoom-out"
bounce-in
sm-animate="bounce-in"
// Flips 3D
flip-left
sm-animate="flip-left"
flip-right
sm-animate="flip-right"
flip-up
sm-animate="flip-up"
flip-down
sm-animate="flip-down"
// Rotate + Skew + Elástico
rotate-in
sm-animate="rotate-in"
rotate-in-cw
sm-animate="rotate-in-cw"
skew-left
sm-animate="skew-left"
skew-right
sm-animate="skew-right"
elastic-up
sm-animate="elastic-up"
// Reveal — Clip Path
reveal
curtina de baixo p/ cima
reveal-left
cortina da esquerda
reveal-right
cortina da direita
reveal-center
abre do centro
// Blur
blur-in
sm-animate="blur-in"
blur-up
sm-animate="blur-up"
24 efeitos × qualquer atributo sm-*
sm-trigger="scroll" + sm-scroll-start="top 88%" + sm-duration="0.9"
CSS OBRIGATÓRIO?
A maioria dos recursos desta página é 100% automática — o Smooll injeta will-change e backface-visibility automaticamente. Mas três recursos exigem CSS da página:
1. sm-parallax — container precisa de overflow:hidden
O elemento se move além dos limites normais. Sem overflow:hidden no pai, ele vaza para fora da seção.
.minha-secao { overflow: hidden; position: relative; }
2. sm-scroll-class — você estiliza a classe que é adicionada
O Smooll só adiciona/remove a classe. O visual do estado ativo é 100% CSS da página.
.meu-bloco.is-active { background: var(--blue); color: white; }
3. sm-timeline — o wrapper precisa de height:100vh
O ScrollTrigger pina o elemento. Sem altura definida, o pin não tem referência e o layout quebra.
[sm-timeline] { height: 100vh; display: flex; align-items: center; }
Pronto para o próximo nível?
Lab 04 — Video Scrubbing →