This code implements a responsive drop-down menu with sub-menus in the sidebar using the Pro Sidebar library. The menu items can be expanded to reveal sub-menus, and clicking on a menu item toggles the visibility of its corresponding sub-menu. The sidebar can also be collapsed or expanded based on user interaction, and popper positioning is updated accordingly.
How to Create a Responsive Drop-Down Menu With Sub-menu In the Sidebar
1. First of all, load the Google Fonts and Remix Icon CSS by adding the following CDN links into the head tag of your HTML document.
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/remixicon@2.2.0/fonts/remixicon.css'> <link rel='stylesheet' href='https://unpkg.com/css-pro-layout@1.1.0/dist/css/css-pro-layout.css'> <link rel='stylesheet' href='https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700;800;900&display=swap'>
2. Now, set up the HTML structure for our sidebar menu. Here’s a basic example:
<div class="layout has-sidebar fixed-sidebar fixed-header"> <aside id="sidebar" class="sidebar break-point-sm has-bg-image"> <a id="btn-collapse" class="sidebar-collapser"><i class="ri-arrow-left-s-line"></i></a> <div class="image-wrapper"> <img src="assets/images/sidebar-bg.jpg" alt="sidebar background" /> </div> <div class="sidebar-layout"> <div class="sidebar-header"> <div class="pro-sidebar-logo"> <div>P</div> <h5>Pro Sidebar</h5> </div> </div> <div class="sidebar-content"> <nav class="menu open-current-submenu"> <ul> <li class="menu-header"><span> GENERAL </span></li> <li class="menu-item sub-menu"> <a href="#"> <span class="menu-icon"> <i class="ri-vip-diamond-fill"></i> </span> <span class="menu-title">Components</span> <span class="menu-suffix"> <span class="badge primary">Hot</span> </span> </a> <div class="sub-menu-list"> <ul> <li class="menu-item"> <a href="#"> <span class="menu-title">Grid</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">Layout</span> </a> </li> <li class="menu-item sub-menu"> <a href="#"> <span class="menu-title">Forms</span> </a> <div class="sub-menu-list"> <ul> <li class="menu-item"> <a href="#"> <span class="menu-title">Input</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">Select</span> </a> </li> <li class="menu-item sub-menu"> <a href="#"> <span class="menu-title">More</span> </a> <div class="sub-menu-list"> <ul> <li class="menu-item"> <a href="#"> <span class="menu-title">CheckBox</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">Radio</span> </a> </li> <li class="menu-item sub-menu"> <a href="#"> <span class="menu-title">Want more ?</span> <span class="menu-suffix">🤔</span> </a> <div class="sub-menu-list"> <ul> <li class="menu-item"> <a href="#"> <span class="menu-prefix">🎉</span> <span class="menu-title">You made it </span> </a> </li> </ul> </div> </li> </ul> </div> </li> </ul> </div> </li> </ul> </div> </li> <li class="menu-item sub-menu"> <a href="#"> <span class="menu-icon"> <i class="ri-bar-chart-2-fill"></i> </span> <span class="menu-title">Charts</span> </a> <div class="sub-menu-list"> <ul> <li class="menu-item"> <a href="#"> <span class="menu-title">Pie chart</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">Line chart</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">Bar chart</span> </a> </li> </ul> </div> </li> <li class="menu-item sub-menu"> <a href="#"> <span class="menu-icon"> <i class="ri-shopping-cart-fill"></i> </span> <span class="menu-title">E-commerce</span> </a> <div class="sub-menu-list"> <ul> <li class="menu-item"> <a href="#"> <span class="menu-title">Products</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">Orders</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">credit card</span> </a> </li> </ul> </div> </li> <li class="menu-item sub-menu"> <a href="#"> <span class="menu-icon"> <i class="ri-global-fill"></i> </span> <span class="menu-title">Maps</span> </a> <div class="sub-menu-list"> <ul> <li class="menu-item"> <a href="#"> <span class="menu-title">Google maps</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">Open street map</span> </a> </li> </ul> </div> </li> <li class="menu-item sub-menu"> <a href="#"> <span class="menu-icon"> <i class="ri-paint-brush-fill"></i> </span> <span class="menu-title">Theme</span> </a> <div class="sub-menu-list"> <ul> <li class="menu-item"> <a href="#"> <span class="menu-title">Dark</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-title">Light</span> </a> </li> </ul> </div> </li> <li class="menu-header" style="padding-top: 20px"><span> EXTRA </span></li> <li class="menu-item"> <a href="#"> <span class="menu-icon"> <i class="ri-book-2-fill"></i> </span> <span class="menu-title">Documentation</span> <span class="menu-suffix"> <span class="badge secondary">Beta</span> </span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-icon"> <i class="ri-calendar-fill"></i> </span> <span class="menu-title">Calendar</span> </a> </li> <li class="menu-item"> <a href="#"> <span class="menu-icon"> <i class="ri-service-fill"></i> </span> <span class="menu-title">Examples</span> </a> </li> </ul> </nav> </div> <div class="sidebar-footer"> <div class="footer-box"> <div> <img class="react-logo" src="https://user-images.githubusercontent.com/25878302/213938106-ca8f0485-3f30-4861-9188-2920ed7ab284.png" alt="react" /> </div> <div style="padding: 0 10px"> <span style="display: block; margin-bottom: 10px" >Pro sidebar is also available as a react package </span> <div style="margin-bottom: 15px"> <img alt="preview badge" src="https://img.shields.io/github/stars/azouaoui-med/react-pro-sidebar?style=social" /> </div> <div> <a href="https://github.com/azouaoui-med/react-pro-sidebar" target="_blank" >Check it out!</a > </div> </div> </div> </div> </div> </aside> <div id="overlay" class="overlay"></div> <div class="layout"> <main class="content"> <div> <a id="btn-toggle" href="#" class="sidebar-toggler break-point-sm"> <i class="ri-menu-line ri-xl"></i> </a> <h1 style="margin-bottom: 0">Pro Sidebar</h1> <span style="display: inline-block"> Responsive layout with advanced sidebar menu built with SCSS and vanilla Javascript </span> <br /> <span> Full Code and documentation available on <a href="https://github.com/azouaoui-med/pro-sidebar-template" target="_blank" >Github</a > </span> <div style="margin-top: 10px"> <a href="https://github.com/azouaoui-med/pro-sidebar-template" target="_blank"> <img alt="GitHub stars" src="https://img.shields.io/github/stars/azouaoui-med/pro-sidebar-template?style=social" /> </a> <a href="https://github.com/azouaoui-med/pro-sidebar-template" target="_blank"> <img alt="GitHub forks" src="https://img.shields.io/github/forks/azouaoui-med/pro-sidebar-template?style=social" /> </a> </div> </div> <div> <h2>Features</h2> <ul> <li>Fully responsive</li> <li>Collapsable sidebar</li> <li>Multi level menu</li> <li>RTL support</li> <li>Customizable</li> </ul> </div> <div> <h2>Resources</h2> <ul> <li> <a target="_blank" href="https://github.com/azouaoui-med/css-pro-layout"> Css Pro Layout</a > </li> <li> <a target="_blank" href="https://github.com/popperjs/popper-core"> Popper Core</a> </li> <li> <a target="_blank" href="https://remixicon.com/"> Remix Icons</a> </li> </ul> </div> <footer class="footer"> <small style="margin-bottom: 20px; display: inline-block"> © 2023 made with <span style="color: red; font-size: 18px">❤</span> by - <a target="_blank" href="https://azouaoui.netlify.com"> Mohamed Azouaoui </a> </small> <br /> <div class="social-links"> <a href="https://github.com/azouaoui-med" target="_blank"> <i class="ri-github-fill ri-xl"></i> </a> <a href="https://twitter.com/azouaoui_med" target="_blank"> <i class="ri-twitter-fill ri-xl"></i> </a> <a href="https://codepen.io/azouaoui-med" target="_blank"> <i class="ri-codepen-fill ri-xl"></i> </a> <a href="https://www.linkedin.com/in/mohamed-azouaoui/" target="_blank"> <i class="ri-linkedin-box-fill ri-xl"></i> </a> </div> </footer> </main> <div class="overlay"></div> </div> </div>
3. Now, let’s style our sidebar menu using CSS. Below is a snippet to style the sidebar layout. You can customize it further according to your design preferences:
.layout { z-index: 1; } .layout .header { display: flex; align-items: center; padding: 20px; } .layout .content { padding: 12px 50px; display: flex; flex-direction: column; } .layout .footer { text-align: center; margin-top: auto; margin-bottom: 20px; padding: 20px; } .sidebar { color: #7d84ab; overflow-x: hidden !important; position: relative; } .sidebar::-webkit-scrollbar-thumb { border-radius: 4px; } .sidebar:hover::-webkit-scrollbar-thumb { background-color: #1a4173; } .sidebar::-webkit-scrollbar { width: 6px; background-color: #0c1e35; } .sidebar .image-wrapper { overflow: hidden; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; display: none; } .sidebar .image-wrapper > img { width: 100%; height: 100%; object-fit: cover; object-position: center; } .sidebar.has-bg-image .image-wrapper { display: block; } .sidebar .sidebar-layout { height: auto; min-height: 100%; display: flex; flex-direction: column; position: relative; background-color: #0c1e35; z-index: 2; } .sidebar .sidebar-layout .sidebar-header { height: 100px; min-height: 100px; display: flex; align-items: center; padding: 0 20px; } .sidebar .sidebar-layout .sidebar-header > span { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .sidebar .sidebar-layout .sidebar-content { flex-grow: 1; padding: 10px 0; } .sidebar .sidebar-layout .sidebar-footer { height: 230px; min-height: 230px; display: flex; align-items: center; padding: 0 20px; } .sidebar .sidebar-layout .sidebar-footer > span { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } @keyframes swing { 0%, 30%, 50%, 70%, 100% { transform: rotate(0deg); } 10% { transform: rotate(10deg); } 40% { transform: rotate(-10deg); } 60% { transform: rotate(5deg); } 80% { transform: rotate(-5deg); } } .layout .sidebar .menu ul { list-style-type: none; padding: 0; margin: 0; } .layout .sidebar .menu .menu-header { font-weight: 600; padding: 10px 25px; font-size: 0.8em; letter-spacing: 2px; transition: opacity 0.3s; opacity: 0.5; } .layout .sidebar .menu .menu-item a { display: flex; align-items: center; height: 50px; padding: 0 20px; color: #7d84ab; } .layout .sidebar .menu .menu-item a .menu-icon { font-size: 1.2rem; width: 35px; min-width: 35px; height: 35px; line-height: 35px; text-align: center; display: inline-block; margin-right: 10px; border-radius: 2px; transition: color 0.3s; } .layout .sidebar .menu .menu-item a .menu-icon i { display: inline-block; } .layout .sidebar .menu .menu-item a .menu-title { font-size: 0.9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex-grow: 1; transition: color 0.3s; } .layout .sidebar .menu .menu-item a .menu-prefix, .layout .sidebar .menu .menu-item a .menu-suffix { display: inline-block; padding: 5px; opacity: 1; transition: opacity 0.3s; } .layout .sidebar .menu .menu-item a:hover .menu-title { color: #dee2ec; } .layout .sidebar .menu .menu-item a:hover .menu-icon { color: #dee2ec; } .layout .sidebar .menu .menu-item a:hover .menu-icon i { animation: swing ease-in-out 0.5s 1 alternate; } .layout .sidebar .menu .menu-item a:hover::after { border-color: #dee2ec !important; } .layout .sidebar .menu .menu-item.sub-menu { position: relative; } .layout .sidebar .menu .menu-item.sub-menu > a::after { content: ""; transition: transform 0.3s; border-right: 2px solid currentcolor; border-bottom: 2px solid currentcolor; width: 5px; height: 5px; transform: rotate(-45deg); } .layout .sidebar .menu .menu-item.sub-menu > .sub-menu-list { padding-left: 20px; display: none; overflow: hidden; z-index: 999; } .layout .sidebar .menu .menu-item.sub-menu.open > a { color: #dee2ec; } .layout .sidebar .menu .menu-item.sub-menu.open > a::after { transform: rotate(45deg); } .layout .sidebar .menu .menu-item.active > a .menu-title { color: #dee2ec; } .layout .sidebar .menu .menu-item.active > a::after { border-color: #dee2ec; } .layout .sidebar .menu .menu-item.active > a .menu-icon { color: #dee2ec; } .layout .sidebar .menu > ul > .sub-menu > .sub-menu-list { background-color: #0b1a2c; } .layout .sidebar .menu.icon-shape-circle .menu-item a .menu-icon, .layout .sidebar .menu.icon-shape-rounded .menu-item a .menu-icon, .layout .sidebar .menu.icon-shape-square .menu-item a .menu-icon { background-color: #0b1a2c; } .layout .sidebar .menu.icon-shape-circle .menu-item a .menu-icon { border-radius: 50%; } .layout .sidebar .menu.icon-shape-rounded .menu-item a .menu-icon { border-radius: 4px; } .layout .sidebar .menu.icon-shape-square .menu-item a .menu-icon { border-radius: 0; } .layout .sidebar:not(.collapsed) .menu > ul > .menu-item.sub-menu > .sub-menu-list { visibility: visible !important; position: static !important; transform: translate(0, 0) !important; } .layout .sidebar.collapsed .menu > ul > .menu-header { opacity: 0; } .layout .sidebar.collapsed .menu > ul > .menu-item > a .menu-prefix, .layout .sidebar.collapsed .menu > ul > .menu-item > a .menu-suffix { opacity: 0; } .layout .sidebar.collapsed .menu > ul > .menu-item.sub-menu > a::after { content: ""; width: 5px; height: 5px; background-color: currentcolor; border-radius: 50%; display: inline-block; position: absolute; right: 10px; top: 50%; border: none; transform: translateY(-50%); } .layout .sidebar.collapsed .menu > ul > .menu-item.sub-menu > a:hover::after { background-color: #dee2ec; } .layout .sidebar.collapsed .menu > ul > .menu-item.sub-menu > .sub-menu-list { transition: none !important; width: 200px; margin-left: 3px !important; border-radius: 4px; display: block !important; } .layout .sidebar.collapsed .menu > ul > .menu-item.active > a::after { background-color: #dee2ec; } .layout .sidebar.has-bg-image .menu.icon-shape-circle .menu-item a .menu-icon, .layout .sidebar.has-bg-image .menu.icon-shape-rounded .menu-item a .menu-icon, .layout .sidebar.has-bg-image .menu.icon-shape-square .menu-item a .menu-icon { background-color: rgba(11, 26, 44, 0.6); } .layout .sidebar.has-bg-image:not(.collapsed) .menu > ul > .sub-menu > .sub-menu-list { background-color: rgba(11, 26, 44, 0.6); } .layout.rtl .sidebar .menu .menu-item a .menu-icon { margin-left: 10px; margin-right: 0; } .layout.rtl .sidebar .menu .menu-item.sub-menu > a::after { transform: rotate(135deg); } .layout.rtl .sidebar .menu .menu-item.sub-menu > .sub-menu-list { padding-left: 0; padding-right: 20px; } .layout.rtl .sidebar .menu .menu-item.sub-menu.open > a::after { transform: rotate(45deg); } .layout.rtl .sidebar.collapsed .menu > ul > .menu-item.sub-menu a::after { right: auto; left: 10px; } .layout.rtl .sidebar.collapsed .menu > ul > .menu-item.sub-menu > .sub-menu-list { margin-left: -3px !important; } * { box-sizing: border-box; } body { margin: 0; height: 100vh; font-family: "Poppins", sans-serif; color: #3f4750; font-size: 0.9rem; } a { text-decoration: none; } @media (max-width: 576px) { #btn-collapse { display: none; } } .layout .sidebar .pro-sidebar-logo { display: flex; align-items: center; } .layout .sidebar .pro-sidebar-logo > div { width: 35px; min-width: 35px; height: 35px; min-height: 35px; display: flex; align-items: center; justify-content: center; border-radius: 8px; color: white; font-size: 24px; font-weight: 700; background-color: #ff8100; margin-right: 10px; } .layout .sidebar .pro-sidebar-logo > h5 { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: 20px; line-height: 30px; transition: opacity 0.3s; opacity: 1; } .layout .sidebar .footer-box { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; font-size: 0.8em; padding: 20px 0; border-radius: 8px; width: 180px; min-width: 190px; margin: 0 auto; background-color: #162d4a; } .layout .sidebar .footer-box img.react-logo { width: 40px; height: 40px; margin-bottom: 10px; } .layout .sidebar .footer-box a { color: #fff; font-weight: 600; margin-bottom: 10px; } .layout .sidebar .sidebar-collapser { transition: left, right, 0.3s; position: fixed; left: 260px; top: 40px; width: 20px; height: 20px; border-radius: 50%; background-color: #00829f; display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-align: center; align-items: center; justify-content: center; font-size: 1.2em; transform: translateX(50%); z-index: 111; cursor: pointer; color: white; box-shadow: 1px 1px 4px #0c1e35; } .layout .sidebar.collapsed .pro-sidebar-logo > h5 { opacity: 0; } .layout .sidebar.collapsed .footer-box { display: none; } .layout .sidebar.collapsed .sidebar-collapser { left: 60px; } .layout .sidebar.collapsed .sidebar-collapser i { transform: rotate(180deg); } .badge { display: inline-block; padding: 0.25em 0.4em; font-size: 75%; font-weight: 700; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: 0.25rem; color: #fff; background-color: #6c757d; } .badge.primary { background-color: #ab2dff; } .badge.secondary { background-color: #079b0b; } .sidebar-toggler { position: fixed; right: 20px; top: 20px; } .social-links a { margin: 0 10px; color: #3f4750; }
4. Now, load the PopperJS by adding the following CDN link before closing the <body> tag:
<script src='https://unpkg.com/@popperjs/core@2'></script>
5. Finally, add the following JavaScript code to handle the menu functionality, including toggling sub-menus and sidebar collapse behavior. Here’s an example:
function _defineProperty(obj, key, value) {if (key in obj) {Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });} else {obj[key] = value;}return obj;}const ANIMATION_DURATION = 300; const SIDEBAR_EL = document.getElementById("sidebar"); const SUB_MENU_ELS = document.querySelectorAll( ".menu > ul > .menu-item.sub-menu"); const FIRST_SUB_MENUS_BTN = document.querySelectorAll( ".menu > ul > .menu-item.sub-menu > a"); const INNER_SUB_MENUS_BTN = document.querySelectorAll( ".menu > ul > .menu-item.sub-menu .menu-item.sub-menu > a"); class PopperObject { constructor(reference, popperTarget) {_defineProperty(this, "instance", null);_defineProperty(this, "reference", null);_defineProperty(this, "popperTarget", null); this.init(reference, popperTarget); } init(reference, popperTarget) { this.reference = reference; this.popperTarget = popperTarget; this.instance = Popper.createPopper(this.reference, this.popperTarget, { placement: "right", strategy: "fixed", resize: true, modifiers: [ { name: "computeStyles", options: { adaptive: false } }, { name: "flip", options: { fallbackPlacements: ["left", "right"] } }] }); document.addEventListener( "click", e => this.clicker(e, this.popperTarget, this.reference), false); const ro = new ResizeObserver(() => { this.instance.update(); }); ro.observe(this.popperTarget); ro.observe(this.reference); } clicker(event, popperTarget, reference) { if ( SIDEBAR_EL.classList.contains("collapsed") && !popperTarget.contains(event.target) && !reference.contains(event.target)) { this.hide(); } } hide() { this.instance.state.elements.popper.style.visibility = "hidden"; }} class Poppers { constructor() {_defineProperty(this, "subMenuPoppers", []); this.init(); } init() { SUB_MENU_ELS.forEach(element => { this.subMenuPoppers.push( new PopperObject(element, element.lastElementChild)); this.closePoppers(); }); } togglePopper(target) { if (window.getComputedStyle(target).visibility === "hidden") target.style.visibility = "visible";else target.style.visibility = "hidden"; } updatePoppers() { this.subMenuPoppers.forEach(element => { element.instance.state.elements.popper.style.display = "none"; element.instance.update(); }); } closePoppers() { this.subMenuPoppers.forEach(element => { element.hide(); }); }} const slideUp = (target, duration = ANIMATION_DURATION) => { const { parentElement } = target; parentElement.classList.remove("open"); target.style.transitionProperty = "height, margin, padding"; target.style.transitionDuration = `${duration}ms`; target.style.boxSizing = "border-box"; target.style.height = `${target.offsetHeight}px`; target.offsetHeight; target.style.overflow = "hidden"; target.style.height = 0; target.style.paddingTop = 0; target.style.paddingBottom = 0; target.style.marginTop = 0; target.style.marginBottom = 0; window.setTimeout(() => { target.style.display = "none"; target.style.removeProperty("height"); target.style.removeProperty("padding-top"); target.style.removeProperty("padding-bottom"); target.style.removeProperty("margin-top"); target.style.removeProperty("margin-bottom"); target.style.removeProperty("overflow"); target.style.removeProperty("transition-duration"); target.style.removeProperty("transition-property"); }, duration); }; const slideDown = (target, duration = ANIMATION_DURATION) => { const { parentElement } = target; parentElement.classList.add("open"); target.style.removeProperty("display"); let { display } = window.getComputedStyle(target); if (display === "none") display = "block"; target.style.display = display; const height = target.offsetHeight; target.style.overflow = "hidden"; target.style.height = 0; target.style.paddingTop = 0; target.style.paddingBottom = 0; target.style.marginTop = 0; target.style.marginBottom = 0; target.offsetHeight; target.style.boxSizing = "border-box"; target.style.transitionProperty = "height, margin, padding"; target.style.transitionDuration = `${duration}ms`; target.style.height = `${height}px`; target.style.removeProperty("padding-top"); target.style.removeProperty("padding-bottom"); target.style.removeProperty("margin-top"); target.style.removeProperty("margin-bottom"); window.setTimeout(() => { target.style.removeProperty("height"); target.style.removeProperty("overflow"); target.style.removeProperty("transition-duration"); target.style.removeProperty("transition-property"); }, duration); }; const slideToggle = (target, duration = ANIMATION_DURATION) => { if (window.getComputedStyle(target).display === "none") return slideDown(target, duration); return slideUp(target, duration); }; const PoppersInstance = new Poppers(); /** * wait for the current animation to finish and update poppers position */ const updatePoppersTimeout = () => { setTimeout(() => { PoppersInstance.updatePoppers(); }, ANIMATION_DURATION); }; /** * sidebar collapse handler */ document.getElementById("btn-collapse").addEventListener("click", () => { SIDEBAR_EL.classList.toggle("collapsed"); PoppersInstance.closePoppers(); if (SIDEBAR_EL.classList.contains("collapsed")) FIRST_SUB_MENUS_BTN.forEach(element => { element.parentElement.classList.remove("open"); }); updatePoppersTimeout(); }); /** * sidebar toggle handler (on break point ) */ document.getElementById("btn-toggle").addEventListener("click", () => { SIDEBAR_EL.classList.toggle("toggled"); updatePoppersTimeout(); }); /** * toggle sidebar on overlay click */ document.getElementById("overlay").addEventListener("click", () => { SIDEBAR_EL.classList.toggle("toggled"); }); const defaultOpenMenus = document.querySelectorAll(".menu-item.sub-menu.open"); defaultOpenMenus.forEach(element => { element.lastElementChild.style.display = "block"; }); /** * handle top level submenu click */ FIRST_SUB_MENUS_BTN.forEach(element => { element.addEventListener("click", () => { if (SIDEBAR_EL.classList.contains("collapsed")) PoppersInstance.togglePopper(element.nextElementSibling);else { const parentMenu = element.closest(".menu.open-current-submenu"); if (parentMenu) parentMenu. querySelectorAll(":scope > ul > .menu-item.sub-menu > a"). forEach( (el) => window.getComputedStyle(el.nextElementSibling).display !== "none" && slideUp(el.nextElementSibling)); slideToggle(element.nextElementSibling); } }); }); /** * handle inner submenu click */ INNER_SUB_MENUS_BTN.forEach(element => { element.addEventListener("click", () => { slideToggle(element.nextElementSibling); }); });
That’s all! hopefully, you have successfully created a drop-down menu with a sub-menu in the sidebar. If you have any questions or suggestions, feel free to comment below.