We help IT Professionals succeed at work.

Hide responsive menu with JQuery click

Please help with my JQuery click logic.
currently I can only hide the mobile menu when I click the menu button. I want it to hide when we click on any menu item or anywhere outside the menu as well. What I cannot figure out is how to hide the main menu in mobile mode but not desktop mode and not breaking the sub-menu function.
Code below is in 3 parts first JQuery, then CSS then HTML

(function($) { // Begin jQuery
  $(function() { // DOM ready
    // If a link has a dropdown, add sub menu toggle.
    $('nav ul li a:not(:only-child)').click(function(e) {
      $(this).siblings('.nav-dropdown').toggle();
      // Close one dropdown when selecting another
      $('.nav-dropdown').not($(this).siblings()).hide();
      e.stopPropagation();
    });
    // Clicking away from dropdown will remove the dropdown class
    $('html').click(function() {
      $('.nav-dropdown').hide();
    });
    // Toggle open and close nav styles on click
    $('#nav-toggle').click(function() {
      $('nav ul').slideToggle();
    });
    // Hamburger to X toggle
    $('#nav-toggle').on('click', function() {
      this.classList.toggle('active');
    });
  }); // end DOM ready
})(jQuery);
body {
  margin: 0;
}

nav {
  float: right;
}

nav ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

nav ul li {
  float: left;
  position: relative;
}

nav ul li a {
  display: block;
  padding: 0 20px;
  line-height: 70px;
  background: #262626;
  color: #ffffff;
  text-decoration: none;
}

nav ul li a:hover {
  background: #2581DC;
  color: #ffffff;
}

nav ul li a:not(:only-child):after {
  padding-left: 4px;
  content: ' ▾';
}

nav ul li ul li {
  min-width: 190px;
}

nav ul li ul li a {
  padding: 15px;
  line-height: 20px;
  z-index: 1;
}

.nav-dropdown {
  position: absolute;
  display: none;
  z-index: 1;
  box-shadow: 0 3px 12px rgba(0, 0, 0, 0.15);
}

.nav-mobile {
  display: none;
  position: absolute;
  top: 0;
  right: 0;
  background: #262626;
  height: 70px;
  width: 70px;
}

#nav-toggle {
  position: absolute;
  left: 18px;
  top: 22px;
  cursor: pointer;
  padding: 10px 35px 16px 0px;
}

#nav-toggle span,
#nav-toggle span:before,
#nav-toggle span:after {
  cursor: pointer;
  border-radius: 1px;
  height: 5px;
  width: 35px;
  background: #ffffff;
  position: absolute;
  display: block;
  content: '';
  transition: all 300ms ease-in-out;
}

#nav-toggle span:before {
  top: -10px;
}

#nav-toggle span:after {
  bottom: -10px;
}

#nav-toggle.active span {
  background-color: transparent;
}

#nav-toggle.active span:before,
#nav-toggle.active span:after {
  top: 0;
}

#nav-toggle.active span:before {
  transform: rotate(45deg);
}

#nav-toggle.active span:after {
  transform: rotate(-45deg);
}

@media only screen and (max-width: 799px) {
  .nav-mobile {
    display: block;
  }
  nav {
    width: 100%;
    padding: 70px 0 15px;
  }
  nav ul {
    display: none;
  }
  nav ul li {
    float: none;
  }
  nav ul li a {
    padding: 15px;
    line-height: 20px;
  }
  nav ul li ul li a {
    padding-left: 30px;
  }
  .nav-dropdown {
    position: static;
  }
}

@media screen and (min-width: 800px) {
  .nav-list {
    display: block !important;
  }
}

.navigation {
  height: 70px;
  background: #262626;
}

.nav-container {
  max-width: 1000px;
  margin: 0 auto;
}

.brand {
  position: absolute;
  padding-left: 20px;
  float: left;
  line-height: 70px;
  text-transform: uppercase;
  font-size: 1.4em;
}

