dropdown jQuery

by Oleh Kotsubko

HTML

<ul class="nav">
  <li>
    <a href="#">
      No dropdown
    </a>
  </li>
  <li class="button-wrapper js-button-wrapper">
    <a href="javascript:void(0)" class="dropdown-button js-dropdown-button">
      Dropdown 1 <span>▼</span>
    </a>
    <ul class="dropdown-menu js-dropdown-menu">
      <li>
        <a href="#">
          Drop Item 1
        </a>
      </li>
      <li>
        <a href="#">
          Drop Item 2
        </a>
      </li>
      <li>
        <a href="#">
          Drop Item 3
        </a>
      </li>
    </ul>
  </li>
  <li>
    <a href="#">
      No dropdown
    </a>
  </li>
  <li class="button-wrapper js-button-wrapper">
    <a href="javascript:void(0)" class="dropdown-button js-dropdown-button">
      Dropdown 2 <span>▼</span>
    </a>
    <ul class="dropdown-menu js-dropdown-menu">
      <li>
        <a href="#">
          asdf
        </a>
      </li>
    </ul>
  </li>
</ul>
<a href="#">
          asdf
        </a>
        <a href="google.com">
          asdf
        </a>
        <a href="#">
          asdf
        </a>
        <a href="#">
          asdf
        </a>

CSS

ody {
    background-color: #eee;
    text-align: center;
    padding-top: 50px;
}

.nav {
    display: block;
    font: 13px Helvetica, Tahoma, serif;
    text-transform: uppercase;
    margin: 0; 
    padding: 0;
}

.nav li {
    display: inline-block;
    list-style: none;
}

.nav .button-wrapper {
    position: relative;
}

.nav li a {
    display: block;
    color: #333;
    background-color: #fff;
    padding: 10px 20px;
    text-decoration: none;
}

.nav li a span {
    display: inline-block;
    margin-left: 5px;
    font-size: 10px;
    color: #999;
}

.nav li a:hover, .nav li a.dropdown-button.is-open {
    background-color: #289dcc;
    color: #fff;
}

a.dropdown-button.js-dropdown-button.is-open + .dropdown-menu {
    visibility: visible;
    opacity: 1;
}

.nav li a:hover span, .nav li a.dropdown-button.is-open span {
    color: #fff;
}

.nav li .dropdown-menu {
    visibility: hidden;
    opacity: 0;
    transition: all 0.3s;
    position: absolute;
    left: 0;
    padding: 0;
    margin: 0;
    margin-top: 3px;
    text-align: left;
}


.nav li .dropdown-menu a {
    width: 150px;
}

JavaScript

$(document).ready(function () {
  
   const $dropButton = $(".dropdown-button")

  $dropButton.click(function () {
    $dropButton.removeClass("is-open");
    if ($(this).parents(".js-button-wrapper").children(".js-dropdown-menu").is(":visible")) {
      $(this).parents(".js-button-wrapper")
        .children(".js-dropdown-menu")
        .parents(".js-button-wrapper")
        .children(".js-dropdown-button")
        .addClass("is-open")
    }
  });
  $(document).on("click", function (e) {
    if (!$(e.target).parents().hasClass("js-button-wrapper")) {
      $dropButton.removeClass("is-open");
    }
  });
   
});