Animação com requestAnimationFrame
Crie animações suaves no canvas com o laço de quadros de animação.
Animação com requestAnimationFrame é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.
Por que usar requestAnimationFrame?
requestAnimationFrame (rAF) agenda uma chamada de retorno antes da próxima repintura do navegador, sincronizando a animação com a taxa de atualização da tela (normalmente 60fps). Ao contrário de setInterval, rAF é pausado quando a aba fica oculta, economizando CPU e bateria.
Laço básico de animação
Um laço rAF: defina uma função animate que desenha o quadro atual e depois chama requestAnimationFrame(animate) para agendar o próximo. O navegador chama animate antes de cada repintura, criando uma animação contínua na taxa de quadros da tela.
function animate(timestamp) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// draw frame at current state
draw(timestamp);
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);O parâmetro de marcação de tempo
rAF passa uma marca de tempo de alta resolução do DOM (milissegundos desde o carregamento da página) para a chamada de retorno. Use-a para calcular um movimento independente da taxa de quadros: delta = timestamp - lastTimestamp. Multiplique a velocidade por delta para mover a mesma distância por segundo, independentemente da taxa de quadros.
Movimento independente da taxa de quadros
Calcule o tempo transcorrido desde o último quadro e ajuste o movimento de acordo. Um objeto que se move a 100px/s percorre 100 * (delta / 1000) pixels por quadro. Isso garante uma física consistente em telas de 30fps e 144fps.
Interrompendo a animação
rAF retorna um identificador. Cancele-o com cancelAnimationFrame(handle). Armazene o identificador em uma variável, verifique um sinalizador de execução dentro do laço ou cancele-o durante a limpeza do componente. Sempre cancele os laços quando o elemento for removido do DOM.
Padrão de animação da tela
A cada quadro: (1) use clearRect na tela inteira, (2) atualize as variáveis de estado (posição, ângulo, tempo), (3) desenhe todos os objetos nas novas posições, (4) chame requestAnimationFrame para o próximo quadro. Nunca ignore clearRect — os quadros antigos se acumulam como um rastro.
Transições CSS versus rAF
Use transições e animações CSS para animações simples baseadas em propriedades (efeitos ao passar o cursor, entrada deslizante de janelas modais). Use rAF para animações complexas e interativas — laços de jogos, simulações físicas e renderização na tela — quando precisar de controle detalhado sobre cada quadro.
Buffer duplo na tela
Para cenas complexas, desenhe primeiro em uma tela fora da tela e depois use drawImage para desenhá-la na tela visível em uma única operação. Isso evita cintilação, pois nunca exibe um quadro parcialmente desenhado — a tela visível é atualizada atomicamente a cada quadro.
Limitação à taxa de FPS desejada
Limite a uma taxa de quadros menor (por exemplo, 30fps): verifique se transcorreu tempo suficiente desde o último desenho antes de renderizar. if (timestamp - lastDraw >= 1000/30) { draw(); lastDraw = timestamp; }. Agende rAF mesmo assim para manter a capacidade de resposta.
Depurando animações
O painel de desempenho do Chrome DevTools registra as chamadas de retorno de rAF no gráfico de chamas do JS. Procure chamadas longas que ultrapassem 16 ms — elas causam perda de quadros. Use o medidor de FPS (Renderização → medidor de FPS) para observar a taxa de quadros em tempo real durante a interação.
Alternativa: Web Animations API
Para animações declarativas mais simples, sem temporização manual: element.animate(keyframes, options). WAAPI gerencia funções de temporização, modos de preenchimento e iterações, transferindo o cálculo dos quadros para o navegador. Use rAF para a lógica de renderização personalizada que WAAPI não consegue expressar.
Verificação de conhecimento
Por que a velocidade da animação deve ser multiplicada pelo tempo delta em um laço requestAnimationFrame?
Resumo
requestAnimationFrame sincroniza a animação em JavaScript com a taxa de atualização da tela e pausa em abas ocultas. O parâmetro de marcação de tempo permite um movimento independente da taxa de quadros por meio do ajuste pelo tempo delta. O padrão de laço de animação da tela (limpar, atualizar, desenhar, agendar), combinado com cancelAnimationFrame para a limpeza, forma a base de animações web suaves e eficientes.
Perguntas Frequentes
A aula “Animação com requestAnimationFrame” é grátis?
Sim — o texto completo de “Animação com requestAnimationFrame” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.
O que vou aprender em “Animação com requestAnimationFrame”?
Crie animações suaves no canvas com o laço de quadros de animação. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar HTML Academy?
Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Animação com requestAnimationFrame”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de HTML Academy?
Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Configurando o Canvas e o contexto 2D
- Desenhando retângulos e caminhos
- Texto e imagens no Canvas
- Animação com requestAnimationFrame