Animações CSS Orientadas por Rolagem: 5 Padrões de Animação de Rolagem com CSS Puro Sem JavaScript
Animações CSS Orientadas por Rolagem: Rolagem Suave Sem JS
Parallax com listeners de rolagem JS causando travamentos, código verboso do IntersectionObserver, sobrecarga de desempenho do requestAnimationFrame — as animações de rolagem dependem do JavaScript há muito tempo. As animações CSS orientadas por rolagem permitem implementar parallax, barras de progresso e animações de revelação puramente em CSS: zero JS, 60fps, aceleração GPU automática. Em 2026, as animações CSS orientadas por rolagem são totalmente suportadas no Chrome e Safari.
Este artigo cobre 5 padrões principais, guiando você através de scroll-timeline → view-timeline → parallax → indicador de progresso → animações de revelação.
Conceitos Básicos
| Conceito | Descrição |
|---|---|
| scroll-timeline | Linha do tempo de animação baseada na posição de rolagem |
| view-timeline | Linha do tempo de animação baseada na visibilidade do elemento |
| animation-timeline | Especifica qual linha do tempo de rolagem uma animação usa |
| animation-range | Posições de início e fim da animação dentro do intervalo de rolagem |
| scroll() | Função de linha do tempo de rolagem anônima |
| view() | Função de linha do tempo de visualização anônima |
| scroll-progress | Progresso de rolagem 0-1 |
| view-progress | Progresso de visibilidade 0-1 |
Análise do Problema: 5 Principais Desafios de Animação de Rolagem CSS
- Compatibilidade de navegadores: O suporte do Firefox está atrasado
- Depuração difícil: O suporte do DevTools para animações de rolagem é limitado
- Rolagem aninhada: A configuração de contêineres de rolagem que não são do documento é complexa
- Cálculo do intervalo de animação: A porcentagem de animation-range tem alto custo de compreensão
- Fallback: Navegadores não suportados precisam de fallback com JS
Passo a Passo: 5 Padrões de Animação de Rolagem CSS
Padrão 1: Animação de Progresso de Rolagem com scroll-timeline
/* Barra de progresso no topo da página */
@keyframes progress-bar {
from { transform: scaleX(0); }
to { transform: scaleX(1); }
}
.progress-bar {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 3px;
background: linear-gradient(90deg, #6366f1, #ec4899);
transform-origin: left;
animation: progress-bar linear;
animation-timeline: scroll(root);
}
Padrão 2: Animação de Revelação no Viewport com view-timeline
@keyframes reveal-up {
from {
opacity: 0;
transform: translateY(60px) scale(0.95);
filter: blur(4px);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
filter: blur(0);
}
}
.card {
animation: reveal-up linear both;
animation-timeline: view();
animation-range: entry 0% entry 80%;
}
Padrão 3: Efeito de Rolagem Parallax
@keyframes parallax-slow {
from { transform: translateY(0); }
to { transform: translateY(-100px); }
}
@keyframes parallax-fast {
from { transform: translateY(0); }
to { transform: translateY(-300px); }
}
.parallax-bg {
animation: parallax-slow linear both;
animation-timeline: scroll(root);
}
.parallax-fg {
animation: parallax-fast linear both;
animation-timeline: scroll(root);
}
Padrão 4: Linha do Tempo de Rolagem Nomeada
.scroller {
overflow-y: auto;
scroll-timeline-name: --my-scroller;
scroll-timeline-axis: block;
}
@keyframes rotate-icon {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.rotating-icon {
animation: rotate-icon linear;
animation-timeline: --my-scroller;
}
Padrão 5: Sequências de Animação Complexas
@keyframes hero-sequence {
0% {
opacity: 0;
transform: translateY(100px) scale(0.8);
filter: blur(10px);
}
30% {
opacity: 1;
transform: translateY(0) scale(1);
filter: blur(0);
}
70% {
opacity: 1;
transform: translateY(0) scale(1);
}
100% {
opacity: 0;
transform: translateY(-50px) scale(0.95);
}
}
.hero-title {
animation: hero-sequence linear both;
animation-timeline: view();
animation-range: entry 0% exit 100%;
}
Guia de Armadilhas
Armadilha 1: Não especificar animation-timeline
/* ❌ Errado: falta animation-timeline */
.element {
animation: slide-in 1s linear;
/* A animação não seguirá a rolagem */
}
/* ✅ Correto: especificar linha do tempo de rolagem */
.element {
animation: slide-in linear both;
animation-timeline: view();
}
Armadilha 2: Valores errados de animation-range
/* ❌ Errado: intervalo excede o intervalo de rolagem */
.element {
animation-range: entry 0% entry 200%; /* 200% inválido */
}
/* ✅ Correto: usar intervalo válido */
.element {
animation-range: entry 0% entry 100%;
}
Armadilha 3: Transform em conflito com a rolagem
/* ✅ Correto: usar dica will-change */
.parallax {
animation: parallax linear both;
animation-timeline: scroll(root);
will-change: transform;
}
Armadilha 4: Não lidar com o fallback
/* ✅ Correto: fornecer fallback */
@supports (animation-timeline: view()) {
.card {
animation: reveal-up linear both;
animation-timeline: view();
}
}
@supports not (animation-timeline: view()) {
.card { opacity: 1; transform: none; }
}
Armadilha 5: Contêiner de rolagem sem overflow
/* ✅ Correto: garantir que o contêiner seja rolável */
.scroller {
overflow-y: auto;
scroll-timeline-name: --my-scroll;
}
Solução de Erros
| # | Erro | Causa | Solução |
|---|---|---|---|
| 1 | A animação não segue a rolagem | Nenhum animation-timeline definido | Adicionar animation-timeline: view() ou scroll() |
| 2 | A animação termina cedo | animation-range muito pequeno | Aumentar o intervalo |
| 3 | Direção de parallax errada | scroll-timeline-axis mal configurado | Usar block/inline para direção |
| 4 | Linha do tempo nomeada inválida | scroll-timeline-name incompatível | Garantir que os nomes pai-filho correspondam |
| 5 | Travamento da animação | Sem will-change | Adicionar will-change: transform |
| 6 | Firefox não funciona | Navegador não suporta | Usar @supports para fallback |
| 7 | Rolagem aninhada não funciona | Conflito de rolagem interno/externo | Usar scroll-timeline nomeado |
| 8 | Animação pulando | Keyframes não suaves o suficiente | Adicionar mais keyframes ou usar linear |
| 9 | Elementos fixos anormais | transform afeta posicionamento fixo | Mover elementos fixos para fora do contêiner transform |
| 10 | Mobile não fluido | Aceleração GPU não habilitada | Adicionar transform: translateZ(0) |
Otimização Avançada
- Scroll Snap + Animações de Rolagem: Combinando rolagem paginada com animações
- Propriedades personalizadas CSS Houdini: Registrar propriedades de animação para efeitos complexos
- prefers-reduced-motion: Respeitar a preferência do usuário por movimento reduzido
- Container queries + animações de rolagem: Sinergia responsiva e de animação de rolagem
- WAAPI + Scroll Timeline: Web Animations API combinada com linhas do tempo de rolagem CSS
Comparação
| Dimensão | CSS Scroll-Driven | JS IntersectionObserver | Evento scroll JS | GSAP ScrollTrigger |
|---|---|---|---|---|
| Desempenho | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
| Volume de código | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
| Suporte de navegadores | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Flexibilidade | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Facilidade de depuração | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Curva de aprendizado | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
Resumo: As animações CSS orientadas por rolagem permitem obter efeitos de rolagem suaves com zero JS, superando amplamente as soluções JS. As animações de rolagem CSS são adequadas para cenários de interação de rolagem que buscam desempenho extremo, especialmente parallax, barras de progresso e animações de revelação. Com suporte completo do Chrome e Safari em 2026, usar com fallback @supports.
Ferramentas Online
- Formatador JSON: /pt-BR/json/format
- Calculadora de Hash: /pt-BR/encode/hash
- cURL para Código: /pt-BR/dev/curl-to-code
Experimente estas ferramentas executadas localmente no navegador — nenhum cadastro necessário →