Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Comportamento diferente pressionar Space e Enter

Boa tarde.

Tenho uma dúvida relacionada ao evento onkeydown.

Inserimos no código uma função com o parâmetro evento, condicionada ao momento que a tecla 'enter' ou a tecla 'space' está pressionada. Ao fazer isso, é adicionada na lista de classes do buttom pressionado uma classe extra chamada 'ativa', e no arquivo estiilos.css, já tem um estilo definido para essa classe. Até aqui tudo bem.

Porém, quero entender porque a tecla enter se comporta diferente da tecla space ou mesmo do clique do mouse.

Vou explicar. Quando clico com o mouse ou com a tecla space, o estilo completo do css é apresentado. Porém, quando clico com a tecla enter, apenas os estilos de cor vermelha de fundo e cor branca de texto são alterados, mas o sombreamento não aparece, como se somente parte do estilo estivesse sendo apresentada. Além disso, se eu pressionar e segurar a tecla space, somente quando eu solto o som é reproduzido, e quando pressiono e seguro a tecla enter, o som fica reproduzindo várias vezes, até que eu solte.

Para esse projeto, essa sutil diferença pode não apresentar problemas, mas penso que em projetos mais complexos isso pode dar uma dor de cabeça, então se puderem me esclarecer para que eu esteja preparado no futuro eu agradeço.

detalhe importante: estou utilizando o Chrome Versão 100.0.4896.88 (Versão oficial) 64 bits

1 resposta
solução!

Olá Willian, como vai?

Pedimos desculpa pela demora em obter um retorno.

Ótima pergunta!

Por padrão certas teclas do teclado e até mesmo o mouse exercem certas atividades no nosso computador, o que acaba afetando o sombreamento e a repetição dos sons.

No caso do sombreamento, como por padrão a tecla espaço e o click do mouse efetuam uma ativação no computador, não precisamos especificar o seu uso. Esse caso não se encaixa para a tecla enter, que adicionamos manualmente para realizar a mesma ação de ativação por meio da classe ativa.

Contudo, como o estilo de sombreamento dos botões por padrão está configurado no style.css comoactive e não ativa, não temos o efeito desejado, como mostra o código abaixo:

.tecla.active:focus,
.tecla:active:focus {
  box-shadow: 3px 3px 0 var(--vermelha-escura) inset, 1px 1px 10px var(--luz);
}

Para obter o resultado desejado alteramos o efeito de active na primeira linha. para ativa, assim adicionando o efeito de sombreamento para todos que receberem a classe:

.tecla.ativa:focus,
.tecla:active:focus {
  box-shadow: 3px 3px 0 var(--vermelha-escura) inset, 1px 1px 10px var(--luz);
}

A repetição dos sons ocorre por outro comportamento, nesse caso o do enter o enter confirma uma ação, esta tecla funciona replicando clicks contínuos do mouse em um intervalo mínimo de tempo, ou seja, é como se estivéssemos clicando sem parar no botão, confirmando sucessivamente uma mesma ação.

Caso não queria este comportamento no seu código, apresento um solução evitando que haja a repetição do som por meio de um contador e da função preventDefault().

Primeiramente criamos uma variável para o contador, ela se iniciará com o valor 0 e servirá como parâmetro para parar a ação:

let contadorDeEnter = 0;

Adicionaremos dentro do nosso if que implementa o uso de enter um outro if, este sendo responsável pelo aumento do nosso contador, dessa forma sempre que pressionarmos enter aumentaremos o valor do contador:

if(evento.code === 'Enter' || evento.code === 'NumpadEnter') {
   if(evento.code === 'Enter') {
      contadorDeEnter++;

   }
   tecla.classList.add('ativa');

}

Agora para pararmos o processo adicionamos mais um if que vai ditar a condição para que a ação seja interrompida, nesse caso usaremos a função preventDefault(), responsável por parar um evento:

if(evento.code === 'Enter' || evento.code === 'NumpadEnter') {
   if(evento.code === 'Enter') {
      contadorDeEnter++;
             if (contadorDeEnter >= 2) { 
           evento.preventDefault(); 
      }
   }
   tecla.classList.add('ativa');
}

Por fim zeramos o nosso contador quando a tecla não estiver mais sendo pressionada:

tecla.onkeyup = function () {
        tecla.classList.remove('ativa');
        contadorDeEnter = 0;
}

Segue abaixo o código funcionando:

Caso precisar de ajuda estamos à disposição, conte conosco.

Tenha um bom dia e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