Logo

dev-resources.site

for different kinds of informations.

Como usar requestAnimationFrame() com vanilla JS

Published at
12/12/2023
Categories
javascript
programming
portugues
Author
dougsource
Categories
3 categories in total
javascript
open
programming
open
portugues
open
Author
10 person written this
dougsource
open
Como usar requestAnimationFrame() com vanilla JS

Nota: apenas traduzi o texto abaixo e postei aqui.

O método requestAnimationFrame() informa ao navegador para executar uma callback function antes da próxima "repaint" acontecer.

É particularmente útil ao usar JavaScript para animações e repetir atualizações da IU. Por estar vinculado ao tempo de "repaint" do navegador, produz um efeito mais suave do que usar algo como setInterval().

Vejamos como isso funciona.

Criando uma callback function

O método requestAnimationFrame() aceita um argumento: uma callback function para ser executada.

window.requestAnimationFrame(function () {
    console.log('Executou!');
});
Enter fullscreen mode Exit fullscreen mode

A callback function é executada logo antes da próxima vez que o navegador executar uma repaint. Em dispositivos modernos, isso normalmente acontece 60 vezes por segundo.

Animações em loop

O método requestAnimationFrame() é executado apenas uma vez. Você pode fazer um loop repetidamente usando uma técnica chamada recursão.

Digamos que você queira contar de 0 a 500 e atualizar a IU a cada vez.

Primeiro, usaremos document.querySelector() para obter o elemento na UI e definiremos um number inicial de 0 .

var counter = document.querySelector('#counter');
var number = 0;
Enter fullscreen mode Exit fullscreen mode

Com esta técnica, em vez de usar uma function anônima com requestAnimationFrame(), você cria uma named function.

Para nosso exemplo, criaremos uma function countUp() que aumenta number em 1 e a definirá como textContent para o elemento counter.

var counter = document.querySelector('#counter');
var number = 0;

var countUp = function () {
    // Aumenta number em 1
    number++;

    // Atualiza a UI
    counter.textContent = number;
};
Enter fullscreen mode Exit fullscreen mode

Agora, é aqui que entra a recursão.

Dentro da function countUp(), chamaremos window.requestAnimationFrame() e passaremos a própria function countUp() como callback funtion. Isso fará com que ele seja executado novamente antes do próximo "repaint".

var counter = document.querySelector('#counter');
var number = 0;

var countUp = function () {
    // Aumenta number em 1
    number++;

    // Atualiza a UI
    counter.textContent = number;

    // se o number é menor ou igual a 100000,
    // execute ele novamente
    if (number <= 100000) {
        window.requestAnimationFrame(countUp);
    }
};
Enter fullscreen mode Exit fullscreen mode

Por fim, usaremos window.requestAnimationFrame() para iniciar a animação.

var counter = document.querySelector('#counter');
var number = 0;

var countUp = function () {
    // Increase number by 1
    number++;

    // Update the UI
    counter.textContent = number;

    // se o number é menor ou igual a 500,
    // execute ele novamente
    if (number < 500) {
        window.requestAnimationFrame(countUp);
    }
};

// Começa a animação
window.requestAnimationFrame(countUp);
Enter fullscreen mode Exit fullscreen mode

Cancelando requestAnimationFrame()

Se você atribuir seu método requestAnimationFrame() a uma variável, poderá usar o método cancelAnimationFrame() para cancelá-lo antes de ser executado.

// Configura a animação
var animation = window.requestAnimationFrame(function () {
    console.log('ran!');
});

// Cancela ela
window.cancelAnimationFrame(animation);
Enter fullscreen mode Exit fullscreen mode

Nesta demonstração , a callback function nunca é executada.

Compatibilidade do navegador

O método requestAnimationFrame() funciona em todos os navegadores modernos e até o IE 10. Você pode enviar o suporte de volta ao IE6 com um polyfill.

Fonte

Newsletter de Go Make Things

portugues Article's
30 articles in total
Favicon
Validação e Sanitização em Aplicações Web
Favicon
Golang básico - Comparação de Igualdade
Favicon
Guia de React re-render: tudo, tudo de uma vez
Favicon
Go + hot reload
Favicon
Como animar o scrolling para anchor links com CSS
Favicon
Como criar uma sticky navigation apenas com CSS
Favicon
Como usar requestAnimationFrame() com vanilla JS
Favicon
Como atualizar a URL do navegador sem refresh a página usando a vanilla JS History API
Favicon
Por que utilizar um elemento form quando submit campos com JavaScript?
Favicon
Quando um framework é melhor que a manipulação nativa do DOM
Favicon
Recursão com vanilla JavaScript
Favicon
Como usar async e await com vanilla JavaScript
Favicon
Construindo um show/hide disclosure component acessível com vanilla JS
Favicon
Eu <3 cascade!
Favicon
Você provavelmente não precisa de um DOMContentLoaded event em seu Javacript
Favicon
Formas de escrever Immediately Invoked Function Expression (IIFE) no JavaScript
Favicon
Event delegation e múltiplos seletores com vanilla JS
Favicon
Usando a propriedade CSS currentColor para contruir componentes extensíveis
Favicon
CurrentColor e SVGs
Favicon
WTF é gzipping (e como é diferente da minificação)?
Favicon
Como eu estruturo meus projetos vanilla JS
Favicon
Uma alternativa vanilla JS para o método moment.js timeFromNow()
Favicon
Recriando o método lodash partition() em vanilla JS
Favicon
Recriando o método lodash inRange() em vanilla JS
Favicon
Recriando o método lodash pull() em vanilla JS
Favicon
Como converter segundos para minutos e horas em vanila JS
Favicon
Gerando números randômicos com vanila JS
Favicon
Obtendo os meses formatados com vanila JS
Favicon
Como ser um desenvolvedor mais produtivo
Favicon
Como construir um site que carregue em menos de um segundo

Featured ones: