MOTIVE · ARTIGO
Como a animação SVG funciona e o que determina seu desempenho
Um sino balança ao ativar um lembrete; uma marca é desenhada ao concluir uma tarefa. Pequenos movimentos comunicam mudanças de estado. Veja como SVG os produz e o que medir ao usar muitos ícones.
1. Formas com uma linha do tempo
SVG descreve formas como path, circle e rect com coordenadas e atributos. viewBox="0 0 24 24" define as coordenadas internas; width e height definem o tamanho exibido. A mesma geometria pode ser usada em vários tamanhos.
A animação altera essas propriedades ao longo do tempo. Uma rotação de 0 grau no início, -18 no meio e 0 no fim faz um sino balançar. O navegador interpola conforme duration e easing, sem armazenar uma imagem para cada quadro.
2. Desenhar uma marca deslocando traços
A marca já existe. stroke-dasharray cria um padrão de traços e espaços; stroke-dashoffset desloca o início desse padrão para revelar a linha.
O exemplo normaliza as distâncias com pathLength="60" e anima dashoffset de 60 para 0. O número 60 não representa pixels da tela. Os atributos de base mostram a marca completa, mesmo sem animação ou com movimento reduzido. Cole o código em HTML para testar.
MDN · stroke-dashoffsetMDN · pathLength
Um exemplo funcional de traçado
O mesmo SVG e CSS estão abaixo. Você pode pausar ou retomar o ciclo; movimento reduzido exibe a marca completa.
<svg xmlns="http://www.w3.org/2000/svg"
width="64" height="64" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<style>
.motive-draw { animation: motive-draw 1.8s ease-in-out infinite; }
@keyframes motive-draw {
0% { stroke-dashoffset: 60; }
60%, 100% { stroke-dashoffset: 0; }
}
@media (prefers-reduced-motion: reduce) {
.motive-draw { animation: none; }
}
</style>
<path class="motive-draw" d="m6 12 4 4 8-8"
pathLength="60" stroke-dasharray="60" stroke-dashoffset="0" />
</svg> 3. CSS e Web Animations API
CSS @keyframes costuma bastar para um ciclo definido ou uma execução única. Os SVGs do Motive incluem CSS sem biblioteca adicional. A página não pode selecionar diretamente elementos internos de um SVG dentro de img; considere SVG inline para interagir com as formas.
A Web Animations API oferece reprodução, pausa e navegação temporal para editores. O Motive gera os quadros da prévia e o CSS exportado com o mesmo modelo, sem atualizar o estado React a cada quadro. Escolher CSS ou JavaScript não determina sozinho o desempenho de renderização.
4. Ser SVG não garante baixo custo
O tamanho transferido e o custo da reprodução são diferentes. Formas simples podem ser compactas; caminhos complexos, filtros e muitos elementos DOM aumentam o trabalho. SVG nem sempre é menor que GIF e não garante FPS constante em todo dispositivo.
O navegador executa o trabalho necessário de estilo, layout, pintura e composição. Propriedades animadas, área e quantidade simultânea importam. Considere primeiro transform e opacity e confira a composição real no SVG e navegador de destino.
| Efeito | Propriedades comuns | Custo a verificar |
|---|---|---|
| Rotação, movimento, escala, fade | transform, opacity | A composição pode ajudar, mas execução na GPU ou ausência de pintura não são garantidas. |
| Traçado e mudança de formas | stroke-dashoffset, d | Verifique a repintura. Vários caminhos complexos animados podem aumentar o trabalho. |
| Desfoque, sombras, muitas formas | filter, quantidade de formas e área | Reduza a região dos filtros e as formas; compare tempo de pintura e memória. |
5. Antes de adicionar movimento à interface
- Reproduza retornos breves de sucesso ou erro quando necessário e confira se um ciclo contínuo tem propósito.
- Interrompa ciclos fora da tela com IntersectionObserver e verifique abas ocultas. O Motive anima apenas os cartões visíveis no catálogo.
- Respeite prefers-reduced-motion: reduce e mantenha o estado estático significativo. Use aria-hidden para decoração e texto alternativo adequado para imagens informativas.
- Reserve espaço com width e height. SVGs inline repetidos precisam de IDs distintos para títulos, máscaras e gradientes.
- Não adicione will-change a todos os ícones antecipadamente. Meça um problema real, aplique onde necessário e compare.
6. Medir sob as mesmas condições
- Fixe ícone, tamanho, movimento e duração. Compare, por exemplo, 1, 20 e 100 animações simultâneas, registrando quantidade visível e total.
- Use um build parecido com produção. Confira transferência comprimida e requisições em Network. O tamanho do arquivo não mede sozinho o custo da reprodução.
- Grave reprodução e rolagem no Performance do DevTools. Compare Layout, Paint e atrasos de quadros. A 60Hz um quadro dura cerca de 16,7ms para a página inteira: não prometa FPS sem medir.
- Teste também em um celular real, com movimento reduzido, ícones fora da tela, abas ocultas e repetições finitas. Registre aparelho, navegador e condições para reproduzir os resultados.