Multi-level Mobile Navigation With jQuery And CSS3
File Size: | 2.96 KB |
---|---|
Views Total: | 7753 |
Last Update: | |
Publish Date: | |
Official Website: | Go to website |
License: | MIT |

This is a jQuery & CSS3 based off-canvas mobile navigation where the user has the ability to access sub menu items just like a drill down menu.
How to use it:
1. Create a nested nav
list for the mobile navigation.
<nav> <div class="toggle"><span>Menu</span></div> <div class="menu-container"> <ul class="menu visually-hidden"> <li><a>Home</a></li> <li class="has-children"><a>Category<span>more</span></a> <ul class="submenu"> <li><a>jQuery</a></li> <li><a>HTML5</a></li> <li><a>CSS3</a></li> </ul> </li> <li><a>About</a></li> <li><a>Contact</a></li> <li class="has-children"><a>Social<span>more</span></a> <ul class="submenu"> <li><a>Facebook</a></li> <li><a>Twitter</a></li> </ul> </li> </ul> </div> </nav>
2. The core CSS / CSS styles for the mobile navigation.
nav { position: absolute; top: 0; left: 0; width: 100%; height: 60px; background-color: #242424; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } .menu-container { position: relative; -webkit-transform: translateX(0); transform: translateX(0); -webkit-transition: -webkit-transform 0.25s ease-out; transition: -webkit-transform 0.25s ease-out; transition: transform 0.25s ease-out; transition: transform 0.25s ease-out, -webkit-transform 0.25s ease-out; } .view-submenu .menu-container { -webkit-transform: translateX(-100%); transform: translateX(-100%); } ul { position: absolute; top: 60px; padding: 6px; width: 100%; height: 508px; color: #ededed; background-color: #313131; } ul li a { opacity: 0; display: block; padding: 10px 12px; position: relative; cursor: pointer; border-radius: 3px; -webkit-transform: translateY(12px); transform: translateY(12px); -webkit-transition: opacity 0.15s 0.1s ease-out, -webkit-transform 0.15s 0.1s ease-out; transition: opacity 0.15s 0.1s ease-out, -webkit-transform 0.15s 0.1s ease-out; transition: opacity 0.15s 0.1s ease-out, transform 0.15s 0.1s ease-out; transition: opacity 0.15s 0.1s ease-out, transform 0.15s 0.1s ease-out, -webkit-transform 0.15s 0.1s ease-out; } ul li.has-children span { position: absolute; top: 0; right: 0; bottom: 0; margin: auto; padding: 12px 16px; text-indent: -9999px; } ul li.has-children span:after { content: ""; position: absolute; top: 0; right: 12px; bottom: 0; margin: auto; padding: 4px; width: 0px; height: 0px; cursor: pointer; font-size: 0; border-bottom: 2px solid #ededed; border-right: 2px solid #ededed; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } ul li.has-children span:hover:after { border-color: #bababa; } .menu { opacity: 0; -webkit-transition: background-color 0.25s ease-out, opacity 0.15s ease-out; transition: background-color 0.25s ease-out, opacity 0.15s ease-out; } .menu.is-visible { opacity: 1; } .menu.is-visible li a { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } .view-submenu .menu { background-color: #3e3e3e; } .view-submenu .menu > li > a { opacity: 0; -webkit-transition: opacity 0.15s ease-out; transition: opacity 0.15s ease-out; } .submenu { position: absolute; top: 0; left: 100%; background-color: #313131; } .submenu li { margin-left: 60px; } .hide-submenu { position: absolute; top: 0; left: 0; width: 60px; height: 508px; cursor: pointer; background-color: #313131; -webkit-transition: background-color 0.25s ease-out; transition: background-color 0.25s ease-out; } .hide-submenu:before { opacity: 0; content: ""; position: absolute; top: 0; right: 12px; bottom: 0; margin: auto; padding: 4px; width: 6px; height: 6px; cursor: pointer; font-size: 0; border-bottom: 2px solid #ededed; border-right: 2px solid #ededed; -webkit-transform: rotate(135deg); transform: rotate(135deg); left: 0; right: -6px; -webkit-transition: opacity 0.1s ease-out; transition: opacity 0.1s ease-out; } .view-submenu .hide-submenu { background-color: #3e3e3e; } .view-submenu .hide-submenu:before { opacity: 1; -webkit-transition: opacity 0.15s 0.3s ease-out; transition: opacity 0.15s 0.3s ease-out; } .visually-hidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
3. Style the navigation toggle with the following CSS snippets.
.toggle { position: absolute; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; top: 0; left: 18px; bottom: 0; margin: auto; cursor: pointer; } .toggle span { position: relative; -webkit-align-self: center; -ms-flex-item-align: center; align-self: center; font-size: 0; width: 26px; height: 2px; background-color: #ededed; border-radius: 100px; -webkit-transition: background-color 0.2s ease-out; transition: background-color 0.2s ease-out; } .toggle span:before, .toggle span:after { content: ""; position: absolute; width: 100%; height: 100%; background-color: #ededed; border-radius: 100px; -webkit-transition: -webkit-transform .2s ease-out; transition: -webkit-transform .2s ease-out; transition: transform .2s ease-out; transition: transform .2s ease-out, -webkit-transform .2s ease-out; } .toggle span:before { bottom: calc(100% + 6px); } .toggle span:after { top: calc(100% + 6px); } .is-visible .toggle span { background-color: transparent; } .is-visible .toggle span:before { bottom: auto; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .is-visible .toggle span:after { top: auto; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); }
4. Don't forget to load the latest jQuery library in the webpage.
<script src="//code.jquery.com/jquery-3.0.0.min.js"></script>
5. The JavaScript (jQuery script) to enable the mobile navigation.
var nav = $('nav'); var menu = $('.menu'); var menuContainer = $('.menu-container'); var subMenu = $('.submenu'); var toggle = $('.toggle'); var subToggle = $('.has-children span'); var back = '<div class="hide-submenu"></div>'; var subHide = $(back); // Toggle menu toggle.on("click", function() { nav.toggleClass('is-visible'); if(menu.hasClass('visually-hidden')) { menu.toggleClass('visually-hidden is-visible') } else { menu.removeClass('is-visible'); // Wait for CSS animation setTimeout(function() { nav.removeClass('view-submenu'); menu.addClass('visually-hidden'); }, 200); } }); // Add submenu hide bar subHide.prependTo(subMenu); var subHideToggle = $('.hide-submenu'); // Show submenu subToggle.on("click", function() { nav.addClass('view-submenu'); // Hide all the submenus... subMenu.hide(); // ...except for the one being called $(this).parents('li').find('.submenu').show(); }); // Hide submenu subHideToggle.on("click", function() { nav.removeClass('view-submenu'); });
This awesome jQuery plugin is developed by hexagoncircle. For more Advanced Usages, please check the demo page or visit the official website.