Domine Animações e Efeitos Visuais com JavaScript Puro
Entenda Reflow e Repaint para Otimizar Performance Web
Quando trabalhamos em aplicações web que interagem intensamente com o DOMIntrodução ao DOM e Seleção de ElementosDescubra como o DOM transforma o HTML em uma árvore de objetos. Aprenda a selecionar e manipular elementos com métodos JavaScript para páginas dinâmicas., uma das maiores preocupações é manter a experiência do usuário fluida e responsiva
Responsividade com HTML: Viewport e `<picture>`Descubra como usar a meta viewport e o elemento picture para imagens responsivas, garantindo desempenho, usabilidade e SEO de qualidade.. Nesse contexto, entender bem como reflow (refluxo) e repaint (repintura) acontecem pode ser determinante para otimizar a performance
Debugging e Ferramentas de Desenvolvimento do NavegadorAprenda a depurar código JavaScript com as Ferramentas do Navegador. Use console, breakpoints e debugger para solucionar bugs de forma prática. do seu projeto. Neste tutorial, exploraremos os conceitos básicos do processo de renderização, como os reflows afetam o desempenho e quais técnicas podem ser usadas para minimizá-los.
O que é Fluxo de Renderização?🔗
O navegador, ao receber o código HTMLO que é HTML? Fundamentos, História e Evolução da LinguagemDescubra a origem e evolução do HTML, entendendo sua importância na estrutura da web e como influenciou o desenvolvimento digital moderno., constrói a árvore DOM
Introdução ao DOM e Seleção de ElementosDescubra como o DOM transforma o HTML em uma árvore de objetos. Aprenda a selecionar e manipular elementos com métodos JavaScript para páginas dinâmicas. e, em seguida, processa o CSS para determinar como cada elemento deve ser exibido. Na sequência, realiza o cálculo de layout (definindo posição e dimensões dos elementos
Tags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis.) e então faz a pintura (renderizando as cores, bordas e texto na tela).
Podemos representar o fluxo simplificado em um diagrama de processo:
1. Criação da DOMIntrodução ao DOM e Seleção de ElementosDescubra como o DOM transforma o HTML em uma árvore de objetos. Aprenda a selecionar e manipular elementos com métodos JavaScript para páginas dinâmicas. e CSSOM: O navegador lê e interpreta o HTML e o CSS, montando duas estruturas de dados
Fundamentos de Arrays e ObjetosDomine arrays e objetos em JavaScript com este tutorial narrativo. Aprenda a utilizar métodos e exemplos práticos para aprimorar seu desenvolvimento web. (árvore DOM e CSSOM).
2. Cálculo de Layout: O navegador decide a posição e o tamanho de cada elementoTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis.. É aqui que ocorrem os reflows.
3. Pintura: Depois do layout definido, ocorre a pintura visual de cada nó do DOMIntrodução ao DOM e Seleção de ElementosDescubra como o DOM transforma o HTML em uma árvore de objetos. Aprenda a selecionar e manipular elementos com métodos JavaScript para páginas dinâmicas. na tela.
Reflow vs. Repaint🔗
- Reflow (Refluxo): Acontece quando o navegador precisa recalcular o layout de parte ou de toda a página. Isso ocorre geralmente após mudanças estruturais ou de dimensionamento em elementos
Tags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. do DOM (por exemplo, alterações em estilos que influenciam tamanho, margem, borda, estilo de fonte ou mudanças diretas no conteúdo de width, height, etc.).
- Repaint (Repintura): Ocorre quando apenas a aparência
Relação entre HTML e CSSDescubra como HTML e CSS trabalham juntos para criar páginas web esteticamente agradáveis e bem estruturadas, facilitando a manutenção e o desempenho. de um elemento é alterada, sem afetar o fluxo de layout. Mudar somente a cor de fundo
Seletores e Propriedades CSS EssenciaisAprenda a dominar o CSS com nosso tutorial completo: entenda seletores, propriedades essenciais e técnicas para criar layouts modernos e atrativos. de um elemento, por exemplo, pode disparar apenas um repaint, pois não muda a posição nem o tamanho de ninguém.
O reflow é considerado mais custoso que o repaint porque envolve o recálculo das posições de múltiplos elementos, sobretudo se a mudança ocorrer no início de uma hierarquia com diversos filhos no DOM. Já o repaint é, em geral, menos pesado, pois a posição dos elementosTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. permanece intacta.
Causas de Reflow Excessivo🔗
Alterações repetitivas no DOMIntrodução ao DOM e Seleção de ElementosDescubra como o DOM transforma o HTML em uma árvore de objetos. Aprenda a selecionar e manipular elementos com métodos JavaScript para páginas dinâmicas. podem gerar vários reflows em sequência. Abaixo, alguns gatilhos comuns:
1. Inserção ou Remoção de ElementosTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis.: Adicionar, remover ou mover elementos
Tags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. no DOM força um recálculo de layout.
2. Leitura e Escrita Alternadas no DOMIntrodução ao DOM e Seleção de ElementosDescubra como o DOM transforma o HTML em uma árvore de objetos. Aprenda a selecionar e manipular elementos com métodos JavaScript para páginas dinâmicas.: Acesso a propriedades
Classes e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters. como
offsetWidth
ou offsetHeight
imediatamente seguido de uma mudançaEventos no JavaScript: onClick, onChange e maisDescubra como os eventos em JavaScript, como onClick e onChange, possibilitam interações dinâmicas e melhoram a experiência do usuário em páginas web. no estilo pode forçar o navegador a atualizar o layout para fornecer valores atualizados.
3. MudançasEventos no JavaScript: onClick, onChange e maisDescubra como os eventos em JavaScript, como onClick e onChange, possibilitam interações dinâmicas e melhoram a experiência do usuário em páginas web. de Estilo: Qualquer alteração em propriedades CSS que envolvem cálculo de espaço (margens, larguras, alturas, bordas e posicionamentos
Posicionamento: static, relative, absolute, fixed, stickyDescubra como usar os métodos de posicionamento CSS, de static a sticky, para criar layouts interativos, precisos e eficazes.).
4. Tamanho da Janela ou RolagemOverflow e Controle de ConteúdoAprenda a controlar a propriedade overflow em CSS, dominando rolagem, ocultação de conteúdo e textos longos para layouts responsivos e acessíveis.: Redimensionar a janela ou forçar rolagem
Overflow e Controle de ConteúdoAprenda a controlar a propriedade overflow em CSS, dominando rolagem, ocultação de conteúdo e textos longos para layouts responsivos e acessíveis. pode exigir um reflow parcial ou total.
Estratégias para Minimizar Reflows🔗
Agrupando Escritas e Leituras no DOM
Sempre que você mistura leituras (por exemplo, pegar offsetHeight
) e escritas (alterar estilos) de forma desenfreada, o navegador é forçado a recalcular o layout múltiplas vezes.
- Forma não otimizada (vários reflows):
const box = document.getElementById('box');
// Lê o tamanho atual: reflow + repaint
const largura = box.offsetWidth;
// Muda o estilo: reflow + repaint
box.style.width = (largura + 50) + 'px';
// Lê de novo: reflow + repaint
const novaLargura = box.offsetWidth;
- Forma otimizada (um único reflow):
const box = document.getElementById('box');
// Lê todas as infos necessárias
const larguraAtual = box.offsetWidth;
const alturaAtual = box.offsetHeight;
// Realiza as alterações de estilo em sequência
box.style.width = (larguraAtual + 50) + 'px';
box.style.height = (alturaAtual + 50) + 'px';
// Somente depois, se for realmente necessário, faz nova leitura
const novaDimensao = box.offsetWidth;
Dessa forma, combinamos as leituras antes de efetuar as escritas. Isso reduz o número de recalculagens de layout e, consequentemente, otimiza o desempenhoDebugging e Ferramentas de Desenvolvimento do NavegadorAprenda a depurar código JavaScript com as Ferramentas do Navegador. Use console, breakpoints e debugger para solucionar bugs de forma prática..
Alterando Classes em Bloco
Em vez de alterar várias propriedadesClasses e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters. de estilo individualmente em um loop, outra abordagem comum é aplicar uma classe pré-definida em bloco, causando uma única operação de reflow. Por exemplo:
// Supondo que a nova classe "expanded-box" já esteja definida no CSS
box.classList.add('expanded-box');
alterações de margens, padding ou outras propriedadesClasses e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters. podem ser feitas via CSS nessa única classe. O navegador processa todas de uma só vez.
Manipulando Elementos “Fora do Fluxo”
Em alguns casos, pode valer a pena:
- Usar
position
ouPosicionamento: static, relative, absolute, fixed, stickyDescubra como usar os métodos de posicionamento CSS, de static a sticky, para criar layouts interativos, precisos e eficazes.: absolute
fixed
para elementosPosicionamento: static, relative, absolute, fixed, stickyDescubra como usar os métodos de posicionamento CSS, de static a sticky, para criar layouts interativos, precisos e eficazes.
Tags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. animados, evitando que eles forcem o reflow de seus irmãos dentro do layout.
- Trabalhar com
documentFragment
para inserir vários nós de uma só vez no DOMIntrodução ao DOM e Seleção de ElementosDescubra como o DOM transforma o HTML em uma árvore de objetos. Aprenda a selecionar e manipular elementos com métodos JavaScript para páginas dinâmicas., em vez de inserir nó por nó.
Essas práticas ajudam a isolar a parte que sofre mudançasEventos no JavaScript: onClick, onChange e maisDescubra como os eventos em JavaScript, como onClick e onChange, possibilitam interações dinâmicas e melhoram a experiência do usuário em páginas web. constantes, deixando todo o resto da página intacto.
Utilizando requestAnimationFrame
Para animaçõesAnimações e Efeitos com JavaScript PuroAprenda a criar animações e efeitos visuais usando JavaScript puro. Descubra técnicas que combinam performance e criatividade para interações web surpreendentes, uma forma de evitar reflows “espalhados” é usar
requestAnimationFrame
. Assim, o navegador gerencia as mudançasAnimações e Efeitos com JavaScript PuroAprenda a criar animações e efeitos visuais usando JavaScript puro. Descubra técnicas que combinam performance e criatividade para interações web surpreendentes
Eventos no JavaScript: onClick, onChange e maisDescubra como os eventos em JavaScript, como onClick e onChange, possibilitam interações dinâmicas e melhoram a experiência do usuário em páginas web. de forma sincronizada com o próximo frame de atualização:
function animar(elemento, progresso) {
elemento.style.transform = `translateX(${progresso}px)`;
}
let posicao = 0;
function passo() {
posicao += 5;
animar(document.getElementById('objetoAnimado'), posicao);
if (posicao < 200) {
requestAnimationFrame(passo);
}
}
// Inicia animação
requestAnimationFrame(passo);
Dessa maneira, o navegador agrupa as mudançasEventos no JavaScript: onClick, onChange e maisDescubra como os eventos em JavaScript, como onClick e onChange, possibilitam interações dinâmicas e melhoram a experiência do usuário em páginas web. e faz a pintura no momento mais apropriado, reduzindo o custo de renderização.
Ferramentas de Diagnóstico🔗
Para identificar gargalos de reflow, você pode usar ferramentas de desenvolvimento do navegadorDebugging e Ferramentas de Desenvolvimento do NavegadorAprenda a depurar código JavaScript com as Ferramentas do Navegador. Use console, breakpoints e debugger para solucionar bugs de forma prática., como o Chrome DevTools
Editores de Código e Ferramentas de DesenvolvimentoDescubra como escolher editores de código e utilizar DevTools para melhorar a criação e depuração de páginas HTML de forma prática e eficiente. (na aba “Performance
Debugging e Ferramentas de Desenvolvimento do NavegadorAprenda a depurar código JavaScript com as Ferramentas do Navegador. Use console, breakpoints e debugger para solucionar bugs de forma prática.” ou “Rendering”). Lá, é possível gravar uma sessão e analisar como o layout está sendo recalculado ao longo do tempo. Dessa forma, você localiza pontos críticos e verifica se estratégias de otimização estão surtindo efeito.
Tabela Resumo de Boas Práticas🔗
Boas Práticas | Benefício |
---|---|
Agrupar leituras e escritas no DOM | Reduz o número de reflows |
Alterar classes em bloco (em vez de várias props) | Evita reflows repetitivos |
Isolar elementos animados (position absolute/fixed) | Minimiza impacto no layout principal |
Utilizar requestAnimationFrame | Agrupa alterações de animação de forma eficaz |
Usar documentFragment para manipulação em massa | Reduz inserções/remoções diretas no DOM |
Conclusão🔗
Entender a dinâmica do reflow e do repaint e como minimizá-los é essencial para quem busca desempenhoDebugging e Ferramentas de Desenvolvimento do NavegadorAprenda a depurar código JavaScript com as Ferramentas do Navegador. Use console, breakpoints e debugger para solucionar bugs de forma prática. avançado em aplicações web. Ao agrupar leituras e escritas no DOM
Introdução ao DOM e Seleção de ElementosDescubra como o DOM transforma o HTML em uma árvore de objetos. Aprenda a selecionar e manipular elementos com métodos JavaScript para páginas dinâmicas., manipular elementos
Tags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. fora do fluxo, usar classes
Atributos HTML: `id`, `class`, `style`, `data-*`Aprenda a aplicar atributos id, class, style e data-* no HTML para organizar, estilizar e dinamizar sua página com praticidade e eficiência. em bloco e aproveitar APIs
Consumindo APIs com Fetch e AxiosDescubra como integrar APIs com Fetch e Axios em JavaScript. Aprenda a fazer requisições HTTP, tratar erros e usar métodos GET e POST com exemplos práticos. como
requestAnimationFrame
, garantimos menos interrupções de layout e melhoramos significativamente a experiência do usuário.Animações e Efeitos com JavaScript PuroAprenda a criar animações e efeitos visuais usando JavaScript puro. Descubra técnicas que combinam performance e criatividade para interações web surpreendentes
Aplicar essas práticas de maneira consistente permitirá que você desenvolva páginas e apps com transiçõesTransições: transition-property, transition-duration, timing-functionTransforme sua interface com transições em CSS. Aprenda a aplicar transition-property, duration e timing-function para criar animações suaves e modernas. e animações mais suaves, ganhando em performance
Debugging e Ferramentas de Desenvolvimento do NavegadorAprenda a depurar código JavaScript com as Ferramentas do Navegador. Use console, breakpoints e debugger para solucionar bugs de forma prática. e oferecendo uma experiência de alta qualidade.
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- Documentação oficial do MDN – Fornece boas referências sobre manipulação do DOM, reflow, repaint e técnicas de otimização de performance em aplicações web: developer.mozilla.org/pt-BR/docs/Web/JavaScript
- Documentação oficial do React – Útil para desenvolvedores que trabalham com frameworks que gerenciam o fluxo de renderização de forma otimizada, apesar do tutorial abordar conceitos genéricos de renderização e reflow: react.dev