Frontends com Vibecoding · Capítulo 10 de 33 · 48 min
Projetar movimento, assinatura e narrativas por rolagem
Cada movimento passa por um teste de utilidade, a rolagem vira linha do tempo e a página ganha uma assinatura só, com o custo de velocidade sob controle.
Este capítulo faz parte do curso gratuito Frontends com Vibecoding.
Um movimento só entra no site quando passa num teste de utilidade, e então fica no degrau mais barato que o executa. Animação é qualquer coisa que muda sozinha na tela, como o botão que afunda ao ser apertado. A escada vai do CSS puro ao GSAP, e quase toda tela de negócio resolve tudo nos dois primeiros degraus.
O teste tem um critério só: o movimento ajuda quem usa a tela a entender o que acabou de acontecer. Três casos passam. Retorno de ação, como o botão que afunda quando é apertado. Transição de estado, como o item que desliza ao entrar na lista. Orientação espacial, como o painel que vem da direita e mostra de onde veio.
Reprovam o texto que aparece letra por letra, o elemento que gira sem motivo e a animação que segura o conteúdo até terminar. Esses três atrasam a leitura do preço, e quem está com pressa desiste antes de chegar ao botão de comprar.
A skill frontend-design, o guia que o agente de IA lê antes de desenhar, foi atualizada pela Anthropic com a mesma régua. Movimento que dispara sozinho serve só para chamar atenção, por isso um único momento bem escolhido rende mais que efeitos espalhados pela página.
O padrão genérico faz o contrário. Cada seção entra com fade e slide, ou seja, surge transparente e sobe, e cada cartão muda de cor sob o cursor. A skill chama isso de assinatura de página feita por máquina, e quem visita reconhece a fórmula de longe, antes mesmo de reparar na marca.
Guarde o movimento que dispara sozinho para um momento só, a abertura da página ou a revelação de uma peça. Todo o resto responde a uma ação da pessoa, ao abrir, expandir ou confirmar, porque aí o movimento explica o que mudou na tela.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A escada ordena o gasto, e o primeiro degrau é o CSS puro, a linguagem que já vem no navegador. A transition, que é a instrução para suavizar a troca de estado, cuida do botão que escurece, e os keyframes cuidam do cartão que entra. Peso baixado pelo visitante: zero.
O segundo degrau são os recursos que o próprio navegador já traz prontos: janela, aviso flutuante, rolagem usada como linha do tempo e animação escrita em script. Eles também custam zero de download, porque nada de novo desce para o celular de quem visita.
A rolagem como linha do tempo é a exceção do degrau, porque o Firefox ainda não a executa. Por isso ela entra sempre atrás de um teste de suporte. E respeita a preferência por menos movimento, que é o ajuste do aparelho de quem passa mal com animação.
Suba ao terceiro degrau só quando o de baixo falhar na sua tela. Três sinais autorizam: gesto que herda a velocidade do dedo, mola física e várias entradas coordenadas. O pacote é o Motion, e ele custa um arquivo a mais no que o visitante baixa.
O quarto degrau é o GSAP, reservado à linha do tempo longa amarrada à rolagem, quando a animação é o próprio produto. Ele ficou gratuito, então o custo virou tempo de estudo. Fora desses casos, instalar biblioteca de animação só soma peso e mais uma peça para manter atualizada.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Os três sinais do terceiro degrau cabem numa mesa de teste, montada no laboratório abaixo. Cada sinal tem o próprio controle: os quatro orçamentos entram em sequência, o botão afunda e volta pela mola, e o cartão solto continua na velocidade do dedo. Mexa na rigidez e no amortecimento e veja a mesma mola frear o botão e o cartão.
Repare no que o CSS puro deixa de fazer: ele não conhece a velocidade do gesto nem coordena quatro entradas com uma linha só. Se a sua tela pede um desses comportamentos, o pacote se paga. Se pede só o fade e o hover, fique no primeiro degrau e guarde o laboratório como prova.
Testar os três sinais que autorizam o terceiro degrau
Reproduza a entrada em sequência, aperte o botão com mola e arraste o cartão; ajuste rigidez e amortecimento e veja o que muda.
Demonstração com o pacote Motion dos três sinais que autorizam o terceiro degrau: quatro cartões fictícios de orçamento entram em sequência ao apertar Reproduzir entrada, um botão Confirmar afunda e volta por mola com rigidez e amortecimento ajustáveis, e um cartão arrastável continua na velocidade do gesto ao ser solto. Os botões Remover um cartão e Devolver mostram a saída e a volta de um item. Com movimento reduzido ativo no aparelho, o deslocamento some e fica só a troca de opacidade, com um aviso dizendo o modo.
A demonstração interativa carrega quando este trecho entra na tela.
Fora da escada ficam ferramentas de nicho, cada uma com um caso só. O Rive anima personagem que reage ao toque, em arquivo menor que o Lottie, que é o desenho animado exportado do After Effects. Anime.js traz física leve, Theatre.js monta a sequência numa linha do tempo visual e Lenis suaviza a rolagem.
O react-spring entra quando o efeito precisa parecer físico, como o cartão que balança ao ser solto. Para celebrar uma compra, o canvas-confetti é o padrão, porque pesa seis quilobytes e não arrasta nenhuma outra peça junto. O tsparticles só se justifica quando o fundo animado é parte do produto.
Já o Scrollama é a referência para narrativa por rolagem, a reportagem em que o gráfico muda enquanto o texto desce. Cursor desenhado sob medida cabe em vitrine, nunca em página de pagamento, porque ele esconde o que é clicável e a pessoa erra o botão.
Duas preferências do aparelho valem em qualquer degrau. Quando a pessoa liga o movimento reduzido, corte deslocamento longo e giro, e mantenha só mudança de cor. Quando ela liga o contraste alto, o estado marcado por um tom claro ganha borda, porque a diferença sutil some na tela dela.
A escada e os anexos: degrau, ferramenta e quando entra
| Degrau | Ferramenta | Quando entra |
|---|---|---|
| 1. CSS puro | transition e @keyframes | Botão que escurece, cartão que entra, círculo que gira; peso zero |
| 2. Nativo do navegador | dialog, popover, @starting-style, scroll-driven, WAAPI | Janela, menu, aviso que entra suave, barra amarrada à rolagem; peso zero, com scroll-driven ainda em Limited Availability, sem Firefox |
| 3. Motion 13.1 | pacote motion (absorveu Popmotion e Motion One) | Gesto que herda velocidade, mola, entradas coordenadas em React; custa um pacote |
| 4. GSAP | timelines, ScrollTrigger e SplitText | Linha do tempo longa amarrada à rolagem; gratuito desde abril de 2025, custa estudo |
| Nicho | Rive, Lottie, Anime.js 4.5, Theatre.js, Lenis, react-spring 10 | Personagem interativo, vetor do After Effects, física leve, sequenciador, rolagem suave, mola física |
| Celebração | canvas-confetti (6 kB), tsparticles, party.js | Padrão sem dependência; fundo que é produto; efeito preso a um elemento |
| Narrativa e cursor | Scrollama; cursor customizado | Reportagem por rolagem; cursor só em vitrine, nunca em página de pagamento |
Suba um degrau só quando o de baixo falhar na sua tela; respeite prefers-reduced-motion e prefers-contrast em todos.
Uma lista de orçamentos que revela cada linha ao rolar cabe inteira no primeiro degrau, em CSS puro. Comece sempre por ali, e só suba quando aquela tela específica falhar na sua mão.
Antes de aprovar a tela, abra a mesma seção com o script de animação desligado e confira que todo o conteúdo continua visível. Depois ligue o movimento reduzido e o contraste alto no aparelho e recarregue a página.
O critério de pronto é este: nada some, todo texto continua legível e cada estado se distingue com a tela parada. Se alguma informação depender da animação para aparecer, o movimento virou obstáculo e sai antes de publicar.
Animar rolagem, aviso e troca de tela sem instalar biblioteca
Com o teste de utilidade e a escada de custo em mãos, a rolagem e a troca de tela ganham movimento por recurso nativo do navegador.
O navegador já anima rolagem, aviso, troca de tela e número que muda, sem instalar nada. Quem revisa o que o agente entrega, ou seja, a IA que escreve código a seu pedido, ganha o critério para recusar a biblioteca que ele sugere. O degrau seguinte é o vídeo montado por programa.
A rolagem vira a linha do tempo da animação com duas linhas de folha de estilo. A caixa que rola ganha um nome, e o elemento que anima passa a olhar essa rolagem em vez de contar segundos no relógio.
Cada cartão de indicador cresce sozinho quando entra na área visível, sem script nenhum. O Firefox ainda não executa esse recurso, por isso ele entra atrás de um teste de suporte. Sem esse teste, o navegador antigo mostra a barra parada no zero, e a pessoa acha que a página travou.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
O aviso que aparece depois de um clique entra e sai suave com @starting-style. Essa regra descreve o estado de partida do elemento, como a posição da porta antes de alguém abrir. Antes dela, sumir com suavidade exigia uma peça só para segurar o elemento na tela até o fim.
Esse mesmo navegador passa a animar a altura de um bloco que abre. O detalhamento de um pedido, um menu ou uma sanfona ganham transição escrita em duas linhas. Onde o recurso falta, o bloco abre na hora, inteiro e legível, então ninguém perde informação.
Laboratório ao vivo: rolagem, entrada suave e troca de tela
Role a caixa
Painel de loja, cenário ilustrativo
Pedidos do mês
812
Ticket médio
R$ 148
Entregas no prazo
94%
Devoluções
31
Satisfação
4,7
Suporte: sem rolagem como linha do tempo, a barra do topo e os medidores já aparecem cheios e os cartões, opacos.
Entra e sai suave
Aviso de estoque, cenário ilustrativo
Restam duas unidades deste tamanho.
Suporte: sem transição de display, o aviso aparece e some na hora, sem suavidade, e o texto continua legível.
Troca de tela
Lista de pedidos
Pedido aberto
A troca com View Transitions precisa de uma linha de script, por isso aqui ficam os dois estados parados.
Suporte: no mesmo documento, Chromium, Firefox 133 e Safari 18. Sem suporte, a tela troca na hora, sem cruzamento.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A troca de tela dentro da mesma página saiu do território das bibliotecas. O recurso chamado View Transitions já roda nos três navegadores principais, por isso ele vem antes de instalar qualquer peça de transição.
O efeito é o da foto da vitrine que continua na tela ao abrir o detalhe do produto, em vez de a tela piscar em branco. Quem compra segue com o olho no mesmo objeto, e a sensação de erro some.
Entre páginas diferentes, o mesmo cruzamento ainda falta no Firefox. Por isso a navegação precisa funcionar sem ele, e o efeito entra como bônus onde o navegador já entende.
O number-flow anima o número dígito a dígito, na direção certa, quando o faturamento do dia sobe no painel. Ele serve em indicador que muda ao vivo, porque o olho acompanha a subida e entende que o valor é recente. O número que muda uma vez só por página fica no contador em CSS do laboratório acima.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Vídeo montado por programa é o degrau acima. Em vez de alguém arrastar clipes num editor, o computador monta o vídeo a partir de uma receita escrita. É como a máquina de etiquetas que imprime mil variações do mesmo modelo, cada uma com o nome de um cliente.
Serve para vídeo de produto, relatório animado e peça de rede social que saem em série a partir de dados. O Remotion escreve esse vídeo em React e traz um estúdio visual para ajustar a curva de aceleração do movimento.
A licença do Remotion muda na próxima versão maior, então leia as condições antes de assinar. O Motion Canvas faz o mesmo sem React, e o Revideo é a terceira opção. Nenhum dos três substitui um player: eles produzem o arquivo que o player vai servir na página.
Canvas criativo é parente da mesma família. O p5.js serve a arte generativa e ao ensino, e o material antigo pede revisão porque o editor trocou de versão padrão. O Rough.js dá estética de desenho à mão, útil em rascunho. O PixiJS usa a placa de vídeo pelo navegador para desenhar milhares de peças sem travar.
Número animado, vídeo por código e canvas criativo: quando cada um entra
| Ferramenta | O que faz | Quando entra |
|---|---|---|
| number-flow | número animado dígito a dígito; React, Vue, Svelte, vanilla e React Native | Indicador ao vivo em painel; número que muda uma vez fica em CSS |
| Remotion 4.0 | vídeo em React, com Studio, keyframes e editor de easing | Vídeo em série a partir de dados; ler a licença prevista para a v5 |
| Motion Canvas 3.x | vídeo em TypeScript puro, linha do tempo por geradores, sem React | Time que não usa React; explicação animada e relatório |
| Revideo | terceira opção da categoria de vídeo por código | Avaliar quando os dois anteriores não servirem |
| p5.js 2.0 | canvas criativo; padrão do editor após agosto de 2026 | Arte generativa e ensino; revisar material feito para a 1.x |
| Rough.js | estética desenhada à mão em canvas e SVG | Rascunho, croqui, gráfico com cara de caderno |
| PixiJS v8 | WebGL para muitos objetos em alta taxa de quadros | Jogo, partícula e visualização com milhares de peças |
Nenhum deles substitui o player da página pública; eles geram o arquivo que o player serve.
O arquivo que o Remotion gera só vira aula ou anúncio dentro de um player. A regra da casa é dura: a etiqueta video crua, com o atributo controls, nunca entra em página pública. Ela esconde da página a velocidade, a legenda e o estado da tela cheia, e cada navegador desenha os controles do seu jeito.
O laboratório abaixo monta o Vidstack, o player pronto que o curso usa, com a vídeo-aula da trilha 1 e a legenda em português. O painel ao lado lê o estado que o player publica: tempo, velocidade, legenda ativa e tela cheia. Essa leitura liga o botão de compartilhar e o teclado, e o vídeo cru não a oferece.
Ver o que separa um player de um vídeo cru
Dê o play, troque a velocidade e ligue a legenda; o painel ao lado mostra o estado que o player publica e que a etiqueta crua esconde.
Player Vidstack com a vídeo-aula da trilha 1 deste curso, legenda em português ligada por padrão e nenhum quadro de vídeo baixado antes do play. Um painel mostra ao vivo o estado que o player expõe: tempo atual, velocidade escolhida, legenda ativa e tela cheia. Botões próprios trocam a velocidade, ligam a legenda, entram na tela cheia e compartilham o link, e o teclado opera tudo com o player em foco.
A demonstração interativa carrega quando este trecho entra na tela.
Peça cada um desses recursos atrás do teste de suporte e do movimento reduzido. Numa página de produto isso vira três pedidos. A nota da avaliação cresce ao entrar na tela, o aviso de estoque entra suave e o contador do painel muda dígito a dígito.
Antes de aprovar a seção, ligue o movimento reduzido no aparelho e recarregue a página. O critério de pronto é que barras, números e avisos continuem visíveis e completos, apenas parados.
Nenhuma biblioteca de gesto ou mola entra sem um pedido de arraste, de mola física ou de sequência longa amarrada à rolagem. Sem esse sinal, ela só acrescenta peso ao que o cliente baixa.
Criar a cena de movimento que marca a página sem pesar
O movimento funcional já está coberto, e resta escolher o único momento em que a página assina, fabricar a cena e regular o que pesa na velocidade.
Um fundo animado no herói derrubou o Lighthouse, a nota de velocidade que o Google dá à página, para 94 no computador e 91 no celular. Quatro parâmetros regulados no mesmo trecho de código devolveram a nota a 100 e 99, sem tirar o movimento da tela.
Uma página inteira comporta um único momento de movimento memorável, e ele mora no herói, a primeira tela que aparece. Cena aqui é esse fundo que se mexe, montado como um aquário digital: uma imagem viva que roda sozinha atrás do texto. Todo o resto da página responde ao que a pessoa faz.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
O movimento genérico tem receita conhecida. Cada seção surge transparente e sobe 20 px, sempre com a mesma curva e o mesmo tempo. Os cartões acendem um a cada 0,1 s, e o botão não muda ao ser clicado.
Essa receita vem do agente porque é a mais frequente no material que ele leu. O efeito que deveria impressionar vira o sinal de que ninguém decidiu nada, e o visitante reconhece a ferramenta antes de reconhecer a sua marca.
A convergência tem explicação medida. Modelos ajustados por preferência humana reduzem a variedade do texto que ajudam a produzir, e o modelo base sem esse ajuste não reduz (Padmakumar e He, ICLR, 2024). O mesmo mecanismo puxa o movimento de sites diferentes para a mesma receita.
Na skill frontend-design, o roteiro de projeto visual que o agente lê, a regra cabe numa frase: gaste a ousadia em um lugar só. Um momento bem orquestrado rende a lembrança que dez efeitos espalhados dispersam, porque a atenção de quem visita é uma só.
Movimento ajuda a venda quando responde a uma ação e mostra o que mudou. Abrir um menu, expandir um pedido, confirmar um agendamento: ali o movimento explica a mudança e some. Movimento que dispara sozinho, só para impressionar, atrasa a leitura e gasta a cota da assinatura.
Efeito em cada seção contra uma assinatura e o resto quieto
Efeito em cada seção
Padrão de fábrica
- Fade e deslize de 20 px em toda seção, com a mesma curva e o mesmo tempo
- Hover em cada cartão e escalonamento de 0,1 s por filho, sem ação da pessoa
- Duas ou três cenas WebGL na mesma página, em escala 1 e 60 fps
- Nenhuma regra para quem pediu menos movimento
- A nota de velocidade cai e a pessoa reconhece a ferramenta antes da marca
Uma assinatura e o resto quieto
Escolha com custo pago
- Uma cena no herói, com a cor da marca vinda do DESIGN.md
- Produção, escala 0,5, dpi 1, 30 fps e rótulo acessível no contêiner
- Imagem estática de reserva para quem pediu menos movimento
- Movimento só onde responde a uma ação: abrir, expandir, confirmar
- Nota de velocidade intacta e uma cena que só poderia ser dessa marca
A assinatura se fabrica numa ferramenta de cena, e o Unicorn Studio é a referência da categoria. Ele empilha mais de 75 efeitos, disparados pelo tempo ou pela pessoa, e um agente de shader cria o efeito a partir de uma descrição em prosa.
Shader é o programa que a placa de vídeo roda para pintar cada ponto da tela, como um filtro de foto refeito trinta vezes por segundo. Por isso ele custa energia do aparelho, e é essa conta que os parâmetros abaixo regulam.
A cena sai como componente, a peça pronta que você encaixa na página, para Framer, Webflow, Figma ou aplicativo próprio. O plano gratuito libera todos os efeitos, até oito publicações com o logotipo da ferramenta e vídeo em qualidade média.
O plano pago tira o logotipo da ferramenta, dá licença comercial e exporta a cena em arquivo para você hospedar no próprio domínio. Ele custa US$ 14 por mês no plano anual.
Cada camada de efeito acrescenta uma passagem de shader à conta, e as mais caras são forma 3D, rastro de mouse, bloom, godrays e bokeh. A biblioteca que faz a cena rodar pesa cerca de 50 kB, o que a página baixa uma vez.
Por isso o trecho que embute a cena vem com botões de custo no próprio código. A tabela abaixo dá cada um deles, a faixa de valor, quando usar e o que acontece com a página se ele ficar no valor de fábrica.
Os botões de custo de uma cena
| Parâmetro | Faixa | Quando usar | O que acontece se esquecer |
|---|---|---|---|
| data-us-lazyload | true ou false | Cena abaixo da dobra; o herói acima da dobra fica sem | A cena é criada antes de entrar na tela e atrasa a página |
| data-us-production | true | Sempre na página publicada; serve pela CDN (a rede de servidores perto da pessoa) | Os arquivos vêm do servidor de edição, mais lento |
| data-us-scale | 0,25 a 1 | Cena suave fica boa entre 0,5 e 0,75; fundo de herói aguenta 0,25 | Em 1, cada quadro pinta quatro vezes mais pixels que em 0,5 |
| data-us-dpi | 1 a 1,5 | 1 para fundo ambiente; 1,5 é o teto | Em 2 a cena custa quatro vezes mais que em 1 |
| data-us-fps | 30 ou 60 | 30 basta para fundo ambiente; 60 só para mouse e movimento rápido | 60 dobra o trabalho da placa de vídeo por segundo |
| data-us-arialabel e data-us-alttext | texto curto | Sempre; descreve a cena para o leitor de tela | O leitor de tela encontra uma caixa sem nome |
| número de cenas | menos de dez por página | Uma assinatura por página; navegadores param em cerca de 16 contextos WebGL | A cena mais nova deixa de desenhar |
Regule os parâmetros no contêiner antes de medir.
Fonte: Guias de embed e desempenho do Unicorn Studio e unicornstudio-llms.txt, leitura em 8 de setembro de 2026.
O ajuste que devolveu a nota naquele caso foi simples: a cena ficou só na página inicial, com escala 0,25, carregamento adiado e modo de produção ligado. A cena também pausa sozinha quando sai da tela, então ela para de gastar bateria.
As variáveis publicadas aceitam a cor da marca e a intensidade do efeito. Por elas a cena lê o DESIGN.md, o arquivo onde ficam as cores e as regras visuais do negócio, e o fundo passa a ser reconhecidamente seu.
<!-- herói: uma única cena, com os parâmetros de custo regulados -->
<div id="hero-cena"
data-us-project="seu-id-de-projeto"
data-us-lazyload="true"
data-us-production="true"
data-us-scale="0.5"
data-us-dpi="1"
data-us-fps="30"
data-us-arialabel="Onda de vinho tinto em movimento lento sobre o fundo do herói">
<img class="hero-reserva" src="/img/hero-vinho.webp" alt="Taça de vinho tinto sobre a mesa da adega">
</div>
<!-- biblioteca hospedada no seu domínio (permitido pela propriedade sdkUrl) -->
<script src="/js/unicornStudio.umd.js" defer></script>
<style>
#hero-cena .hero-reserva { display: none; }
@media (prefers-reduced-motion: reduce) {
#hero-cena canvas { display: none; }
#hero-cena .hero-reserva { display: block; }
}
</style>Quem ligou o movimento reduzido no aparelho recebe uma imagem parada no lugar da cena. Movimento reduzido é o ajuste que existe em todo celular e computador para quem sente tontura ou enjoo com animação, e respeitá-lo evita perder essa visita.
Para pedido menor, o Framer Marketplace traz peças prontas de rolagem suave e de revelação de texto. No 21st.dev, a categoria que mais cresce é a de heróis animados. O critério vale para todas: uma assinatura por página.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Deixe a assinatura num lugar só, com modo de produção, escala 0,5, dpi 1, 30 quadros por segundo e rótulo acessível. Se a página acumula duas cenas, a assinatura já virou ruído, porque elas dividem a atenção e dobram o custo.
Antes de publicar, rode o Lighthouse no computador e no celular, com a cena ligada e com ela desligada. O critério de pronto é as duas notas voltarem ao patamar de antes da cena.
Se elas não voltarem, corte uma camada de efeito ou baixe a escala e o dpi, e meça de novo antes de pôr no ar.
Guia prático: calibrar o movimento antes de pedir ao agente
Movimento pedido por adjetivo sai errado: suave para você pode ser lento para quem usa. O que o agente executa bem é número: a curva, a duração, o intervalo entre itens, o ponto da rolagem em que a cena começa. Três ferramentas gratuitas do Annnimate, biblioteca de componentes animados do estúdio Good Fella, deixam você achar esses números mexendo num controle, sem cadastro e sem código.
O visualizador de curvas desenha as 31 curvas de aceleração do GSAP, a biblioteca de animação que este capítulo apresenta, compara duas lado a lado e copia o resultado em dois formatos: o nome da curva para o GSAP e a função linear() do CSS, que reproduz a mesma curva sem biblioteca nenhuma. O ajuste de escalonamento mostra numa grade o atraso entre um item e o seguinte. O construtor de gatilho de rolagem ajusta início, fim, fixação (o elemento fica parado enquanto a página rola) e o vínculo com a rolagem diante de uma prévia que rola.
A mesma casa publica guias de conceito gratuitos sobre o GSAP, e dois deles viram regra de bolso. O vínculo com a rolagem, chamado scrub, aceita um atraso em segundos: de 0,5 a 1 para revelações e profundidade, de 1,5 a 2 para efeitos de atmosfera, e acima de 2 o movimento parece desligado do gesto. E a propriedade will-change, que avisa o navegador para preparar o elemento com antecedência, ao custo de memória, serve a quem se move o tempo todo; aplicada a uma lista de 100 itens parados, derruba o navegador do celular.
// Os números vêm das ferramentas; o agente só os aplica.
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
gsap.registerPlugin(ScrollTrigger);
const mm = gsap.matchMedia();
// O movimento só é registrado para quem não pediu menos movimento.
mm.add("(prefers-reduced-motion: no-preference)", () => {
// Entrada de uma lista: curva, duração e intervalo calibrados antes.
gsap.from(".plano", {
y: 24,
autoAlpha: 0,
duration: 0.6,
ease: "expo.out",
stagger: 0.08,
});
// Imagem que acompanha a rolagem, com meio segundo de atraso.
gsap.to(".foto-capa", {
yPercent: -12,
ease: "none",
scrollTrigger: { trigger: ".capa", start: "top top", end: "bottom top", scrub: 0.5 },
});
});
// Ao sair da condição, o GSAP desfaz as animações do bloco sozinho.Gerente de produto de um aplicativo de finanças pessoais, revisando a página de planos gerada por um agente
Fintech, assinatura
Dor
Os três cartões de plano entravam juntos, com um balanço elástico que a equipe achava infantil para um produto de dinheiro. Cada pedido de ajuste por adjetivo trocava um exagero por outro.
Solução
Ele abriu o visualizador de curvas, comparou a curva elástica com a exponencial de saída, escolheu a segunda com 0,6 segundo e, no ajuste de escalonamento, um intervalo de 0,08 segundo entre os cartões. Passou os três números ao agente.
Resultado
A entrada ficou certa na primeira tentativa. Os números foram para o DESIGN.md, e as outras páginas passaram a entrar do mesmo jeito.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Do movimento descrito ao movimento com número
Seis passos. Você decide olhando; o agente recebe valores.
Passo 1: Escolha a curva comparando duas
No visualizador, ponha lado a lado a curva que o agente usou e uma candidata. Curvas de saída, que começam rápido e assentam, servem à maioria das entradas de tela; elástica e de quique chamam atenção para si.
Deu certo quando: Você tem o nome de uma curva e uma duração, escolhidos vendo o movimento.
Erro comum: Aceitar a curva elástica padrão em produto que pede sobriedade.
Passo 2: Copie no formato que o projeto já usa
Projeto com GSAP recebe o nome da curva. Projeto sem biblioteca recebe a função linear() do CSS, que cabe numa transição comum e não acrescenta peso à página.
Deu certo quando: A curva entrou sem instalar dependência nova.
Erro comum: Instalar uma biblioteca de animação para uma única transição de botão.
Passo 3: Acerte o intervalo entre itens
No ajuste de escalonamento, arraste até a sequência parecer uma onda só. Intervalo curto demais vira bloco; longo demais faz a pessoa esperar o último item.
Deu certo quando: A lista inteira termina de entrar em menos de um segundo.
Erro comum: Escalonar 30 itens de uma tabela e segurar o conteúdo que a pessoa veio ler.
Passo 4: Decida se a cena segue a rolagem ou dispara uma vez
Profundidade, barra de progresso e cena fixada seguem a rolagem, com scrub. Revelação de seção dispara uma vez ao entrar na tela, sem scrub.
Deu certo quando: Cada animação de rolagem tem um dos dois modos escolhido, com motivo.
Erro comum: Ligar toda revelação à rolagem e obrigar a pessoa a rolar devagar para ler um título.
Passo 5: Proteja quem pediu menos movimento
Registre as animações dentro da condição de preferência de movimento, como no exemplo. Sem ela, o conteúdo aparece no lugar final, visível e legível.
Deu certo quando: Com a opção de reduzir movimento ligada no aparelho, a página mostra tudo sem animar.
Erro comum: Esconder o conteúdo com opacidade zero no CSS e depender da animação para revelá-lo.
Passo 6: Guarde os números no DESIGN.md
Curva, duração, intervalo e atraso de rolagem entram como regra de movimento do projeto. O próximo pedido cita o arquivo em vez de repetir a calibragem.
Deu certo quando: Uma tela nova sai com o mesmo movimento sem você abrir as ferramentas de novo.
Erro comum: Deixar os valores só no código de um componente, onde o agente não os encontra.
No fim você tem: Quatro números de movimento escolhidos por você, registrados no sistema de design e respeitando quem prefere a página parada.
Os componentes prontos da biblioteca são outra conversa, com preço. São 113 peças em React, Vue e HTML com CSS e JavaScript, das quais 15 gratuitas; o plano individual custava 29 euros por mês em cobrança trimestral, ou 249 euros por ano, em 06/10/2026, com uso comercial liberado e reembolso em 14 dias. A assinatura inclui um servidor MCP, a ponte que deixa o agente buscar um componente pelo nome e colar o código no seu framework. Antes de assinar, vale o teste deste capítulo: o movimento ajuda quem usa a tela a entender o que aconteceu? As ferramentas e os guias gratuitos resolvem a maior parte dos casos de uma página de negócio.
Guia prático: uma timeline só, dirigida por dados e sempre igual
Quando cada efeito da página tem o próprio temporizador, ninguém sabe dizer o que está na tela no segundo 2. O curso de edição estudado em 07/10/2026 monta vídeos como páginas web e, por isso, precisa dessa resposta para cada quadro. A disciplina que ele usa serve igual a uma landing.
São quatro regras. Primeira: toda animação entra numa única timeline criada pausada, e cada bloco visível tem início e duração escritos num objeto de dados, sem setTimeout espalhado. Segunda: anime só transformações (mover, girar, escalar) e opacidade; o verificador do HyperFrames reprova movimento feito com left e top, e o guia de animação do web.dev mostra por quê, com cerca de 50% de quadros perdidos no exemplo com top e left contra cerca de 1% com transform. Terceira: determinismo. Nada de aleatório em tempo de execução; quando precisar de variação, como uma nuvem de pontos, gere com semente fixa antes e grave no código. Quarta: granulado é imagem, não filtro. No material, o ruído feito com filtro SVG vazou e deixou um véu cinza de 14 a 19% sobre a imagem da câmera; uma textura PNG leve resolveu.
A lição: estado da tela como função do tempo. Com isso você consegue pular para qualquer instante, testar, capturar a tela e repetir o resultado sem surpresa.
// Os tempos moram em dados; a timeline nasce pausada e só move transform e opacity.
import { gsap } from "gsap";
const cena = [
{ alvo: ".selo", inicio: 0.0, duracao: 0.5, de: { y: 16, opacity: 0 } },
{ alvo: ".titulo", inicio: 0.3, duracao: 0.7, de: { y: 24, opacity: 0 } },
{ alvo: ".prova", inicio: 1.1, duracao: 0.6, de: { scale: 0.96, opacity: 0 } },
];
export const tl = gsap.timeline({ paused: true });
for (const b of cena) {
tl.from(b.alvo, { ...b.de, duration: b.duracao, ease: "power2.out" }, b.inicio);
}
const reduzir = matchMedia("(prefers-reduced-motion: reduce)").matches;
if (reduzir) tl.progress(1); // estado final, parado
else tl.play();
// Em teste ou captura: tl.seek(2) mostra exatamente o segundo 2.Dos efeitos soltos à cena que se repete
Cinco passos para reorganizar o movimento de uma página que já existe.
Passo 1: Liste tudo que se move e quando
Peça ao agente uma tabela com cada efeito da página: elemento, o que dispara, início, duração e propriedade animada. Isso mostra os temporizadores soltos e as propriedades caras.
Deu certo quando: Você tem a lista completa, com a propriedade de cada efeito.
Erro comum: Esquecer os efeitos de CSS puro, que não aparecem no código JavaScript.
Passo 2: Passe os tempos para um objeto de dados
Cada bloco ganha início e duração num objeto no topo do arquivo, e uma única timeline pausada lê esse objeto, como no bloco acima. Mudar o ritmo vira editar números.
Deu certo quando: Nenhum setTimeout cuida de animação, e o ritmo inteiro cabe numa tela.
Erro comum: Criar uma timeline por componente e voltar a ter vários relógios.
Passo 3: Troque left, top, width e height
Movimento vira deslocamento com transform; crescimento vira escala; aparecer vira opacidade. A posição de repouso fica no CSS.
Deu certo quando: A lista do primeiro passo só tem transform e opacity.
Erro comum: Animar a largura de uma barra de progresso; use scaleX com a origem à esquerda.
Passo 4: Tire o aleatório da hora de abrir
Partículas, posições e atrasos variados são calculados uma vez, com semente fixa, e gravados no código. Granulado de fundo vira uma textura PNG pequena repetida.
Deu certo quando: Duas cargas da página produzem capturas idênticas no mesmo instante.
Erro comum: Usar Math.random no navegador e depois estranhar que o teste visual falha a cada execução.
Passo 5: Teste pulando no tempo
Num teste, chame a timeline com seek em três instantes e tire uma captura de cada um. Com movimento reduzido ligado, confira que a página aparece direto no estado final.
Deu certo quando: As três capturas se repetem igual em toda execução.
Erro comum: Testar só o fim da animação e não ver o elemento que pisca no meio.
No fim você tem: Uma página cujo movimento cabe numa tabela de tempos, usa só propriedades leves e produz a mesma imagem em todo instante, para quem vê e para o teste.
Guia prático: cascata sem script, player que reage à pausa e troca de tela pelo React
A aula colocou o movimento no degrau mais barato da escada. De agosto a outubro de 2026, o degrau do CSS ganhou duas peças nos três navegadores: sibling-index(), que dá a cada item a própria posição para a cascata de entrada, e :paused, que deixa o player mudar de visual quando o vídeo para. No React 19.3, de setembro, o componente ViewTransition ficou estável. Você sai daqui pedindo as três coisas sem biblioteca de animação e com o movimento reduzido respeitado.
Funções, casos de uso e aplicações
Funções
Movimento e mídia que chegaram aos navegadores e ao React
| Função ou recurso | O que faz | Quando usar | Desde |
|---|---|---|---|
| sibling-index() e sibling-count() | Devolvem a posição do elemento entre os irmãos e o total deles, como número que entra em calc() | Atraso da cascata de entrada e largura proporcional sem escrever um nth-child por item; Baseline Newly com o Firefox 154 | 28/08/2026 |
| :paused | Seleciona vídeo e áudio pausados, inclusive o que carregou e ainda não começou | Mostrar a capa e o botão grande de play só com o vídeo parado, sem script; Baseline Newly | 28/09/2026 |
| sizes="auto" em imagem com loading="lazy" | O navegador calcula o tamanho da imagem pela largura real do layout, sem você escrever a lista de sizes | Grade de cartões e galeria abaixo da dobra; virou Baseline Newly com o Safari 27 | 17/09/2026 |
| <ViewTransition> estável (React 19.3) | Anima entrada, saída, troca e elemento compartilhado quando a atualização vem de startTransition, de Suspense ou de useDeferredValue | Filtro de lista, troca de aba e abertura de detalhe em app React; chega junto com o Next.js 16.4 | 09/09/2026 |
| animation em AnimationEvent e TransitionEvent | O evento de fim de animação entrega o objeto Animation que o disparou | Encadear a próxima etapa sem procurar a animação pelo nome; Baseline Newly com o Safari 27 | 17/09/2026 |
| View Transitions com escopo de elemento (Chrome 147) | A transição acontece dentro de um elemento, sem congelar a página inteira | Dois componentes animando ao mesmo tempo; só no Chromium, atrás de teste de suporte | 19/05/2026 |
Newly available quer dizer que o recurso acabou de chegar aos três navegadores: o aparelho que não atualiza ainda não tem.
Casos de uso
Social media de uma confeitaria artesanal em Curitiba que vende encomenda pelo site
Marketing digital
Dor
A página de depoimentos usava uma biblioteca de animação só para os cartões entrarem um após o outro, e o vídeo da cozinha exibia o quadro preto do player quando parado.
Solução
Pediu a cascata com transition-delay em calc(sibling-index() * 60ms) atrás de @supports e dentro de prefers-reduced-motion: no-preference, e a capa sobre o vídeo visível só com :paused.
Resultado
O que observar: o peso de JavaScript da página antes e depois, e se os cartões aparecem completos, parados, com o movimento reduzido ligado no celular.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Desenvolvedor de uma plataforma de cursos de idiomas em Campinas, em Next.js
Educação
Dor
O filtro de nível do catálogo trocava a lista de cursos de uma vez, e o aluno perdia de vista o curso que estava olhando.
Solução
Ao subir para o Next.js 16.4 com React 19.3, embrulhou cada cartão em ViewTransition com name igual ao id do curso e passou o filtro para dentro de startTransition. O cartão que fica na lista desliza para a nova posição.
Resultado
O que observar: na gravação de sessão ou num teste com cinco alunos, se a pessoa continua no curso que estava olhando depois de filtrar; e o INP do clique no filtro.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Na prática
A página de entrada do /educacao, em src/app/educacao/page.tsx, abre e fecha trilhas com a API de View Transitions do navegador. A função só chama document.startViewTransition quando o navegador tem a API e a pessoa não pediu menos movimento, nem no aparelho nem no botão do portal (data-motion="reduce"). O flushSync obriga o React a aplicar a troca dentro da transição. É o jeito de fazer isso no React 19.2, que o portal usa; o ViewTransition do React 19.3 pode substituir esse embrulho quando o projeto subir de versão. Em src/app/globals.css, a classe .ac-reveal revela blocos pela rolagem, só onde animation-timeline: view() existe.
const withViewTransition = (fn: () => void) => {
const doc = document as Document & { startViewTransition?: (cb: () => void) => void };
const reduce =
typeof window !== "undefined" &&
(window.matchMedia("(prefers-reduced-motion: reduce)").matches ||
document.documentElement.dataset.motion === "reduce");
if (typeof doc.startViewTransition === "function" && !reduce) {
doc.startViewTransition(() => flushSync(fn)); // React aplica a troca dentro da foto
} else {
fn(); // troca seca, mesmo conteúdo
}
};/* Real (globals.css): revela ao rolar só onde há suporte e movimento liberado */
@media (prefers-reduced-motion: no-preference) {
@supports (animation-timeline: view()) {
.ac-reveal {
opacity: 0;
animation: ac-pop-in linear both;
animation-timeline: view();
animation-range: entry 0% cover 24%;
}
}
}
/* Exemplo de campanha: cascata sem nth-child, pela posição de cada cartão */
@media (prefers-reduced-motion: no-preference) {
@supports (transition-delay: calc(sibling-index() * 1ms)) {
.depoimentos > li { transition-delay: calc(sibling-index() * 60ms); }
}
}
/* Capa do vídeo visível só com ele parado */
.player:has(video:paused) .capa { opacity: 1; }Movimento novo sem biblioteca e sem esconder conteúdo
Passo 1: Escreva o estado final primeiro
O cartão visível e parado é a versão de quem não tem o recurso ou pediu menos movimento.
Deu certo quando: Com o CSS de animação removido, a página continua completa.
Erro comum: Começar com opacity: 0 fora da consulta de suporte e sumir com o conteúdo no navegador antigo.
Passo 2: Ponha a animação atrás de duas perguntas
prefers-reduced-motion: no-preference e @supports do recurso, nessa ordem, como na .ac-reveal do portal.
Deu certo quando: Cada bloco animado tem as duas condições.
Erro comum: Respeitar o sistema e esquecer o botão de movimento do próprio site.
Passo 3: Troque o script pelo recurso que já é Baseline
sibling-index() no lugar do atraso calculado em JavaScript; :paused no lugar do ouvinte de pause.
Deu certo quando: Um arquivo de JavaScript a menos para manter.
Erro comum: Usar recurso Newly sem reserva quando o público tem muito aparelho sem atualização.
Passo 4: No React 19.3, deixe a transição com o React
ViewTransition dispara com startTransition; atualização urgente fora dele não anima.
Deu certo quando: A troca anima sem flushSync nem chamada manual à API do navegador.
Erro comum: Embrulhar a lista em ViewTransition e esquecer o startTransition no clique.
No fim você tem: Cascata, player e troca de tela animados com CSS e React, com a página inteira visível para quem não quer movimento.
Armadilhas
Movimento que soma contra movimento que esconde
Evite
Coluna a evitar
- Biblioteca de animação só para a cascata de entrada da lista
- Item escondido por padrão que só aparece se a animação rodar
- name repetido em dois ViewTransition na mesma tela
- View Transition com escopo de elemento sem teste de suporte: só o Chromium tem
Prefira
Coluna recomendada
- sibling-index() atrás de @supports, com os itens aparecendo juntos sem ele
- Estado final visível e animação só dentro de prefers-reduced-motion: no-preference
- name único por item, como o id do curso ou do produto
- Transição do documento inteiro, que já roda nos três navegadores, como base
Aplicar os recursos ao projeto
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
IntersectionObserver avisa quando um elemento entra ou sai da área visível, em relação à janela ou a outro contêiner. Ele evita fazer conta a cada rolagem, o que trava o celular. Serve para preparar conteúdo que está chegando, marcar o item do índice ou começar uma demonstração na hora certa.
Monte new IntersectionObserver(callback, { threshold: 0.25 }) e observe a figura com observer.observe(figura). No callback, a função que o observador chama, cheque entry.isIntersecting antes de aplicar a classe de destaque. Se a apresentação acontece uma vez, chame unobserve(entry.target) depois da entrada. Deixe a figura visível no estilo inicial, para a leitura não depender dele.
Role devagar, volte ao trecho e teste um contêiner com rolagem própria. Cruzar a borda não prova que a pessoa olhou nem que o elemento está desobstruído. Se o destaque tem animação, respeite prefers-reduced-motion. Desligue o observador quando a região sair da tela e mantenha uma versão parada dela.
Motion cuida das animações que acompanham mudança de estado, entrada, saída e gesto. Você diz onde o elemento tem que chegar e como é a transição, e a biblioteca calcula o caminho do meio. Vale quando vários elementos reagem à mesma ação; para mudar uma cor, o CSS resolve com menos peso.
Anime a entrada de um item da lista de tarefas só depois que ele for mesmo criado. O texto e a posição final precisam existir na página mesmo que a animação não rode, senão a pessoa fica sem a informação. Em React, dê ao item uma chave estável, para a transição não parecer de outro registro.
Movimento não pode atrasar a confirmação da ação nem cobrir informação. Crie, apague rápido e repita, com o teclado, olhando para onde o foco vai parar. Ligue a preferência do sistema por movimento reduzido e veja a tela ainda funcionar. Cancele os efeitos quando a tela sai de uso e guarde a biblioteca junto.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
GSAP põe as mudanças visuais numa linha do tempo, a timeline, onde você marca o que acontece e quando. Serve quando a ordem no tempo ensina algo que telas paradas não contam. A licença permite uso comercial sem cobrança, com restrições para quem concorre com certos construtores visuais.
Crie uma timeline que acenda recebimento, conferência e separação na ordem da sua esteira de pedidos. Marque cada etapa com um rótulo, para poder saltar até ela, e ofereça pausar e recomeçar. Deixe o processo inteiro escrito em texto, porque ninguém deve esperar o filminho para entender.
Animação presa à rolagem tira o controle do leitor e continua gastando máquina depois que a seção sumiu. Limpe efeitos e observadores ao desmontar a tela, e teste com movimento reduzido ligado. Confira a licença do pacote e dos plugins, mantenha os avisos e carregue tudo da sua própria pasta, sem chamada externa.
Anime.js descreve transição e sequência para elementos da página, inclusive desenhos em SVG. Ajuda quando a mudança envolve várias propriedades e etapas que precisam de controle por código. Cuidado com a versão: exemplo escrito para outra geração da biblioteca parece certo e falha antes de mover qualquer coisa.
Acompanhe o pedido do cliente movendo um marcador pelo trajeto e trocando o texto da etapa a cada trecho vencido. Guarde o status em lugar separado do desenho, para a mensagem não morar só dentro da animação. Um botão de pausa deixa a pessoa examinar a passagem de uma etapa para a outra.
Propriedade não aceita, seletor que não acha nada e animação esquecida na memória são os três tropeços comuns. Clique várias vezes seguidas para ver se as sequências se atropelam, e com movimento reduzido mostre o estado final já pronto. Teste no aparelho mais fraco e empacote biblioteca e SVG.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Rive junta desenho animado com máquina de estados, uma tabelinha que escolhe a reação visual conforme o evento. O mesmo personagem reage a foco, acerto ou erro sem trocar de arquivo. Preparar e rodar isso custa tempo e máquina, então só vale quando a reação ajuda a pessoa a entender em que pé está a tarefa.
Prepare, num formulário, os estados de espera, preenchimento e envio concluído. Ligue os eventos do formulário às entradas do arquivo .riv, o pacote que guarda a animação, e escreva a mensagem de cada resultado em HTML comum. Quem não vê o personagem ainda precisa saber que o envio terminou.
Licença do runtime não libera o editor nem a arte que você escolheu. Anote a origem da animação e deixe runtime, arquivo .riv e o WebAssembly na sua pasta. Abra o arquivo direto pelo file:// e veja se fonte e imagem vinculadas aparecem. Ofereça uma imagem parada quando nada rodar.
Lottie Web toca animação descrita em JSON, quase sempre exportada de um editor de composição como o After Effects. O arquivo guarda forma, propriedade e sequência, e nem todo efeito do editor existe no navegador. Serve para ilustração curta cuja mensagem sobrevive numa imagem parada.
Carregue a animação de confirmação de cadastro com loadAnimation, escolha o renderizador SVG e entregue o conteúdo em animationData. Decida se ela repete e se começa sozinha conforme a tarefa. A frase de confirmação aparece na hora, sem esperar o último quadro para avisar que o cadastro foi concluído.
Arquivo JSON pequeno costuma apontar para imagens de fora e morre sem internet. Liste todos os ativos citados, teste a exportação de verdade e empacote runtime e arquivos. Destrua a instância ao tirar a seção da tela, respeite movimento reduzido e guarde a licença da animação separada da licença do código.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A View Transitions API amacia a troca entre duas telas, guardando a lembrança de onde o conteúdo estava. O navegador fotografa as duas vistas e conduz a passagem, enquanto o seu código continua cuidando dos dados. Trate isso como acabamento em cima de uma navegação que já funciona sozinha, mesmo sem a API.
Troque a lista pelo detalhe do produto dentro de document.startViewTransition, depois de checar se esse método existe no navegador. Lá dentro, faça a mesma atualização que você faria de qualquer jeito. Mande o foco para um lugar previsível e deixe o título da nova tela dizer qual item foi aberto.
Nome visual repetido ou atualização que chega fora de hora produz transição truncada. Alterne rápido entre telas, volte e repita com movimento reduzido ligado. Essa API não resolve roteamento nem acessibilidade, e nada do que já era obrigatório sai da lista. Se a animação atrapalhar, troque a tela direto, sem ela.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
prefers-reduced-motion é a pergunta que o site faz ao sistema: esta pessoa pediu menos movimento? Vinda a resposta, você decide qual efeito sai e qual entra no lugar. O conteúdo precisa ficar completo dos dois jeitos, inclusive a mensagem que antes só aparecia no meio da animação.
Deixe título e parágrafo visíveis no CSS de base, sem depender de nenhum efeito de entrada. Acrescente deslocamento e transição só dentro de prefers-reduced-motion: no-preference. Numa biblioteca de JavaScript, pergunte por matchMedia e aplique a mudança na hora quando a preferência for de redução.
Zerar a duração de todas as animações quebra código que espera o evento de fim e deixa componente pendurado no meio do caminho. Ligue a preferência antes de abrir a página e abra e feche os controles. Mude a preferência com a página aberta e veja se aguenta. Movimento decorativo, que não orienta nenhuma ação, sai fora.
O navegador já sabe animar sozinho pela Web Animations API, sem biblioteca para efeitos simples. O método animate recebe os quadros e as opções e devolve um objeto que você segura na mão. Com ele dá para pausar, retomar e cancelar, precisão que a transição automática do CSS não oferece.
Destaque por um instante o contorno da região clicada com element.animate. Guarde a referência da animação para cancelar se a pessoa escolher outra região antes do fim. A seleção de verdade mora no estado do programa e num texto na tela, e não no brilho que chamou atenção por um segundo.
Quadro de animação não pode ser a única memória do que a pessoa fez. Cancele no meio, clique várias vezes seguidas e veja como o elemento termina depois de sumir da tela. Prepare o caminho sem movimento, confira quais recursos você usou e abra o arquivo offline no navegador de destino.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Transição do CSS leva o elemento de um estado ao outro, e keyframes descrevem uma sequência com paradas no meio. Os dois resolvem efeito simples sem uma linha de código de animação. Comece pela informação que o movimento carrega, foco, seleção ou continuidade, e garanta que a tela parada já se explique.
Abra um painel suavizando opacity e transform com transition, e mantenha o controle escrito em HTML de verdade. Guarde keyframes para a sequência que realmente precisa de etapas, e ofereça pausa se ela repetir. Declare os efeitos dentro da condição de movimento permitido, com o conteúdo visível no estado básico.
Animar largura e posição obriga o navegador a refazer o layout toda hora, e transformar um elemento desloca a relação dele com o foco. Meça em vez de supor, e teste teclado, contraste e preferência de movimento. Corte laço decorativo e confirme que a impressão sai com tudo, sem elemento transparente.
O movimento acompanha a mudança de estado
Avance a mesma ação e compare a transição com a troca imediata. O texto de estado continua disponível nas duas apresentações.
- 1Recebido
- 2Conferido
- 3Concluído
Estado atual: Recebido. A sequência só avança por ação sua.
Com movimento reduzido no sistema, a transição é removida automaticamente. A ordem, a mensagem e o resultado da ação permanecem iguais.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoClaude Code CLI: Programação com IA
- Montar vídeo em React com Remotion e renderizar na sua máquina ou na AWSsugerido pelo grafoApresenta o conceito “React”, usado em “Projetar movimento, assinatura e narrativas por rolagem”.
- O que é JavaScriptsugerido pelo grafoApresenta o conceito “JavaScript”, usado em “Projetar movimento, assinatura e narrativas por rolagem”.
- Anatomia de uma Skill: Divulgação Progressiva em Três Níveissugerido pelo grafoApresenta o conceito “Skill (Agent Skill)”, usado em “Projetar movimento, assinatura e narrativas por rolagem”.
Depois, siga para
- CursoPrompt Engineering para Executivossugerido pelo grafo7 capítulos de “Prompt Engineering para Executivos” usam conceitos apresentados em “Frontends com Vibecoding”.
- CursoLLM FinOps: o custo da IA para quem assina o orçamentosugerido pelo grafo3 capítulos de “LLM FinOps: o custo da IA para quem assina o orçamento” usam conceitos apresentados em “Frontends com Vibecoding”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Astra profundoProjetar animações que orientam a açãoExaminar conexões de Projetar animações que orientam a ação
- Vídeo com IA: Claude Code, Codex e ElevenLabsMontar vídeo em HTML com HyperFrames e escolher entre ele e o RemotionExaminar conexões de Montar vídeo em HTML com HyperFrames e escolher entre ele e o Remotion
- Bastidores: Como Este Portal Foi ConstruídoO motor de cursos: conteúdo como códigoExaminar conexões de O motor de cursos: conteúdo como código
- SEO ProgramáticoTestar o template no pior caso e achar o tetoExaminar conexões de Testar o template no pior caso e achar o teto
Voltar ao capítulo anterior: Adaptar o layout ao celular e ao contêiner
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Laboratórios ao vivo deste curso
Cada laboratório monta a biblioteca real dentro da aula, com controles para você mexer e o código do exemplo para copiar. O texto de reserva descreve a demonstração para quem lê sem JavaScript. O link abre o capítulo já no ponto do laboratório.
Base UI
Prenda o foco num diálogo sem escrever o comportamento
Abra a janela Agendar visita, percorra os campos com Tab, feche com Esc e acompanhe no painel onde o foco está e para onde ele volta.
Pacote
Abrir no capítuloConstruir componentes, usar o registro e publicar o catálogo@base-ui/reactLucide e Iconify
Mantenha uma família de ícones coerente e nomeie cada botão
Mude tamanho, traço e cor da barra, veja o símbolo do Iconify acompanhar o Lucide e rode a auditoria de nomes acessíveis.
Pacote
Abrir no capítuloProjetar uma linguagem de ícones e ilustraçãolucide-react, @iconify/reactMotion
Testar os três sinais que autorizam o terceiro degrau
Reproduza a entrada em sequência, aperte o botão com mola e arraste o cartão; ajuste rigidez e amortecimento e veja o que muda.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagemmotionVidstack
Ver o que separa um player de um vídeo cru
Dê o play, troque a velocidade e ligue a legenda; o painel ao lado mostra o estado que o player publica e que a etiqueta crua esconde.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagem@vidstack/reactcmdk
Achar um destino entre quarenta digitando três letras
Abra a paleta, digite fat e escolha um item só pelo teclado; o painel embaixo conta o que o filtro deixou passar e quanto tempo levou.
Pacote
Abrir no capítuloConstruir formulários e estados de interaçãocmdknumber-flow
Animar indicadores que mudam ao vivo com formato pt-BR
Veja três indicadores fictícios rolarem a cada troca e compare com o número em texto puro. Pause, reinicie e observe o separador de milhar.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisão@number-flow/reactApache ECharts
Medir o custo de desenhar 200 mil pontos com o ECharts
Troque o tipo de gráfico e o volume de pontos, leia o tempo de desenho e alterne o eixo em zero. Mude o tema do site e veja as cores refazerem.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisãoechartssharp e svgo
Escolher a variante certa da imagem e conferir o teto de 150 KB
Arraste a largura da tela simulada, troque a densidade entre 1x e 2x e veja qual arquivo o navegador escolhe, quanto ele pesa e se cabe no orçamento.
Pacote
Abrir no capítuloValidar desempenho, autenticação e segurançasharp, svgoReact Flow (xyflow)
Disparar um pedido e ver o orquestrador distribuir, conferir e responder
Alterne paralelo e sequencial, ligue e desligue a verificação e use a medição real; observe o tempo de parede em cada combinação.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robô@xyflow/reactGSAP, Web Workers e number-flow
Dividir mil tarefas entre trabalhadores reais e correr três ritmos de geração
Execute com um trabalhador, depois com quatro e oito, e compare o tempo; em seguida percorra a corrida e separe a espera inicial do ritmo.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôgsap, @number-flow/reactThree.js com React Three Fiber, drei, Rapier e XR
Carregar o braço robótico, ver a física trabalhar e entrar na cena com o visor
Carregue a cena pelo botão, inicie o ciclo, mostre os ângulos das juntas, troque a câmera e a velocidade; com visor, entre em realidade virtual.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôthree, @react-three/fiber, @react-three/drei, @react-three/rapier, @react-three/xrMotion
Ver quatro agentes em raias trocando mensagens e a revisão devolvendo um trecho
Reproduza os 60 s de modelo, percorra o tempo pelo controle e esconda as mensagens para comparar a leitura; repare no tempo de parede contra a soma.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinamotionMediaRecorder, Canvas 2D e Long Animation Frames (plataforma)
Medir o quadro da cena e gravar seis segundos dela em vídeo
Suba as partículas, force um bloqueio de 300 ms e leia o medidor; depois grave seis segundos, veja o codec escolhido e baixe o arquivo.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinasem pacotesigma.js, graphology com ForceAtlas2 e cosmos.gl
Ver o grafo real do curso e um grafo de milhares de nós se organizarem em aglomerados
Rode o layout no grafo real, passe o mouse pelos nós e busque uma entidade; troque para 20 mil nós e leia o medidor; depois carregue o modo massivo na placa de vídeo.
Pacote
Abrir no capítuloAnimar um grafo de conhecimento amplo em movimentosigma, graphology, graphology-layout-forceatlas2, graphology-generators, @cosmos.gl/graph
Capítulos vizinhos em Frontends com Vibecoding
- 08Projetar menus, popovers e modais acessíveis
- 09Adaptar o layout ao celular e ao contêiner
- 10Projetar movimento, assinatura e narrativas por rolagem
- 11Preparar imagens, ícones e vídeo para a web
- 12Construir profundidade e dirigir a montagem de vídeo