Capítulo 12
SVG interativo com JS
2 min de leitura 369 palavras 1 gravura
Clique e teclado mudam o fill. role=button e aria-live avisam a mudança.
Trabalhe sobre uma cópia da pasta inicio do exemplo correspondente. Leia, digite, mude uma coisa, preveja, recarregue e confira. A referência completa fica na raiz da pasta do exemplo, no pacote anexo.
O que você pratica
- role button no rect?
- aria-live polite anuncia?
- array cores circular como?

Clicar o painel
Cada clique avança a cor. Enter/Espaço também.
Erro comum: só click — esquecer teclado.
Nova cor
Inclua mais um hexadecimal no array cores.
painel.addEventListener("click", () => {
i = (i + 1) % cores.length;
painel.setAttribute("fill", cores[i]);
});
Pare e experimente. Preveja o ciclo maior.
Estado visível
O texto em #status confirma a cor atual.
Não publique exercícios com dados reais. Conteúdo fictício de Recife.
Como o exemplo desta etapa funciona
A referência desta etapa reúne app.js, index.html, styles.css. Abra o resultado pronto, localize o trecho que produz svg interativo com js e só então compare com inicio. Os dois diretórios são independentes: você pode errar, restaurar e repetir sem buscar arquivos de outro capítulo.
Leitura do resultado
Observe primeiro o que permanece parado e o que responde a uma ação. Depois altere um único número, cor, coordenada ou condição. Antes de recarregar, escreva o efeito esperado. Essa previsão separa uma mudança compreendida de uma tentativa ao acaso.
Diagnóstico guiado
Se a cena sumir, confira a primeira mensagem do Console e o caminho dos arquivos. Em SVG, revise viewBox, atributos e ordem das formas. Em p5.js, confirme a biblioteca local e se setup e draw foram escritos corretamente. Em Canvas ou WebGL, verifique o contexto e os limites numéricos antes de mudar outra coisa.
Critério de avanço
Avance quando conseguir descrever a cena, modificar um parâmetro com previsão e restaurar a referência sem copiar arquivos de uma etapa posterior.
Atividades
- % cores.length faz o quê?
- keydown Enter dispara?
- Conteúdo é pessoal?
Respostas comentadas
Só abra depois de tentar.
Atividade 1. Volta ao início do array.
Atividade 2. Sim, no handler.
Atividade 3. Não — fictício.
Exemplo deste capítulo: pacote de exemplos/12-svg-interativo/.
O arquivo completo
Referência do exemplo 12-svg-interativo, reproduzida aqui para que você possa conferir sem sair da página.
index.html
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SVG interativo — Laboratório da Luz</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<a class="skip" href="#conteudo">Ir ao conteúdo</a>
<header>
<p class="tag">Laboratório da Luz · Recife</p>
<h1>SVG interativo</h1>
</header>
<main id="conteudo">
<p class="dica">Clique no retângulo (ou foque e Enter) para trocar a cor.</p>
<div class="stage" style="background:#fff">
<svg width="400" height="220" viewBox="0 0 400 220">
<rect id="painel" x="100" y="40" width="200" height="120" rx="10" fill="#1b6b6e" tabindex="0" role="button" aria-label="Trocar cor do painel"/>
</svg>
</div>
<p id="status" class="dica" aria-live="polite">Cor atual: #1b6b6e</p>
</main>
<footer>
<p>Conteúdo fictício para estudo local. Não publique dados reais.</p>
</footer>
<script src="app.js"></script>
</body>
</html>
app.js
const painel = document.getElementById("painel");
const status = document.getElementById("status");
const cores = ["#1b6b6e", "#c45c26", "#f0a04b", "#6ec6c9"];
let i = 0;
painel.addEventListener("click", () => {
i = (i + 1) % cores.length;
painel.setAttribute("fill", cores[i]);
status.textContent = "Cor atual: " + cores[i];
});
painel.addEventListener("keydown", (e) => {
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
painel.click();
}
});