< Voltar

animation-timeline: como criar animações baseadas no scroll

Embora animation-timeline não esteja disponível no firefox (marketshare de 1.6% - brasil), dá pra arriscar usá-la em produção, e criar visuais interessantes...

javascript css html react tailwind
windows xp bg - effect

A propriedade animation-timeline chegou chegando, ela simplifica drasticamente animações no scroll, tornando o código mais limpo e performático, ela nos permite controlar animações CSS diretamente através da posição de rolagem - sem • J a v a S c r i p t •

Como Funciona

Em vez de usar animation-duration, vinculamos a animação ao progresso do scroll:

div{ animation: minhaAnimacao linear; animation-timeline: scroll(); }

Exemplos

1. Zoom Baseado no Scroll

div{ animation: zoom linear; animation-timeline: view(); } @keyframes zoom { from { scale: 0.8; opacity: 0; } to { scale: 1; opacity: 1; } }

2. Círculos Rotacionando

.circulo { animation: rotacao linear; animation-timeline: scroll(root); } @keyframes rotacao { from { rotate: 0deg; } to { rotate: 360deg; } }

3. Fade In/Out

.texto { animation: fade linear; animation-timeline: view(); animation-range: entry 0% cover 50%; } @keyframes fade { from { opacity: 0; translate: 0 50px; } to { opacity: 1; translate: 0 0; } }

Fallback para Firefox

O Firefox ainda não suporta animation-timeline nativamente. Use este fallback com JavaScript:

// Detecta suporte if (!CSS.supports('animation-timeline: scroll()')) { // Implementação alternativa const elementos = document.querySelectorAll('.animado'); window.addEventListener('scroll', () => { elementos.forEach(el => { const rect = el.getBoundingClientRect(); const windowHeight = window.innerHeight; const progress = Math.max(0, Math.min(1, 1 - rect.top / windowHeight )); // Aplica transformações manualmente el.style.opacity = progress; el.style.transform = `scale(${0.8 + progress * 0.2})`; }); }); }