Curso profissional · 25h · TMM
A interactividade nasce da ligação entre as três, com o JS a reagir a eventos.
O DOM (Document Object Model) é a representação da página como uma árvore de objectos que o JavaScript pode ler e alterar.
const btn = document.querySelector('.botao'); btn.textContent = 'Clicado!'; btn.classList.add('activo');
Manipular o DOM = mudar a página em tempo real.
A interacção baseia-se em eventos:
btn.addEventListener('click', () => { caixa.classList.toggle('aberta'); });
Boa prática: o JS alterna classes, o CSS trata da animação.
menu.classList.toggle('aberto');
.menu { transform: translateX(-100%); transition: transform .3s; } .menu.aberto { transform: translateX(0); }
Separa lógica (JS) de aparência (CSS).
Uma transition anima a mudança de uma propriedade:
.botao { background: #4F46E5; transition: background .3s ease, transform .2s; } .botao:hover { background: #4338CA; transform: translateY(-2px); }
Simples e performante para estados (hover, focus).
Para animações com várias etapas usa-se @keyframes:
@keyframes
@keyframes pulsar { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } .icone { animation: pulsar 1s infinite; }
Controla-se duração, repetição, direcção e easing.
transform é a propriedade-chave da animação:
transform
Anima na GPU (compositor), sem reflow → muito performante.
opacity
width
height
top
left
will-change
Objectivo: 60 fps, movimento fluido.
CSS chega para a maioria. Recorre-se a JS quando é preciso:
A base de animação por JS sincronizada com o ecrã:
function loop() { // actualizar posição/estado requestAnimationFrame(loop); } requestAnimationFrame(loop);
Melhor que setInterval: alinha com o refresh (60 fps) e pausa em abas inactivas.
setInterval
GSAP é a biblioteca standard de animação web:
gsap.to('.caixa', { x: 200, rotation: 360, duration: 1 });
As timelines sequenciam e sincronizam animações:
const tl = gsap.timeline(); tl.from('.titulo', { y: 50, opacity: 0 }) .from('.texto', { y: 30, opacity: 0 }, '-=0.3') .from('.botao', { scale: 0 });
Controlo total do timing relativo. Alternativa leve: Anime.js.
Animações que disparam à medida que se faz scroll:
Dão dinamismo e guiam a leitura da página.
API nativa eficiente para detectar quando um elemento entra no ecrã:
const obs = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) e.target.classList.add('visivel'); }); }); obs.observe(document.querySelector('.card'));
Sem ouvir scroll constantemente — performante.
scroll
O parallax move camadas a velocidades diferentes, criando profundidade:
Plugin que liga animações ao scroll com precisão:
gsap.to('.painel', { x: -1000, scrollTrigger: { trigger: '.seccao', start: 'top top', scrub: true, // animação ligada ao scroll pin: true } });
Permite scroll horizontal, pin, scrub e marcadores.
O SVG é gráfico vectorial em XML:
.linha { stroke-dasharray: 300; stroke-dashoffset: 300; animation: desenhar 2s forwards; } @keyframes desenhar { to { stroke-dashoffset: 0; } }
Efeito de desenho de traço (line drawing) muito usado.
Lottie reproduz animações vectoriais complexas (criadas em After Effects) exportadas em JSON:
Movimento fluido = 60 frames por segundo (16,7 ms por frame).
will-change avisa o browser para optimizar um elemento:
.card { will-change: transform; }
Respeitar quem prefere menos movimento (acessibilidade):
@media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } }
Algumas pessoas sentem náuseas com animações; reduzir é obrigatório.
requestAnimationFrame
prefers-reduced-motion