.brand a,
.brand a:visited {
  color: #ffffff;
  text-decoration: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<section class="navigation">
  <div class="nav-container">
    <div class="brand">
      <a href="#!">OASA</a>
    </div>
    <nav>
      <div class="nav-mobile">
        <a id="nav-toggle" href="#!"><span></span></a>
      </div>
      <ul class="nav-list">
        <li>
          <a href="#!">Home</a>
        </li>
        <li>
          <a href="#!">About</a>
        </li>
        <li>
          <a href="#!">Services</a>
          <ul class="nav-dropdown">
            <li>
              <a href="#!">Web Design</a>
            </li>
            <li>
              <a href="#!">Web Development</a>
            </li>
            <li>
              <a href="#!">Graphic Design</a>
            </li>
          </ul>
        </li>
        <li>
          <a href="#!">Pricing</a>
        </li>
        <li>
          <a href="#!">Contact</a>
        </li>
      </ul>
    </nav>
  </div>
</section>

Open in new window

Comment
Watch Question

Most Valuable Expert 2017
Distinguished Expert 2019

Commented:
Try this
<script>
$(function() {
    // If a link has a dropdown, add sub menu toggle.
    $('nav ul li a:not(:only-child)').click(function(e) {
      $(this).siblings('.nav-dropdown').toggle();
      // Close one dropdown when selecting another
      $('.nav-dropdown').not($(this).siblings()).hide();
      e.stopPropagation();
    });
    // Clicking away from dropdown will remove the dropdown class
/*
Removed and added to event handler below
    $('html').click(function() {
      $('.nav-dropdown').hide();
    });
*/
    $('html, nav li').click(function(e) {
		if ($('.nav-mobile').is(':visible')) {
			hideMobileNav();
		}
	});

    // Toggle open and close nav styles on click
    $('#nav-toggle').click(function() {
      $('nav ul').slideToggle();
    });
	
    // Hamburger to X toggle
    $('#nav-toggle').on('click', function(e) {
      this.classList.toggle('active');
	  e.stopPropagation();
    });
	
	function hideMobileNav()
	{
      $('.nav-dropdown').hide();
	  $('nav ul').slideUp();
	  $('#nav-toggle').removeClass('active');
	}
});
</script>

Open in new window

Working sample here
Du Preez BRINKWeb developer

Author

Commented:
Thank you, we are getting close, only now in mobile mode the sub-menu is expanded by default, and in desktop mode the sub-menu do not close unless we click on the sub-menu heading again. Can you please help look at it again?
Most Valuable Expert 2017
Distinguished Expert 2019
Commented:
Second attempt
jQuery
<script>
$(function() {
  // If a link has a dropdown, add sub menu toggle.
/* Replaced with code below  
    $('nav ul li a').click(function(e) {
      $(this).siblings('.nav-dropdown').toggle();
      // Close one dropdown when selecting another
      $('.nav-dropdown').not($(this).siblings()).hide();
      e.stopPropagation();
    });
*/  
  // Clicking away from dropdown will remove the dropdown class

  $('html').click(function() {
    hideMobileNav();
  });

  $('nav li a').click(function(e) {
    if ($(this).next().hasClass('nav-dropdown')) {
      e.stopPropagation();
      $(this).siblings('.nav-dropdown').toggle();
      $('.nav-dropdown').not($(this).siblings()).hide();
    }
    else {
      hideMobileNav();
    }
  });

  // Hamburger to X toggle
  $('#nav-toggle').on('click', function(e) {
    $('nav > ul').slideToggle();
    this.classList.toggle('active');
    e.stopPropagation();
  });
  
  function hideMobileNav()
  {
    $('.nav-dropdown').hide();
    if ($('.nav-mobile').is(':visible')) {
      $('nav ul').slideUp();
      $('#nav-toggle').removeClass('active');
    }
  }
});
</script>

Open in new window

Updated sample here
Du Preez BRINKWeb developer

Author

Commented:
Thank you so much, the click now seems to work perfect.
Most Valuable Expert 2017
Distinguished Expert 2019

Commented:
You are welcome.