Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

pseudo classe active do css so esta funcionando no espaço e no chrome

No google chrome e no firefox ambos tocam o som apenas quando aperto o espaço e o enter, e os dois botam o atributo active na classe quando utilizo os botões porém apenas no chrome usando a tecla espaço os estilos são aplicados.

HTLM

<!DOCTYPE html>
<html lang="pt-BR">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <title>Alan MIDI</title>

    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link
      href="https://fonts.googleapis.com/css2?family=Montserrat:wght@500;600&display=swap"
      rel="stylesheet"
    />

    <link rel="icon" type="image/png" href="images/bateria.png" />
    <link rel="stylesheet" href="css/reset.css" />
    <link rel="stylesheet" href="css/estilos.css" />
  </head>
  <body>
    <h1>Midi</h1>

    <section class="teclado">
      <button class="tecla tecla_pom">Pom</button>
      <button class="tecla tecla_clap">Clap</button>
      <button class="tecla tecla_tim">Tim</button>

      <button class="tecla tecla_puff">Puff</button>
      <button class="tecla tecla_splash">Splash</button>
      <button class="tecla tecla_toim">Toim</button>

      <button class="tecla tecla_psh">Psh</button>
      <button class="tecla tecla_tic">Tic</button>
      <button class="tecla tecla_tom">Tom</button>
    </section>

    <audio src="sounds/keyq.wav" id="som_tecla_pom"></audio>
    <audio src="sounds/keyw.wav" id="som_tecla_clap"></audio>
    <audio src="sounds/keye.wav" id="som_tecla_tim"></audio>
    <audio src="sounds/keya.wav" id="som_tecla_puff"></audio>
    <audio src="sounds/keys.wav" id="som_tecla_splash"></audio>
    <audio src="sounds/keyd.wav" id="som_tecla_toim"></audio>
    <audio src="sounds/keyz.wav" id="som_tecla_psh"></audio>
    <audio src="sounds/keyx.wav" id="som_tecla_tic"></audio>
    <audio src="sounds/keyc.wav" id="som_tecla_tom"></audio>

    <script src="main.js"></script>
  </body>
</html>

css

@import url("https://fonts.googleapis.com/css2?family=Rubik+Iso&family=VT323&display=swap");
:root {
  --cinza: #aaa;
  --vermelha: #e93d50;
  --vermelha-escura: #af303f;
  --branca: #fff;
  --luz: rgb(229, 255, 0);
}

body {
  align-items: center;
  background: linear-gradient(to right, #232526, #414345);
  display: flex;
  justify-content: center;
  flex-direction: column;
  min-height: 100vh;
}

h1 {
  color: #00f517;
  margin-bottom: 20px;
  font-size: 2rem;
  font-family: Rubik Iso, cursive;
  text-transform: uppercase;
}

.teclado {
  background-image: linear-gradient(
    110.3deg,
    rgba(72, 85, 99, 1) 8.8%,
    rgba(127, 146, 166, 1) 95.1%
  );
  border-radius: 30px;
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(3, 1fr);
  padding: 10px;
}

.tecla {
  background-color: var(--branca);
  border-radius: 30px;
  box-shadow: 3px 3px 0 var(--cinza);
  color: var(--vermelha);
  cursor: pointer;
  height: 120px;
  font-size: 1.75em;
  font-weight: bold;
  line-height: 120px;
  text-align: center;
  width: 120px;
  font-family: "VT323", monospace;
  text-transform: uppercase;
}

.tecla:active {
  background-color: var(--vermelha);
  border: 4px solid var(--vermelha);
  box-shadow: 3px 3px 0 var(--vermelha-escura) inset;
  color: var(--branca);
  outline: none;
}

.tecla:focus {
  outline: none;
  box-shadow: 1px 1px 10px var(--luz);
}

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

JS

function tocaSom(idElementoAudio) {
  document.querySelector(idElementoAudio).play();
}

const listaDeTeclas = document.querySelectorAll(".tecla");

for (let contador = 0; contador < listaDeTeclas.length; contador++) {
  const tecla = listaDeTeclas[contador];
  const instrumento = tecla.classList[1];
  const idAudio = `#som_${instrumento}`;

  tecla.onclick = function () {
    tocaSom(idAudio);
  };
  tecla.onkeydown = function (evento) {
    console.log(evento);
    if (evento.key === "Enter" || evento.key === " ") {
      tecla.classList.add("active");
    }
  };
  tecla.onkeyup = function () {
    tecla.classList.remove("active");
  };
}
4 respostas
solução!

Oi, Alan! Como você está?

Isso está acontecendo, pois a classe ativa não está sendo adicionada.

A pseudo-classe active no CSS é um estado de um elemento HTML que ocorre quando ele está sendo ativamente interagido pelo usuário, como sendo clicado. Ela entra em ação no momento do clique, nesse projeto, e é por isso que não precisamos adicionar nada especial no javascript para ativar a alteração do CSS quando o botão é clicado.

ativa é uma classe criada por nós, que será referenciada no CSS para a mudança de estilo, e no main.js para ser adicionada ao elemento, no HTML, que está selecionado. Essa interação tem uma lógica um pouquinho mais elaborada.

A diferença entre os navegadores se dá por particularidades da interpretação de cada um deles. Porém, ao fazer as alterações seguintes, é esperado que o funcionamento seja padronizado.

Vamos lá:

No main.js, altere as funções anônimas para que a classe adicionada seja ativa, e não active:

  tecla.onkeydown = function (evento) {
    console.log(evento);
    if (evento.key === "Enter" || evento.key === " ") {
      tecla.classList.add("ativa");
    }
  };
  tecla.onkeyup = function () {
    tecla.classList.remove("ativa");
  };
}

Agora, no estilos.css, adicione a classe ativa nos elementos:

.tecla.ativa,
.tecla:active  {
  background-color: var(--vermelha);
  border: 4px solid var(--vermelha);
  box-shadow: 3px 3px 0 var(--vermelha-escura) inset;
  color: var(--branca);
  outline: none;
}

e

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

Espero que dê tudo certo. Se ficar alguma dúvida, me conta!

Abração.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Obrigado pela ajuda Larissa, esta funcionando agora. :) Mas só para me esclarecer melhor, o javascrip, pelo menos dessa forma que foi feita no curso, não consegue fazer a intereção com a pseudo classe, eu tenho sempre que criar uma classe para que a lógica funcione corretamente ?

Eba, que bom!

A pseudo-classe é um pouquinho mais limitada. Elas são muito úteis em vários momentos, mas não suprem todas nossas necessidades.

Ela é automaticamente ativada quando interagimos com o botão pelo clique, ao clicar em links, em elementos de formulários interativos, entre outros. Quando estamos implementando algo que vai além dessas ativações padronizadas, é interessante utilizar o JavaScript para poder ir além, e até ter mais controle do código para futuras manutenções (caso em alguma atualização da linguagem, os parâmetros de ativação padrão mudem, por exemplo).

Além disso, a interpretação da pseudo-classe por diferentes navegadores também pode não ser a mesma. Por isso, é super recomendado utilizar JavaScript nesses casos. Isso é algo que você sentirá conforme avança em seus estudos e aumenta seu repertório de projetos e intimidade com as linguagens.

Espero ter esclarecido sua dúvida :)

Sanou minha duvida. obrigado.