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

função troca cores ao clicar em uma imagem.

Estou criando um site que, ao clicar em uma logo/imagem, ele muda a cor do fundo e a do header. Porém estou com 2 problemas.

O primeiro é que eu queria fazer ele trocar a paleta de cores duas vezes, e se clicasse uma terceira vez ele voltava para a primeira paleta. Porém eu só consigo fazer ele trocar as duas vezes, e na terceira vez que clico não acontece nada.

O segundo problema é que, como eu estou usando o filtro hue-rotate() do css, ele não possui compatibilidade com bastante navegadores/versões antigas, e se eu tentar trocar a cor de fundo usando background-color não dá certo. Alguma dica?

Aqui está o código: https://github.com/vkindrat/vkindrat.github.io

no caso é o home.html e o sobre.html

4 respostas

Fala meu querido! Tudo beleza?

Dei uma olhada no seu código e tomei a liberdade de escrever um próprio.

Criei 3 classes específicas para o cabeçalho, dei o nome de cabecalho1, cabecalho2, cabecalho3.

.cabecalho1{
        background: 10px #20B2AA;
        height: 150px;
        border-bottom: 9px inset grey;
    }

    .cabecalho2{
        background: 10px red;
        height: 150px;
        border-bottom: 9px inset grey;
    }

    .cabecalho3{
        background: 10px green;
        height: 150px;
        border-bottom: 9px inset grey;
    }

Poderiamos ter alterado a cor do elemento direto via JS, mas isso não é uma boa prática. Lembre-se que estilos devem estar contidos no CSS e não no JS. Se por um acaso a identidade visual do seu site mudar (as cores do cabeçalho), você terá que lembrar de alterar seu JS, o que é problemático.

O seu header precisará começar com a classe inicial cabecalho1

<header class="cabecalho1">

Agora, vem a parte lógica.

Esse problema tem cara de que devemos utilizar if's e tudo mais, porém abordei de maneira diferente.

portfolio.js

   let logo = document.querySelector('.logo');
    let classes = ['cabecalho1', 'cabecalho2', 'cabecalho3'];
    let posicao = 0;

    logo.addEventListener('click', function(event){
        posicao = (posicao+1)%classes.length
        event.target.parentNode.parentNode.className = classes[posicao];
    });

Criei um array com as classes que precisaria ciclar e minha variável auxiliar posicao iniciando com 0.

Dentro do addEventListener, responsável por escutar os clicks do usuário, utilizei uma lógica matemática com MOD (resto de uma divisão)

Recomento que você utilize o console.log(posicao) para entender melhor a variação.

O event é um paramêtro opcional que o navegador passa para nosso método, através dele temos algumas informações do evento.

No seu caso, a estrutura do HTML está mais ou menos assim:

<header
    <div
        <img

De acordo com o clique na img, será necessário mudar a classe do elemento header, isso é algo que podemos fazer usando o event!

event.target       //retorna o alvo do evento
event.target.parentNode //retorna o elemento pai do alvo 

Como precisaríamos subir dois níveis na hierarquia do HTML, é necessário encadear .parentNode.parentNode

O .className serve para que troquemos todas as classes do elemento, pela que queremos aplicar.

Se algo ficou nebuloso, basta perguntar!

Espero que tenha ajudado meu amigo.

Abraços e sucesso!

Hmm, ficou um pouco confuso, tem coisas que não entendi por exemplo o % depois de posicao = (posicao +1). Se tivesse uma solução seguindo mais ou menos o meu código seria melhor

Outra coisa é que eu não queria mudar só o header, mas também a cor do background, que no caso é uma imagem. Porém não é possivel mudar o background-color dela, por algum motivo a cor nova aparece e some bem rápido.

Você falou que para mudar o estilo de elementos é melhor usar apenas o css, porém, como eu faria isso sendo que preciso de um click? deveria colocar onclick direto no html?

solução!

Oi Vitor,

O símbolo de % significa módulo.

Módulo é o resto de uma divisão matemática, por exemplo:

1 % 3 = 1

2 % 3 = 2

3 % 3 = 0

Isso é um artifício matemático para quando quisermos percorrer um array, repare que o 3 é o tamanho total do array. Dessa forma, conforme fomos dividindo esses valores (1, 2, 3 , 4 ...) nunca extrapolaremos o último índice do array, que será 2, lembrando que um array começa do índice 0.

Dito isso, você mencionou que na verdade é uma imagem de background.

Você pode trocar a imagem da mesma forma que fiz, utilizando classes para cada imagem (background-image no css) e realizar a mesma lógica.

Quando eu digo para alterar estilos com o CSS é para deixar o código bem desacoplado e organizado. Se entrar mais um desenvolvedor na sua equipe, ele não vai esperar que você esteja mudando estilos diretamente com JS, a não ser que você diga isso para ele. Mas tenha em mente que não é uma boa prática.

Temos sempre que tomar cuidado com algumas coisas quando estamos desenvolvendo, você viu que alterações de HUE não são amplamente suportadas, caso seu objetivo seja alterar a mesma imagem, de acordo com o valor de HUE desejado, recomendo que você tenha cada imagem separadamente e não dependa de algo que pode ou não funcionar no navegador do cliente.

O código que deixei aqui para você ontem foi a melhor solução que encontrei no dia. Caso ainda tenha ficado nebuloso, pergunte novamente!

Espero ter ajudado.

Abraços!

Fala Vitor!

Fico feliz que tenha solucionado sua dúvida!

Estou fechando o tópico, qualquer nova dúvida basta criar um novo!

Abraços.