When building a dynamic web application, the user interface (UI) needs to offer an intuitive navigation experience. Whether it’s an e-commerce site with multiple product categories or a content-heavy admin dashboard, having active states and expandable menus enhances usability. In this blog post, we’ll walk through creating a JavaScript script that dynamically highlights the current page in the navigation and expands relevant sections based on the user's path.
When users navigate through multi-layered menus, we want:
Let’s look at an example HTML structure and how to add JavaScript to make our menu smart.
Here’s a typical nested menu structure. We’ll be working with menu-item for each item in the menu, menu-link for links, and menu-sub for collapsible submenus.
<!-- Categories --> <li> <p>In this structure:</p> <ul> <li>Each main menu link (menu-toggle) opens a submenu when clicked.</li> <li>The actual pages are in the submenu links (menu-link).</li> </ul> <h3> The JavaScript Solution </h3> <p>We’ll use JavaScript to:</p> <ol> <li>Identify the current page.</li> <li>Apply an active class to the link that matches the current URL.</li> <li>Add an open class to the parent menu if the link is inside a collapsed submenu.</li> </ol> <p>Here’s the JavaScript code:<br> </p> <pre class="brush:php;toolbar:false"><script> window.onload = function () { const currentPath = window.location.pathname; // Get the current path const links = document.querySelectorAll('.menu-link'); // Select all menu links links.forEach(function (link) { // Check if the link's href matches the current page's path if (link.getAttribute('href') === currentPath) { // Add 'active' class to the parent 'li' element of the link const menuItem = link.closest('.menu-item'); if (menuItem) { menuItem.classList.add('active'); // Check if the link is within a 'menu-sub', expand the parent menu const parentMenu = menuItem.closest('.menu-sub'); if (parentMenu) { // Add 'open' class to the parent 'menu-item' of the submenu const parentMenuItem = parentMenu.closest('.menu-item'); if (parentMenuItem) { parentMenuItem.classList.add('open'); } } } } }); }; </script>
const currentPath = window.location.pathname;
This grabs the path of the current page (e.g., /inventory-issues), which we’ll use to compare with the href of each link in the menu.
const links = document.querySelectorAll('.menu-link');
We select all elements with the class menu-link, assuming these contain links to various sections of the site.
if (link.getAttribute('href') === currentPath) {
For each link, we check if its href matches the currentPath. If it does, that link is for the current page.
menuItem.classList.add('active');
We add an active class to the closest menu-item, allowing us to style the active page link.
const parentMenuItem = parentMenu.closest('.menu-item'); parentMenuItem.classList.add('open');
If the active link is within a submenu (menu-sub), this part of the code finds the parent menu-item containing that submenu and adds the open class, expanding it.
You’ll want to define styles for the active and open classes in your CSS:
<!-- Categories --> <li> <p>In this structure:</p> <ul> <li>Each main menu link (menu-toggle) opens a submenu when clicked.</li> <li>The actual pages are in the submenu links (menu-link).</li> </ul> <h3> The JavaScript Solution </h3> <p>We’ll use JavaScript to:</p> <ol> <li>Identify the current page.</li> <li>Apply an active class to the link that matches the current URL.</li> <li>Add an open class to the parent menu if the link is inside a collapsed submenu.</li> </ol> <p>Here’s the JavaScript code:<br> </p> <pre class="brush:php;toolbar:false"><script> window.onload = function () { const currentPath = window.location.pathname; // Get the current path const links = document.querySelectorAll('.menu-link'); // Select all menu links links.forEach(function (link) { // Check if the link's href matches the current page's path if (link.getAttribute('href') === currentPath) { // Add 'active' class to the parent 'li' element of the link const menuItem = link.closest('.menu-item'); if (menuItem) { menuItem.classList.add('active'); // Check if the link is within a 'menu-sub', expand the parent menu const parentMenu = menuItem.closest('.menu-sub'); if (parentMenu) { // Add 'open' class to the parent 'menu-item' of the submenu const parentMenuItem = parentMenu.closest('.menu-item'); if (parentMenuItem) { parentMenuItem.classList.add('open'); } } } } }); }; </script>
? from eddiegulay
The above is the detailed content of Creating a Dynamic Navigation Script for Active State and Expandable Menus. For more information, please follow other related articles on the PHP Chinese website!