"Mobile-friendly Multi-level Dropdown Menu Plugin - jQuery Stellarnav"
Bootstrap 3.0.0 Snippet by foysal991

<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script> <script src="//code.jquery.com/jquery-1.11.1.min.js"></script> <!------ Include the above in your HEAD tag ----------> <link href="https://fonts.googleapis.com/css?family=Exo+2:300,400" rel="stylesheet"> <link rel="stylesheet" type="text/css" media="all" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> <div id="main-nav" class="stellarnav"> <ul> <li><a href="">Dropdown</a> <ul> <li><a href="#">How deep?</a> <ul> <li><a href="#">Deep</a> <ul> <li><a href="#">Even deeper</a> <ul> <li><li><a href="#">Item</a></li></li> <li><li><a href="#">Item</a></li></li> <li><li><a href="#">Item</a></li></li> </ul> </li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> </li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> </li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Here's a very long item. It can be as long as you want</a></li> <li><a href="#">Item</a></li> </ul> </li> <li><a href="">Item 2</a></li> <li><a href="">Item 3</a></li> <li><a href="">Item 4</a></li> <li><a href="">Item 5</a></li> <li><a href="">Item 6</a></li> <li class="drop-left"><a href="">Drop Left</a> <ul> <li><a href="#">How deep?</a> <ul> <li><a href="#">Deep</a> <ul> <li><a href="#">Even deeper</a> <ul> <li><li><a href="#">Item</a></li></li> <li><li><a href="#">Item</a></li></li> <li><li><a href="#">Item</a></li></li> </ul> </li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> </li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> </li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> </li> </ul> </div><!-- .stellar-nav --> <script type="text/javascript"> jQuery(document).ready(function($) { jQuery('.stellarnav').stellarNav({ theme: 'dark' }); }); jQuery('#main-nav').stellarNav({ // adds default color to nav. (light, dark) theme : 'plain', // number in pixels to determine when the nav should turn mobile friendly breakpoint: 768, // adds a click-to-call phone link to the top of menu - i.e.: "18009084500" phoneBtn: false, // adds a location link to the top of menu - i.e.: "/location/", "http://site.com/contact-us/" locationBtn: false, // makes nav sticky on scroll sticky : false, // 'static' or 'top' - when set to 'top', this forces the mobile nav to be placed absolutely on the very top of page position: 'static', // shows dropdown arrows next to the items that have sub menus showArrows: true, // adds a close button to the end of nav closeBtn : false, // fixes horizontal scrollbar issue on very long navs scrollbarFix: false }); </script>
/* * Stellarnav.js 1.2.0 * jQuery responsive multi-level dropdown menu designed to do most of the heavy CSS work for you. * Copyright (c) 2016 Vinny Moreira - http://vinnymoreira.com * Released under the MIT license */ /* all nav */ .stellarnav { position: relative; width: 100%; z-index: 9900; line-height: normal; } .stellarnav ul { margin: 0; padding: 0; text-align: center; } .stellarnav li { list-style: none; display: block; margin: 0; padding: 0; position: relative; line-height: normal; vertical-align: middle; } .stellarnav li a { padding: 15px; display: block; text-decoration: none; color: #777; font-size: inherit; font-family: inherit; box-sizing: border-box; -webkit-transition: all .3s ease-out; -moz-transition: all .3s ease-out; transition: all .3s ease-out; } /* main level */ .stellarnav > ul > li { display: inline-block; } .stellarnav > ul > li > a { padding: 20px 40px; } /* first level dd */ .stellarnav ul ul { top: auto; width: 220px; position: absolute; z-index: 9900; text-align: left; display: none; background: #ddd; } .stellarnav li li { display: block; } /* second level dd */ .stellarnav ul ul ul { top: 0; /* dd animtion - change to auto to remove */ left: 220px; } .stellarnav > ul > li:hover > ul > li:hover > ul { opacity: 1; visibility: visible; top: 0; } /* .drop-left */ .stellarnav > ul > li.drop-left > ul { right: 0; } .stellarnav li.drop-left ul ul { left: auto; right: 220px; } /* light theme */ .stellarnav.light { background: rgba(255, 255, 255, 1); } .stellarnav.light ul ul { background: rgba(255, 255, 255, 1); } .stellarnav.light li a { color: #000; } .stellarnav.light .menu-toggle, .stellarnav.light .call-btn-mobile, .stellarnav.light .location-btn-mobile, .stellarnav.light .close-menu { color: rgba(0, 0, 0, 1); } /* dark theme */ .stellarnav.dark { background: rgba(0, 0, 0, 1); } .stellarnav.dark ul ul { background: rgba(0, 0, 0, 1); } .stellarnav.dark li a { color: #FFF; } .stellarnav.dark .menu-toggle, .stellarnav.dark .call-btn-mobile, .stellarnav.dark .location-btn-mobile, .stellarnav.dark .close-menu { color: rgba(255, 255, 255, 1); } /* sticky nav */ .stellarnav.fixed { position: fixed; width: 100%; top: 0; left: 0; z-index: 9999; } /* only used when 'scrollbarFix' is set to true in the js. This fixes horizontal scrollbar caused by the dd menus that are very long.*/ body.stellarnav-noscroll-x { overflow-x: hidden; } /* general styling */ .stellarnav li.has-sub > a:after { content: '\f0d7'; font-family: 'FontAwesome'; margin-left: 10px; } .stellarnav li li.has-sub > a:after { content: '\f0da'; font-family: 'FontAwesome'; margin-left: 10px; } .stellarnav li.drop-left li.has-sub > a:after { float: left; content: '\f0d9'; font-family: 'FontAwesome'; margin-right: 10px; } .stellarnav.hide-arrows li.has-sub > a:after, .stellarnav.hide-arrows li li.has-sub > a:after, .stellarnav.hide-arrows li.drop-left li.has-sub > a:after { display: none; } .stellarnav .menu-toggle, .stellarnav .close-menu, .stellarnav .call-btn-mobile, .stellarnav .location-btn-mobile { display: none; text-transform: uppercase; text-decoration: none; } .stellarnav .dd-toggle { display: none; position: absolute; top: 0; right: 0; padding: 0; width: 48px; height: 48px; text-align: center; z-index: 9999; border: 0; } .stellarnav .dd-toggle i { position: absolute; margin: auto; top: 33%; left: 0; right: 0; -webkit-transition: transform .3s ease-out; -moz-transition: transform .3s ease-out; transition: transform .3s ease-out; } .stellarnav.mobile > ul > li > a.dd-toggle { padding: 0; } .stellarnav li.call-btn-mobile, .stellarnav li.location-btn-mobile { display: none; } .stellarnav li.open > a.dd-toggle i { -webkit-transform: rotate(135deg); -ms-transform: rotate(135deg); -o-transform: rotate(135deg); transform: rotate(135deg); } /* mobile nav */ .stellarnav .menu-toggle, .stellarnav .call-btn-mobile, .stellarnav .location-btn-mobile, .stellarnav .close-menu { color: #777; padding: 15px; box-sizing: border-box; } .stellarnav .full { width: 100%; } .stellarnav .half { width: 50%; } .stellarnav .third { width: 33%; text-align: center; } .stellarnav .location-btn-mobile.third { text-align: center; } .stellarnav .location-btn-mobile.half { text-align: right; } .stellarnav.light .third, .stellarnav.light .half { border-left: 1px solid rgba(0, 0, 0, .15); } .stellarnav.light.left .third, .stellarnav.light.left .half { border-bottom: 1px solid rgba(0, 0, 0, .15); } .stellarnav.light.right .third, .stellarnav.light.right .half { border-bottom: 1px solid rgba(0, 0, 0, .15); } .stellarnav.light .third:first-child, .stellarnav.light .half:first-child { border-left: 0; } .stellarnav.dark .third, .stellarnav.dark .half { border-left: 1px solid rgba(255, 255, 255, .15); } .stellarnav.dark.left .third, .stellarnav.dark.left .half { border-bottom: 1px solid rgba(255, 255, 255, .15); } .stellarnav.dark.right .third, .stellarnav.dark.right .half { border-bottom: 1px solid rgba(255, 255, 255, .15); } .stellarnav.light.left .menu-toggle, .stellarnav.light.right .menu-toggle { border-bottom: 0; } .stellarnav.dark.left .menu-toggle, .stellarnav.dark.right .menu-toggle { border-bottom: 0; } .stellarnav.dark .third:first-child, .stellarnav.dark .half:first-child { border-left: 0; } .stellarnav.mobile { position: static; } .stellarnav.mobile.fixed { position: static; } .stellarnav.mobile ul { position: relative; display: none; } .stellarnav.mobile.active { padding-bottom: 0; } .stellarnav.mobile.active > ul { display: block; } .stellarnav.mobile ul { text-align: left; } .stellarnav.mobile > ul > li { display: block; } .stellarnav.mobile > ul > li > a { padding: 15px; } .stellarnav.mobile ul { background: rgba(221, 221, 221, 1); } .stellarnav.mobile ul ul { position: relative; opacity: 1; visibility: visible; width: auto; display: none; -moz-transition: none; -webkit-transition: none; -o-transition: color 0 ease-in; transition: none; } .stellarnav.mobile ul ul ul { left: auto; top: auto; } .stellarnav.mobile li.drop-left ul ul { right: auto; } .stellarnav.mobile li a { border-bottom: 1px solid rgba(255, 255, 255, .15); } .stellarnav.mobile li.has-sub a { padding-right: 50px; } .stellarnav.mobile > ul { border-top: 1px solid rgba(255, 255, 255, .15); } .stellarnav.mobile.light li a { border-bottom: 1px solid rgba(0, 0, 0, .15); } .stellarnav.mobile.light > ul { border-top: 1px solid rgba(0, 0, 0, .15); } .stellarnav.mobile li a.dd-toggle { border: 0; } .stellarnav.mobile.light li a.dd-toggle { border: 0; } .stellarnav.mobile .menu-toggle, .stellarnav.mobile .dd-toggle, .stellarnav.mobile .close-menu, .stellarnav.mobile .call-btn-mobile, .stellarnav.mobile .location-btn-mobile { display: inline-block; } .stellarnav.mobile li.call-btn-mobile { border-right: 1px solid rgba(255, 255, 255, .1); box-sizing: border-box; } .stellarnav.mobile li.call-btn-mobile, .stellarnav.mobile li.location-btn-mobile { display: inline-block; width: 50%; text-transform: uppercase; text-align: center; } .stellarnav.mobile li.call-btn-mobile.full, .stellarnav.mobile li.location-btn-mobile.full { display: block; width: 100%; text-transform: uppercase; border-right: 0; text-align: left; } .stellarnav.mobile li.call-btn-mobile i, .stellarnav.mobile li.location-btn-mobile i { margin-right: 5px; } .stellarnav.mobile.light ul { background: rgba(255, 255, 255, 1); } .stellarnav.mobile.dark ul { background: rgba(0, 0, 0, 1); } .stellarnav.mobile.dark ul ul { background: rgba(255, 255, 255, .08); } .stellarnav.mobile.light li.call-btn-mobile { border-right: 1px solid rgba(0, 0, 0, .1); } .stellarnav.mobile.top { position: absolute; width: 100%; top: 0; left: 0; z-index: 9999; } .stellarnav.mobile li.has-sub > a:after, .stellarnav.mobile li li.has-sub > a:after, .stellarnav.mobile li.drop-left li.has-sub > a:after { display: none; } /* left and right positions */ .stellarnav.mobile.right > ul, .stellarnav.mobile.left > ul { position: absolute; top: 0; bottom: 0; width: 100%; max-width: 280px; overflow-x: hidden; overflow-y: auto; -webkit-overflow-scrolling: touch; } .stellarnav.mobile.right > ul { right: 0; } .stellarnav.mobile.right .close-menu, .stellarnav.mobile.left .close-menu { display: inline-block; text-align: right; } .stellarnav.mobile.left > ul { left: 0; } .stellarnav.mobile.right .location-btn-mobile.half, .stellarnav.mobile.right .call-btn-mobile.half, .stellarnav.mobile.right .close-menu.half { text-align: center; } .stellarnav.mobile.right .location-btn-mobile.third, .stellarnav.mobile.right .call-btn-mobile.third, .stellarnav.mobile.right .close-menu.third { text-align: center; } .stellarnav.mobile.left .location-btn-mobile.half, .stellarnav.mobile.left .call-btn-mobile.half, .stellarnav.mobile.left .close-menu.half { text-align: center; } .stellarnav.mobile.left .location-btn-mobile.third, .stellarnav.mobile.left .call-btn-mobile.third, .stellarnav.mobile.left .close-menu.third { text-align: center; } .stellarnav.mobile.left .menu-toggle.half, .stellarnav.mobile.left .menu-toggle.third, .stellarnav.mobile.right .menu-toggle.half, .stellarnav.mobile.right .menu-toggle.third { text-align: left; } .stellarnav.mobile.left .close-menu.third span, .stellarnav.mobile.right .close-menu.third span { display: none; } /* left and right positions */ /* Fallback for slow javascript load */ @media only screen and (max-width : 768px) { .stellarnav { overflow: hidden; display: block; } .stellarnav ul { position: relative; display: none; } } /* mobile nav */ @media only screen and (max-width : 420px) { .stellarnav.mobile .call-btn-mobile.third span, .stellarnav.mobile .location-btn-mobile.third span { display: none; } }
/* * Stellarnav.js 1.2.0 * jQuery responsive multi-level dropdown menu designed to do most of the heavy CSS work for you. * * Copyright (c) 2016 Vinny Moreira - http://vinnymoreira.com * * Released under the MIT license */ (function($) { $.fn.stellarNav = function(options, width, breakpoint) { var $nav, $width, $breakpoint; nav = $(this); width = $(window).width(); // default settings var settings = $.extend( { theme : 'plain', // adds default color to nav. (light, dark) breakpoint: 768, // number in pixels to determine when the nav should turn mobile friendly phoneBtn: false, // adds a click-to-call phone link to the top of menu - i.e.: "18009084500" locationBtn: false, // adds a location link to the top of menu - i.e.: "/location/", "http://site.com/contact-us/" sticky : false, // makes nav sticky on scroll (desktop only) position: 'static', // 'static' or 'top' - when set to 'top', this forces the mobile nav to be placed absolutely on the very top of page showArrows: true, // shows dropdown arrows next to the items that have sub menus closeBtn : false, // adds a close button to the end of nav scrollbarFix: false // fixes horizontal scrollbar issue on very long navs }, options ); return this.each( function() { // defines black or white themes if (settings.theme == 'light' || settings.theme == 'dark') { nav.addClass(settings.theme); } if (settings.breakpoint) { breakpoint = settings.breakpoint; } // css classes for main menu mobile buttons if( settings.phoneBtn && settings.locationBtn ) { var cssClass = 'third'; } else if( settings.phoneBtn || settings.locationBtn ) { var cssClass = 'half'; } else { var cssClass = 'full'; } // adds the toggle button to open and close nav nav.prepend('<a href="#" class="menu-toggle ' + cssClass + '"><i class="fa fa-bars"></i> Menu</a>'); // adds a click-to-call link if (settings.phoneBtn && !(settings.position == 'right' || settings.position == 'left')) { var btn = '<a href="tel:'+ settings.phoneBtn +'" class="call-btn-mobile ' + cssClass + '"><i class="fa fa-phone"></i> <span>Call us</span></a>'; nav.find('a.menu-toggle').after(btn); } // adds a location page link to the beginning of nav if (settings.locationBtn && !(settings.position == 'right' || settings.position == 'left')) { var btn = '<a href="'+ settings.locationBtn +'" class="location-btn-mobile ' + cssClass + '" target="_blank"><i class="fa fa-map-marker"></i> <span>Location</span></a>'; nav.find('a.menu-toggle').after(btn); } // Makes nav sticky on scroll if (settings.sticky) { navPos = nav.offset().top; if(width >= breakpoint) { $(window).bind('scroll', function() { if ($(window).scrollTop() > navPos) { nav.addClass('fixed'); } else { nav.removeClass('fixed'); } }); } } if (settings.position == 'top') { nav.addClass('top'); } if (settings.position == 'left' || settings.position == 'right') { var closeBtn = '<a href="#" class="close-menu ' + cssClass + '"><i class="fa fa-close"></i> <span>Close</span></a>'; var phoneBtn = '<a href="tel:'+ settings.phoneBtn +'" class="call-btn-mobile ' + cssClass + '"><i class="fa fa-phone"></i></a>'; var locationBtn = '<a href="'+ settings.locationBtn +'" class="location-btn-mobile ' + cssClass + '" target="_blank"><i class="fa fa-map-marker"></i></a>'; nav.find('ul:first').prepend(closeBtn); if (settings.locationBtn) { nav.find('ul:first').prepend(locationBtn); } if (settings.phoneBtn) { nav.find('ul:first').prepend(phoneBtn); } } if (settings.position == 'right') { nav.addClass('right'); } if (settings.position == 'left') { nav.addClass('left'); } if (!settings.showArrows) { nav.addClass('hide-arrows'); } if (settings.closeBtn && !(settings.position == 'right' || settings.position == 'left')) { // adds a link to end of nav to close it nav.find('ul:first').append('<li><a href="#" class="close-menu"><i class="fa fa-close"></i> Close Menu</a></li>'); } if (settings.scrollbarFix) { $('body').addClass('stellarnav-noscroll-x'); } // opens and closes menu $('.menu-toggle').on('click', function(e) { e.stopPropagation(); // if nav position is left or right, uses fadeToggle instead of slideToggle if (settings.position == 'left' || settings.position == 'right') { nav.find('ul:first').stop(true, true).fadeToggle(250); nav.toggleClass('active'); if(nav.hasClass('active') && nav.hasClass('mobile')) { // closes the menu when clicked outside of it $(document).on('click', function(event) { // ensures menu hides only on mobile nav if(nav.hasClass('mobile')) { if (!$(event.target).closest(nav).length) { nav.find('ul:first').stop(true, true).fadeOut(250); nav.removeClass('active'); } } }); } } else { // static position - normal open and close animation nav.find('ul:first').stop(true, true).slideToggle(250); nav.toggleClass('active'); } }); // activates the close button $('.close-menu').click(function() { nav.removeClass('active'); if (settings.position == 'left' || settings.position == 'right') { nav.find('ul:first').stop(true, true).fadeToggle(250); } else { nav.find('ul:first').stop(true, true).slideUp(250).toggleClass('active'); } }); // adds toggle button to li items that have children nav.find('li a').each(function() { if ($(this).next().length > 0) { $(this).parent('li').addClass('has-sub').append('<a class="dd-toggle" href="#"><i class="fa fa-plus"></i></a>'); } }); // expands the dropdown menu on each click nav.find('li .dd-toggle').on('click', function(e) { e.preventDefault(); //$(this).parent('li').toggleClass('hover'); $(this).parent('li').children('ul').stop(true, true).slideToggle(250); $(this).parent('li').toggleClass('open'); }); var resetTriggers = function() { nav.find('li').unbind('mouseenter'); nav.find('li').unbind('mouseleave'); } var setTriggers = function() { nav.find('li').on('mouseenter', function(){ $(this).addClass('hover'); $(this).children('ul').stop(true, true).slideDown(250); }); nav.find('li').on('mouseleave', function(){ $(this).removeClass('hover'); $(this).children('ul').stop(true, true).slideUp(250); }); } windowCheck(); // check browser width in real-time function windowCheck() { var browserWidth = window.innerWidth; if(browserWidth <= breakpoint) { // mobile/tablet nav resetTriggers(); nav.addClass('mobile'); nav.removeClass('desktop'); // closes the menu when resizing window back to desktop if( !nav.hasClass('active') && nav.find('ul:first').is(':visible') ) { //nav.addClass('active'); nav.find('ul:first').hide(); } } else { // desktop nav nav.addClass('desktop'); nav.removeClass('mobile'); if(nav.hasClass('active')) { nav.removeClass('active'); } // ensures stellarnav is visible after resizing window if( !nav.hasClass('active') && nav.find('ul:first').is(':hidden') ) { nav.find('ul:first').show(); } // hides items that were open on mobile $('li.open').removeClass('open').find('ul:visible').hide(); resetTriggers(); setTriggers(); } } $(window).on('resize', function() { windowCheck(); }); }); } }(jQuery));

Related: See More


Questions / Comments: