Skip to content

JavaScript Navigation Menu

The jSuites Menu is a lightweight JavaScript plugin for building responsive sidebar navigation menus. It features collapsible folders, automatic URL-based selection, smooth animations, and transforms into a mobile-friendly slide-out panel on smaller screens. It works seamlessly with React, Angular, Vue, or vanilla JavaScript.

MethodDescription
show()Display the menu (with slide animation on mobile)
hide()Hide the menu (with slide animation on mobile)
toggle()Toggle menu visibility
load()Load the menu and apply initial selection based on current URL
update(adjustScroll?: boolean)Update the selected state based on the current URL path
select(element, event)Programmatically select a menu item
EventDescription
onclickFired when a menu link is clicked.
onclick(instance: Object, event: MouseEvent) => void
onloadFired when the menu finishes initializing.
onload(element: HTMLElement, instance: Object) => void
PropertyDescription
adjustOnLoad: booleanAuto-scroll to selected item when menu loads. Default: true
ClassDescription
.jmenuMain menu container (added automatically)
.jmenu-logoLogo image, visible only on mobile
.jmenu-iconMenu toggle button (hamburger icon)
.folderCollapsible section header
.selectedApplied to active folder and list item
PropertyDescription
--main-colorAccent color for selected item border
--main-color-lightBackground color for selected item

Create a simple sidebar navigation with collapsible folders and automatic URL-based selection.

<html>
<script src="https://jsuites.net/v6/jsuites.js"></script>
<link rel="stylesheet" href="https://jsuites.net/v6/jsuites.css" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/@jsuites/menu/menu.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jsuites/menu/menu.min.css" type="text/css" />

<button class="jmenu-icon" id="menu-toggle">Menu</button>

<div id="navigation">
    <img src="/logo.png" class="jmenu-logo" />
    <nav>
        <h2 data-icon="home" class="folder">Getting Started</h2>
        <div>
            <ul>
                <li><a href="/docs">Introduction</a></li>
                <li><a href="/docs/getting-started">Installation</a></li>
                <li><a href="/docs/changelog">Changelog</a></li>
            </ul>
        </div>
    </nav>
    <nav>
        <h2 data-icon="code" class="folder">Components</h2>
        <div>
            <ul>
                <li><a href="/docs/javascript-calendar">Calendar</a></li>
                <li><a href="/docs/dropdown">Dropdown</a></li>
                <li><a href="/docs/color-picker">Color Picker</a></li>
            </ul>
        </div>
    </nav>
</div>

<script>
const navigation = menu(document.getElementById('navigation'), {
    adjustOnLoad: true,
    onclick: function(instance, e) {
        console.log('Menu item clicked');
    }
});

document.getElementById('menu-toggle').addEventListener('click', function() {
    navigation.toggle();
});
</script>
</html>

Create a menu with subsections using h3 headings for additional grouping.

<html>
<script src="https://jsuites.net/v6/jsuites.js"></script>
<link rel="stylesheet" href="https://jsuites.net/v6/jsuites.css" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/@jsuites/menu/menu.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jsuites/menu/menu.min.css" type="text/css" />

<div id="nested-menu">
    <nav>
        <h2 data-icon="widgets" class="folder">Components</h2>
        <div>
            <h3>Form Elements</h3>
            <ul>
                <li><a href="/docs/javascript-mask">Mask</a></li>
                <li><a href="/docs/javascript-tags">Tags</a></li>
                <li><a href="/docs/rating">Rating</a></li>
            </ul>
            <h3>Layout</h3>
            <ul>
                <li><a href="/docs/javascript-tabs">Tabs</a></li>
                <li><a href="/docs/modal">Modal</a></li>
            </ul>
        </div>
    </nav>
</div>

<script>
menu(document.getElementById('nested-menu'), {
    adjustOnLoad: true
});
</script>
</html>

When using client-side routing, update the menu selection when the URL changes.

<html>
<script src="https://jsuites.net/v6/jsuites.js"></script>
<link rel="stylesheet" href="https://jsuites.net/v6/jsuites.css" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/@jsuites/menu/menu.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jsuites/menu/menu.min.css" type="text/css" />

<div id="spa-menu">
    <nav>
        <h2 class="folder">Pages</h2>
        <div>
            <ul>
                <li><a href="/">Home</a></li>
                <li><a href="/docs">Docs</a></li>
                <li><a href="/contact">Contact</a></li>
            </ul>
        </div>
    </nav>
</div>

<script>
const navigation = menu(document.getElementById('spa-menu'), {
    adjustOnLoad: true
});

// Update selection when using browser back/forward
window.addEventListener('popstate', () => {
    navigation.update(true); // true = scroll to selected item
});

// Call after programmatic navigation
function navigateTo(url) {
    history.pushState(null, '', url);
    navigation.update(true);
}
</script>
</html>

The menu automatically adapts for different screen sizes:

  • Desktop (>800px): Static sidebar, folders expand/collapse in place
  • Mobile (<800px):
    • Full-height slide-out panel with fixed positioning
    • Logo becomes visible (.jmenu-logo)
    • Close button appears in top-right corner
    • Clicking a link automatically closes the menu

The menu expects the following HTML structure:

<div id="menu">
    <!-- Optional logo for mobile view -->
    <img src="/logo.png" class="jmenu-logo" />

    <nav>
        <!-- Collapsible folder header with optional icon -->
        <h2 data-icon="icon_name" class="folder">Section Title</h2>
        <div>
            <!-- Optional subsection heading -->
            <h3>Subsection</h3>
            <ul>
                <li><a href="/path">Link Text</a></li>
            </ul>
        </div>
    </nav>
</div>