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>
<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>
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?
Open in new window
Working sample here