Hello folks, today we will discuss the Vertical Navigation Bar in LWC. Like the navigation menu bar, the sidebar menu is used on many websites. We can create a nice sidebar menu in LWC with animation.
Also check this: Selected Rows Persistent in Filter Search LWC Datatable
Key Highlights :
- We can put links in the sidebar navigation.
- Show and hide the navigation on button click.
- Collapsible sidebars.
- Selected linked data will show in the right side panel.
- Sidebars are a staple of website navigation.
Code :
SideNavigationLWC.HTML :
<template>
<div class="sidebar slds-split-view_container slds-is-closed close-panel" data-my-id="leftPanel"
style="float: left">
<lightning-button-icon onclick={togglePanel} variant="bare" icon-name="utility:left"
class="slds-button slds-button_icon slds-button_icon slds-split-view__toggle-button sidebar-button"
aria-controls="split-view-id" aria-expanded="true">
</lightning-button-icon>
<article aria-hidden="false" id="split-view-id" class="slds-split-view slds-grid slds-grid_vertical slds-grow"
style="padding-right: 7px">
<lightning-vertical-navigation selected-item={selectedNav} onselect={handleSelect}>
<lightning-vertical-navigation-section label="Reports">
<lightning-vertical-navigation-item-icon label="Recent" name="Recent"
icon-name="utility:clock">
</lightning-vertical-navigation-item-icon>
<lightning-vertical-navigation-item-icon label="Created by Me" name="Created by Me"
icon-name="utility:user">
</lightning-vertical-navigation-item-icon>
<lightning-vertical-navigation-item-icon label="Private Reports" name="Private Reports"
icon-name="utility:lock">
</lightning-vertical-navigation-item-icon>
<lightning-vertical-navigation-item-icon label="Public Reports" name="Public Reports"
icon-name="utility:groups">
</lightning-vertical-navigation-item-icon>
<lightning-vertical-navigation-item label="All Reports" name="All Reports">
</lightning-vertical-navigation-item>
</lightning-vertical-navigation-section>
<lightning-vertical-navigation-section label="Folders">
<lightning-vertical-navigation-item-icon label="Created by Me" name="folders_usercreated"
icon-name="utility:open_folder">
</lightning-vertical-navigation-item-icon>
<lightning-vertical-navigation-item-icon label="Shared with Me" name="folders_shared"
icon-name="utility:open_folder">
</lightning-vertical-navigation-item-icon>
</lightning-vertical-navigation-section>
</lightning-vertical-navigation>
</article>
</div>
<div style="float:right;padding-left:10px;" data-my-id="rightPanel" class="expand-panel">
<!--Main Right Body Section-->
<lightning-card title={selectedNav} icon-name="standard:account" class="slds-m-bottom_small">
<button class="slds-button slds-button_icon slds-button_icon-border slds-m-left_x-small" slot="actions" title="Refresh" alternative-text="Refresh" onclick={refreshUserData}>
<svg class="slds-button__icon" aria-hidden="true">
<use xlink:href="/_slds/icons/utility-sprite/svg/symbols.svg?cache=9.28.0#refresh"></use>
</svg>
</button>
</lightning-card>
<article
class="slds-grid slds-grid_vertical slds-grow slds-scrollable_none slds-m-top_x-small slds-m-bottom_x-large"
style="height:84vh">
<div class=" slds-grid slds-grid_vertical slds-scrollable_y">
</div>
</article>
</div>
</template>
SideNavigationLWC.JS:
import { LightningElement } from 'lwc';
export default class SideNavigationLWC extends LightningElement {
selectedNav = 'default_recent';
togglePanel() {
let leftPanel = this.template.querySelector("div[data-my-id=leftPanel]");
let rightPanel = this.template.querySelector("div[data-my-id=rightPanel]");
if (leftPanel.classList.contains('slds-is-open')) {
leftPanel.classList.remove("slds-is-open");
leftPanel.classList.remove("open-panel");
leftPanel.classList.add("slds-is-closed");
leftPanel.classList.add("close-panel");
rightPanel.classList.add("expand-panel");
rightPanel.classList.remove("collapse-panel");
} else {
leftPanel.classList.add("slds-is-open");
leftPanel.classList.add("open-panel");
leftPanel.classList.remove("slds-is-closed");
leftPanel.classList.remove("close-panel");
rightPanel.classList.remove("expand-panel");
rightPanel.classList.add("collapse-panel");
}
}
refreshUserData(evt){
const buttonIcon = evt.target.querySelector('.slds-button__icon');
buttonIcon.classList.add('refreshRotate');
setTimeout(() => {
buttonIcon.classList.remove('refreshRotate');
}, 1000);
}
handleSelect(event) {
const selected = event.detail.name;
this.selectedNav = selected;
}
}
SideNavigationLWC.CSS:
.sidebar{
height:90vh;
}
.sidebar-button{
width: 20px;
}
.open-panel {
width: 17%;
overflow:hidden;
transition: 0.3s;
}
.close-panel {
width: 0px;
min-width: 0px;
overflow:unset;
transition: 0.3s;
}
.expand-panel{
width: 99.5%;
transition: 0.3s;
}
.collapse-panel{
width: 82.5%;
transition: 0.3s;
}
.page-section {
border: solid 1px #ccc;
padding: .25rem;
background-color: #fff;
}
.refreshRotate {
animation: rotate .4s;
}
SideNavigationLWC.js-meta.xml:
<?xml version="1.0"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>55.0</apiVersion> <isExposed>true</isExposed> <targets> <target>lightning__HomePage</target> </targets> </LightningComponentBundle>
Output :
Reference :
What’s your Reaction?
+1
3
+1
1
+1
+1
+1
+1
1

2 comments
Hi Rijwan,
Thanks for this example, I have a requirement where I have to show the icons even in the collapsed state of the vertical panel. Can you help?
Regards.
Yes, I can. Setup a meeting by clicking on Booking a Free meeting on my website right side.