skip to Main Content

How can I make when I select the option that has value 1(Mastercard) the image with id Master change the opacity to 1? And put it in a function that works for both 4 values, each on with his own id? The default image I want it to be 0.3 and when selected one of the option the image has the opacity 1.

.itemForm2 {
  width: 100%;
  position: relative;
  margin-bottom: 18px;
  margin-top: 10px;
  display: flex;
  flex-direction: row;
}

.escolhaCartao {
  display: flex;
  flex-direction: row;
  width: 218px!important;
  gap: 10px;
}

@media(min-width:768px) {
  .escolhaCartao {
    width: 258px!important;
    height: 34.32px;
    gap: 5px;
  }
  .lineFormCartao {
    display: flex;
    flex-direction: row;
    justify-content: inherit;
    gap: 16px;
  }
  .escolhaCartao img {
    opacity: .3;
  }
}
<div class="lineForm lineFormCartao">
  <div class="itemForm">
    <select id="OpcoesCartao" name="OpcoesCartao">
      <option value="1">Mastercard</option>
      <option value="2">Visa</option>
      <option value="3">Elo</option>
      <option value="4">Amex</option>
    </select>
  </div>
  <div class="itemForm2 escolhaCartao">
    <img id="master" src="images/master.png" alt="Logo cartão Mastercard">
    <img id="visa" src="images/visa.png" alt="Logo cartão Visa">
    <img id="elo" src="images/elo.png" alt="Logo cartão Elo">
    <img id="amex" src="images/amex.png" alt="Logo cartão Amex">
  </div>
</div>

2

Answers


  1. You can do it like this. This works in most browsers. Firefox should support it soon (https://caniuse.com/?search=has)

    .itemForm2 {
        width: 100%;
        position: relative;
        margin-bottom: 18px;
        margin-top: 10px;
        display: flex;
        flex-direction: row;
    }
    
    .escolhaCartao {
        display: flex;
        flex-direction: row;
        width: 218px!important;
        gap: 10px;
    }
    
    .lineForm:has( option[value="1"]:checked ) #master {
      opacity: 1;
    }
    .lineForm:has( option[value="2"]:checked ) #visa {
      opacity: 1;
    }
    .lineForm:has( option[value="3"]:checked ) #elo {
      opacity: 1;
    }
    .lineForm:has( option[value="4"]:checked ) #amex {
      opacity: 1;
    }
    
    
        .escolhaCartao {
            width: 258px!important;
            height: 34.32px;
            gap: 5px;
        }
    
        .lineFormCartao {
            display: flex;
            flex-direction: row;
            justify-content: inherit;
            gap: 16px;
        }
        .escolhaCartao img {
            opacity: .3;
        }
    <div class="lineForm lineFormCartao">
            <div class="itemForm">
                 <select id="OpcoesCartao" name="OpcoesCartao">
                     <option value="1">Mastercard</option>
                     <option value="2">Visa</option>
                     <option value="3">Elo</option>
                     <option value="4">Amex</option>
                 </select>
            </div>
            <div class="itemForm2 escolhaCartao">
                <img id="master" src="images/master.png" alt="Logo cartão Mastercard">
                <img id="visa" src="images/visa.png" alt="Logo cartão Visa">
                <img id="elo" src="images/elo.png" alt="Logo cartão Elo">
                <img id="amex" src="images/amex.png" alt="Logo cartão Amex">
           </div>
    </div>
    Login or Signup to reply.
  2. Using just CSS with has

    .escolhaCartao img {
     opacity: .2;
    }
    
    .itemForm:has(option[value="1"]:checked) + .itemForm2 > #master,
    .itemForm:has(option[value="2"]:checked) + .itemForm2 > #visa,
    .itemForm:has(option[value="3"]:checked) + .itemForm2 > #elo,
    .itemForm:has(option[value="4"]:checked) + .itemForm2 > #amex
    {
      opacity: 1;
    }
    <div class="lineForm lineFormCartao">
      <div class="itemForm">
        <select id="OpcoesCartao" name="OpcoesCartao">
          <option value="1">Mastercard</option>
          <option value="2">Visa</option>
          <option value="3">Elo</option>
          <option value="4">Amex</option>
        </select>
      </div>
      <div class="itemForm2 escolhaCartao">
        <img id="master" src="images/master.png" alt="Logo cartão Mastercard">
        <img id="visa" src="images/visa.png" alt="Logo cartão Visa">
        <img id="elo" src="images/elo.png" alt="Logo cartão Elo">
        <img id="amex" src="images/amex.png" alt="Logo cartão Amex">
      </div>
    </div>

    with JavaScript

    var sel = document.querySelector("#OpcoesCartao");
    const imgs =  document.querySelectorAll(".escolhaCartao img");
    
    sel.addEventListener("change", function (e) {
      const val = this.value;
      const selected = document.querySelector(".escolhaCartao img.selected");
      if (selected) {
        selected.classList.remove('selected');
      }
      imgs[+val - 1].classList.add('selected');
    });
    
    sel.dispatchEvent(new Event('change'));
    .escolhaCartao img {
     opacity: .2;
    }
    
    .escolhaCartao img.selected
    {
      opacity: 1;
    }
    <div class="lineForm lineFormCartao">
      <div class="itemForm">
        <select id="OpcoesCartao" name="OpcoesCartao">
          <option value="1">Mastercard</option>
          <option value="2">Visa</option>
          <option value="3">Elo</option>
          <option value="4">Amex</option>
        </select>
      </div>
      <div class="itemForm2 escolhaCartao">
        <img id="master" src="images/master.png" alt="Logo cartão Mastercard">
        <img id="visa" src="images/visa.png" alt="Logo cartão Visa">
        <img id="elo" src="images/elo.png" alt="Logo cartão Elo">
        <img id="amex" src="images/amex.png" alt="Logo cartão Amex">
      </div>
    </div>
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search