Capítulo 10
Acrescentar movimento sem atrapalhar
5 min de leitura 961 palavras 1 gravura
Neste capítulo você vai oferecer uma interação discreta que respeita movimento reduzido. O objetivo é terminar uma tarefa pequena e conferir seu resultado no Mirante do Mucuripe.
Seu ponto de partida
Estude depois do capítulo 09. Retome a referência se uma experiência anterior ficou alterada. Use o exemplo 10-movimento-reduzido do pacote anexo e copie inicio/ para uma pasta de prática fora do original. A raiz do exemplo é a referência completa desta etapa. Você não precisa copiar arquivos da etapa anterior.
Abra index.html da sua cópia no navegador e o mesmo arquivo num editor de texto simples. Para mídia, ferramenta de conferência e JSON, use o teste HTTP local explicado no README. Abrir ou testar não publica a página.
Como praticar
Leia a explicação e digite ou confira o código indicado. Mude uma coisa. Anote sua previsão antes de salvar e recarregar. Compare o resultado e investigue o erro antes de avançar. Ao terminar cada experiência, restaure somente a mudança indicada, para que a próxima parta dos valores da referência. Você pode parar depois de uma lição.
A mudança deve ajudar a reconhecer a ação
Transition suaviza a troca entre valores de uma propriedade. Transform pode deslocar visualmente uma caixa sem mudar a posição dos elementos seguintes no fluxo. O botão usa um deslocamento curto quando recebe hover. A palavra do botão, o foco e a ação existem independentemente desse efeito. Não esconda uma instrução esperando que a pessoa perceba uma animação. Movimento contínuo pode distrair e não é necessário para uma pergunta fictícia. Aqui a experiência serve para reconhecer uma opção pequena e seu limite.
Faça na sua cópia
Confira transition e hover nos botões. A implementação completa está no pacote de exemplos que acompanha este volume. Confira o trecho no seu contexto antes de mudar.
button { transition: transform .15s ease; }
button:hover { transform: translateY(-2px); }
Mude uma coisa e preveja
Troque somente -2px por -1px.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
O deslocamento fica menor. A ação e o espaço dos controles continuam reconhecíveis.
Se não acontecer
Confira se o navegador está em movimento reduzido. Nesse estado, a referência remove o deslocamento de propósito.
A preferência da pessoa participa do CSS
Prefers-reduced-motion consulta uma preferência de movimento reduzido. O navegador pode recebê-la do sistema; ferramentas de desenvolvimento também permitem emular o estado. Na regra reduce, a referência retira transition e transform, inclusive no hover. Esse detalhe importa: retirar apenas a transição ainda deixaria uma troca brusca de posição. Não transforme a preferência numa exigência de instalar JavaScript. A página pode respeitá-la com CSS e continuar com foco visível e texto dos controles.
Faça na sua cópia
Confira a media query de movimento no fim da folha. A implementação completa está no pacote de exemplos que acompanha este volume. Confira o trecho no seu contexto antes de mudar.
@media (prefers-reduced-motion: reduce) {
button { transition: none; transform: none; }
button:hover { transform: none; }
}
Mude uma coisa e preveja
Ative somente a preferência de movimento reduzido no sistema ou na emulação do navegador.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
O botão deixa de se deslocar e a simulação continua funcionando. Restaure a configuração depois.
Se não acontecer
Confira as duas regras de transform. Se o hover ainda mover, uma regra mais específica pode ter prevalecido.
Hover não é a única forma de interação
Um dedo numa tela ou o teclado não produz exatamente o mesmo percurso de um ponteiro. Por isso a ação do botão não depende de mouseenter ou de um efeito visual de hover. Submit e click são eventos apropriados aos controles nativos e recebem ativação por teclado. A regra de foco permanece mesmo quando movimento é reduzido. Conferir só a aparência sob o mouse não mostra se um aluno consegue finalizar a pergunta. Teste o resultado da ação com o teclado e mantenha a orientação em texto.
Faça na sua cópia
Faça a simulação com teclado e movimento reduzido. A implementação completa está no pacote de exemplos que acompanha este volume. Confira o trecho no seu contexto antes de mudar.
Tab → campos → Simular pergunta → Enter
Mude uma coisa e preveja
Preencha dados fictícios e ative somente pelo teclado, sem usar o mouse.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
A confirmação local aparece. O efeito de deslocamento não é necessário para executar a tarefa.
Se não acontecer
Confira foco e elemento button. Uma div com estilo de botão não recebe automaticamente a mesma interação nativa.

A captura mostra uma parte da referência. Abra o exemplo para conferir a página inteira. Uma experiência temporária pode produzir outra aparência; restaure os valores antes de comparar.
Atividades para fazer antes das respostas
Use uma nova cópia da base. Tente primeiro; depois compare seus resultados com os comentários.
-
Compare o deslocamento curto e o estado de movimento reduzido.
-
Explique por que remover apenas transition não basta neste exemplo.
-
Conclua uma simulação com teclado.
Respostas comentadas
Compare o que você previu com o que observou. Uma solução diferente pode funcionar se mantiver o conteúdo e a tarefa acessíveis.
-
A preferência reduce remove a troca de posição; o controle continua com nome, foco e ação. O recurso é opcional.
-
Transform no hover ainda deslocaria o botão instantaneamente. A referência retira tanto transição quanto deslocamento nesse estado.
-
Use Tab para alcançar o controle e Enter para ativar. Confira o retorno, não apenas a presença de um contorno.
Quando seguir
Você oferece movimento opcional e mantém a tarefa disponível por teclado. Se ainda houver dúvida, repita somente a experiência que precisa esclarecer.
O arquivo completo
Referência do exemplo 10-movimento-reduzido, reproduzida aqui para que você possa conferir sem sair da página.
assets/simulacao.js
const form = document.querySelector('#visita');
const send = document.querySelector('#simular');
const status = document.querySelector('#retorno');
if (form && send && status) {
send.disabled = false;
form.addEventListener('submit', event => {
event.preventDefault();
status.textContent = 'Simulação concluída. Nada foi enviado ou guardado.';
status.focus();
});
form.addEventListener('reset', () => { status.textContent = ''; });
}