Search code examples
javascripthtmlcsstransitionvisibility

How to use transition/animation when changing visibility with JavaScript?


I want the dropdown to fade in and out onclick using JavaScript but now it´s just appearing and disapearing quickly.

    function toggleDropdown() {
        var x = document.getElementById("myDropdown");
    
        if (x.style.visibility === "visible") {
          x.style.visibility = "hidden";
        } else {
          x.style.visibility = "visible";
      
        }
      }
 #myDropdown{
           visibility: hidden;
           // -webkit-animation: fadeinout 4s linear forwards;
           // animation: fadeinout 4s linear forwards;
           transition: visibility 1s linear 300ms, visibility 300ms;
        }
        <div class="dropdown" id="dropdown">
          <button onclick="toggleDropdown()">Choose connection</button>
          <div id="myDropdown">
            <img src="images/searchicon.png" alt="">
            <input type="text" placeholder="">
            <a href="">Base</a>
            <a href="#blog">Blog</a>
          </div>
        </div>


Solution

  • Edit: fix visibility

    function toggleDropdown() {
      var x = document.getElementById("myDropdown");
      if (x.style.opacity === "1") {
        x.style.opacity = "0";
        x.style.visibility = "hidden";
      } 
      else {
        x.style.opacity = "1";
        x.style.visibility = "visible";
      }
    }
    #dropdown {
      height:20px;
    }
    #myDropdown {
      visibility:hidden;
      opacity:0;
      transition:visibility 0.3s linear,opacity 0.3s linear;
    }
    <div class="dropdown" id="dropdown">
        <!-- <a href="#">Open Menu</a> -->
        <button onclick="toggleDropdown()">Choose connection</button>
        <div id="myDropdown">
          <img src="images/searchicon.png" alt="">
          <input type="text" placeholder="">
          <a href="">Base</a>
          <a href="#blog">Blog</a>
        </div>
      </div>

    CSS transition only works on ordinal/calculable properties
    Instead of visibility, you should use opacity
    css

     #myDropdown{
         opacity: 0;
         transition: opacity 1s linear 300ms, opacity 300ms;
     }
    

    js

     function toggleDropdown() {
         var x = document.getElementById("myDropdown");
    
         if (x.style.opacity === "1") {
             x.style.opacity = "0";
         } 
         else {
             x.style.opacity = "1";
         }
     }