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

Alura Search Bar - Como simplificar o código CSS, JS e semântica do HTML ?

Boa noite, pessoal.

Fiz um pequeno projeto da barra de busca aqui do site do Alura para estudo dos conceitos de JavaScript, CSS e HTML que venho estudando aqui nos cursos. Disponibilizei os arquivos no GitHub. Segue o link aqui.

Deixei o melhor comentado possível para explicar a lógica do JS da animação da barra de busca e as classes do CSS.

Está funcionando tudo legal, mas queria ver se era possível simplificar ainda mais o código CSS e JS e melhorar a semântica do HTML para que ficasse com o melhor padrão de navegação possível.

Desde já, agradeço quem puder dar uma olhada e compartilhar conhecimento aqui mostrando formas de melhorar o código.

4 respostas
solução!

Vejo uma possibilidade de otimizar isso aqui: https://github.com/dharionsoares/estudo-search-bar/blob/master/js/busca.js#L35

Percebe que as duas functions ativa e desativa são quase idênticas no comportamento? Dá pra juntar isso em uma alteraStatusCamposBusca(status).

Outro ponto: o jQuery permite o encadeamento das chamadas dos métodos de um objeto:

formBusca.css('visibility', 'hidden');
          .addClass('desativado-slow');
          .removeClass('ativado-slow');

Pra poder juntar os dois, talvez tenha que eliminar o ajuste na busca.css("height", alturaBuscaDesativada);, que não está presente no ativaBusca.

Pode ajudar também padronizar os nomes -desativado e -desativada para on e off.

No geral, eu colocaria só uma classe no próprio <form class="on"> e faria o controle das animações e tamanhos no CSS.

Obrigado, Ricardo. Consegui fazer mais ou menos de acordo com o que você falou. Diminuí mais o número de linhas no busca.js

function alteraStatusBusca(mostra, esconde) {
  if (mostra == "on") {
    busca.addClass("busca-ativada").removeClass("busca-desativada");
  } else {
    busca.addClass("busca-desativada").removeClass("busca-ativada").css("height", alturaBuscaDesativada);
  }

  tituloBusca.addClass(mostra).removeClass(esconde);
  formBusca.addClass(mostra).removeClass(esconde);

  if (mostra == "on") {
    botaoBuscaAtivado = false; // desativa o botao para no proximo clique desativar a busca
  } else {
    botaoBuscaAtivado = true; // ativa o botao para no proximo clique ativar a busca
  }
}

E no evento de clique ajustei aplicando o método acima:

$(".botao-mostra-busca").click(function(){
  busca.css("height", ""); // limpa o tamanho para ficar de acordo com a ativacao/desativacao

  if (botaoBuscaAtivado) {
      botaoBuscaClicar = true // ativa o clique para mostrar a busca
  } else {
      botaoBuscaClicar = false // desativa o clique para esconder a busca
  }

  if (botaoBuscaClicar) {
    alteraStatusBusca("on", "off");
  } else {
    alteraStatusBusca("off", "on");
  }
});

No CSS modifiquei de id para classe o "titulo-busca" e "form-busca" para considerar o hidden ou visible das classes "on" e "off":

.titulo-busca {
  color: #fff;
  visibility: hidden;
}

.form-busca {
  visibility: hidden;
  position: absolute;
  left: 20em;
  top: 0.7em;
}

.off {
    visibility: hidden;
    opacity: 0;
    ...
}

.on {
    visibility: visible;
    opacity: 1;
    ...
}

Atualizei no GitHub

Fiz um PR!

Show de bola, Ricardo. Ficou muito bom !! Muito obrigado pela ajuda.

Ficou bem mais simples a lógica no busca.js e a parte de encadeamento das classes no DOM. O toggleClass também ficou bem aplicado na classe on