Author: | dunbom6612 |
---|---|
Views Total: | 33,273 views |
Official Page: | Go to website |
Last Update: | September 1, 2021 |
License: | MIT |
Preview:

Description:
A modern sidebar navigation with smooth expand & collapse transitions, written in CSS/CSS3 and vanilla JavaScript.
How to use it:
1. Create the HTML for the sidebar navigation. In this example, we’re using boxicons for essential icons.
<div class="side-bar"> <div class="logo-name-wrapper"> <div class="logo-name"> <img src="./assets/images/logo.png" class="logo" alt="logo app" srcset="" /> <span class="logo-name__name">Lincoln Botosh</span> </div> <button class="logo-name__button"> <i class="bx bx-arrow-from-right logo-name__icon" id="logo-name__icon" ></i> </button> </div> <div class="message"> <i class="message-icon bx bx-message-square-edit"></i> <span class="message-text">New Mesage</span> <span class="tooltip">New Mesage</span> </div> <ul class="features-list"> <li class="features-item inbox active"> <i class="bx bxs-inbox features-item-icon inbox-icon" ><span class="status"></span ></i> <span class="features-item-text">Inbox</span> <span class="inbox-number">99</span> <span class="tooltip">Inbox</span> </li> <li class="features-item draft"> <i class="bx bx-file-blank features-item-icon"></i> <span class="features-item-text">Draft</span> <span class="tooltip">Draft</span> </li> <li class="features-item star"> <i class="bx bx-star features-item-icon"></i> <span class="features-item-text">Starred</span> <span class="tooltip">Starred</span> </li> <li class="features-item sent"> <i class="bx bx-send features-item-icon"></i> <span class="features-item-text">Sent</span> <span class="tooltip">Sent</span> </li> <li class="features-item trash"> <i class="bx bx-trash features-item-icon"></i> <span class="features-item-text">Trash</span> <span class="tooltip">Trash</span> </li> <li class="features-item spam"> <i class="bx bx-message-square-error features-item-icon"></i> <span class="features-item-text">Spam</span> <span class="tooltip">Spam</span> </li> </ul> <ul class="category-list"> <div class="category-header">Message categories</div> <li class="category-item"> <span class="category-item-status" style="background-color: #79d861" ></span ><span class="category-item-text">My works</span ><span class="category-item-number">9</span> <span class="tooltip">My works</span> </li> <li class="category-item"> <span class="category-item-status" style="background-color: #c43c5d" ></span ><span class="category-item-text">Accountant</span ><span class="category-item-number">43</span> <span class="tooltip">Accountant</span> </li> <li class="category-item"> <span class="category-item-status" style="background-color: #ff5050" ></span ><span class="category-item-text">Works</span ><span class="category-item-number">78</span> <span class="tooltip">Works</span> </li> <li class="category-item"> <span class="category-item-status" style="background-color: #42ffdd" ></span ><span class="category-item-text">Marketing</span ><span class="category-item-number">253</span> <span class="tooltip">Marketing</span> </li> </ul> <ul class="chat-list"> <div class="chat-header">recent chats</div> <button class="chat-new-btn"> <i class="bx bxs-plus-circle chat-icon"></i> <span class="chat-new-btn-text">Start New Chat</span> <span class="tooltip">New Chat</span> </button> <li class="chat-item"> <span class="chat-item-avatar-wrapper has-message"> <img src="./assets/images/chris-evans.jpg" alt="avatar" class="chat-item-avatar" /> </span> <span class="chat-item-name">Steve Rogers</span> <span class="chat-item-number">53</span> </li> <li class="chat-item"> <span class="chat-item-avatar-wrapper"> <img src="./assets/images/tony-stark.jpg" alt="avatar" class="chat-item-avatar" /> </span> <span class="chat-item-name">Tony Stark</span ><span class="chat-item-status" style="background-color: #79d861" ></span> </li> </ul> </div>
2. The necessary CSS styles for the sidebar navigation. Feel free to override the default CSS variables at the beginning of the following CSS snippets to create your own styles.
:root { --white-color: #fafafb; --background-color: #17171e; --grey-color: #b5b5be; --dark-grey-color: #292932; } .side-bar { width: 23.2rem; height: 100%; padding: 2.1rem 1.2rem; background-color: #17171e; position: fixed; transition: all 0.5s ease; top: 0; } .logo-name-wrapper { position: relative; margin-bottom: 2.1rem; display: flex; font-size: 1.2rem; } .logo-name { display: flex; align-items: center; } .logo-name__name { margin-left: 0.9rem; white-space: nowrap; } .logo-name__button { position: absolute; top: 50%; right: 0; font-size: 1.8rem; transform: translateY(-50%); background-color: transparent; border: none; cursor: pointer; } .logo-name__icon { font-size: 1.8rem; color: var(--grey-color); } .message { background-color: var(--dark-grey-color); display: flex; align-items: center; padding: 1.55rem 0 1.55rem 1.2rem; border-radius: 0.4rem; margin-bottom: 3.6rem; cursor: pointer; position: relative; } .message-icon { font-size: 2rem; transform: translateX(3rem); transition: all 0.5s ease; } .message-text { margin-left: 1.1rem; font-size: 1.4rem; white-space: nowrap; transform: translateX(3rem); transition: all 0.5s ease; } .features-list { padding-bottom: 1rem; border-bottom: 1px solid #292932; list-style: none; } .features-item { display: flex; align-items: center; position: relative; padding: 0.5rem 0.9rem; margin-bottom: 1.1rem; color: var(--grey-color); cursor: pointer; transition: 0.5s ease; } .features-item::before { transition: 0.5s ease; content: ''; position: absolute; left: -1.2rem; height: 100%; border-left: 3px solid var(--white-color); border-radius: 2px; opacity: 0; visibility: hidden; } .features-item:hover { color: var(--white-color); transition: 0.5s ease; } .features-item:hover::before { opacity: 1; visibility: unset; } .features-item-icon { font-size: 2rem; } .features-item-text { margin-left: 1.5rem; transition: opacity 0.6s ease; opacity: 1; } .inbox-number { position: absolute; top: 50%; right: 0; transform: translateY(-50%); background-color: #1e75ff; padding: 0.5rem 0.9rem; border-radius: 0.4rem; color: var(--white-color); opacity: 1; transition: 0.6s linear; } .inbox-icon { position: relative; } .inbox-icon .status { position: absolute; top: 0; right: -1px; background-color: #1e75ff; height: 9px; width: 9px; border-radius: 50%; border: 2px solid var(--white-color); opacity: 0; transition: 0.6s linear; } .category-list { padding-top: 2.1rem; padding-bottom: 0.9rem; color: var(--grey-color); list-style: none; font-size: 1.2rem; font-weight: 500; border-bottom: 1px solid #292932; } .category-header { font-size: 1.2rem; text-transform: uppercase; line-height: 1.8rem; color: var(--white-color); margin-bottom: 1.3rem; white-space: nowrap; } .category-item { position: relative; padding: 0.9rem 1.1rem; line-height: 1.8rem; cursor: pointer; white-space: nowrap; } .category-item-status { height: 0.8rem; width: 0.8rem; border-radius: 50%; border: none; background-color: white; display: inline-block; } .category-item-text { margin-left: 1rem; transition: opacity 0.6s ease; opacity: 1; } .category-item-number { position: absolute; top: 50%; right: 0; transform: translateY(-50%); } .chat-list { padding: 2.1rem 0; font-size: 1.2rem; } .chat-header { text-transform: uppercase; line-height: 1.8rem; color: var(--white-color); margin-bottom: 1.3rem; white-space: nowrap; } .chat-new-btn { color: #1e75ff; background-color: transparent; outline: none; border: none; line-height: 1.8rem; display: flex; align-items: center; padding-bottom: 2.1rem; padding-left: 0.1rem; cursor: pointer; position: relative; font-family: 'Poppins', sans-serif; font-weight: 500; } .chat-new-btn-text { white-space: nowrap; transition: opacity 0.6s ease; opacity: 1; } .chat-icon { font-size: 2.1rem; margin-right: 1.2rem; } .chat-item { position: relative; display: flex; align-items: center; margin-bottom: 2.1rem; color: var(--grey-color); cursor: pointer; } .chat-item-avatar-wrapper { position: relative; } .chat-item-avatar-wrapper::before { content: ''; position: absolute; top: 0; right: -3px; border-radius: 50%; height: 8px; width: 8px; background-color: #79d861; opacity: 0; transition: 0.6s linear; } .chat-item-avatar-wrapper.has-message::before { background-color: #1e75ff; border: 2px solid var(--white-color); height: 6px; width: 6px; } .chat-item-avatar { object-fit: cover; object-position: top; height: 2.1rem; width: 2.1rem; border-radius: 50%; border: 1px solid var(--white-color); } /* background color in inline style */ .chat-item-status { height: 0.8rem; width: 0.8rem; border-radius: 50%; border: none; background-color: white; position: absolute; top: 50%; right: 0; transform: translateY(-50%); margin-right: 5px; opacity: 1; transition: 0.6s linear; } .chat-item-number { position: absolute; top: 50%; right: 0; transform: translateY(-50%); background-color: #1e75ff; padding: 0.5rem 0.9rem; border-radius: 0.4rem; color: var(--white-color); opacity: 1; transition: 0.6s linear; } .chat-item-name { white-space: nowrap; transition: opacity 0.6s ease; opacity: 1; margin-left: 1.4rem; } .tooltip { position: absolute; top: -2.1rem; left: 6.4rem; background-color: white; color: var(--background-color); border-radius: 0.4rem; padding: 0.5rem 0.9rem; font-size: 1.4rem; transition: 0s; opacity: 0; display: none; box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } .side-bar.collapse .message:hover .tooltip, .features-item:hover .tooltip, .category-item:hover .tooltip, .chat-new-btn:hover .tooltip { top: 50%; transform: translateY(-50%); transition: all 0.5s ease; opacity: 1; } .side-bar.collapse { width: 6.4rem; } .side-bar.collapse .tooltip { display: block; } .side-bar.collapse .logo-name, .side-bar.collapse .category-header, .side-bar.collapse .chat-header, .side-bar.collapse .chat-new-btn-text, .side-bar.collapse .features-item-text, .side-bar.collapse .inbox-number, .side-bar.collapse .category-item-text, .side-bar.collapse .category-item-number, .side-bar.collapse .message-text, .side-bar.collapse .chat-item-name, .side-bar.collapse .chat-item-number, .side-bar.collapse .chat-item-status { opacity: 0; pointer-events: none; } .side-bar.collapse .message-text { opacity: 0; pointer-events: none; transform: translateX(0); } .side-bar.collapse .message-icon { transform: translateX(0); } .side-bar.collapse .logo-name__button { right: 0.5rem; } .side-bar.collapse .inbox-icon .status, .side-bar.collapse .chat-item-avatar-wrapper::before { opacity: 1; }
3. The JavaScript to enable the expand/collapse animations.
{ let sideBar = document.querySelector('.side-bar'); let arrowCollapse = document.querySelector('#logo-name__icon'); sideBar.onclick = () => { sideBar.classList.toggle('collapse'); arrowCollapse.classList.toggle('collapse'); if (arrowCollapse.classList.contains('collapse')) { arrowCollapse.classList = 'bx bx-arrow-from-left logo-name__icon collapse'; } else { arrowCollapse.classList = 'bx bx-arrow-from-right logo-name__icon'; } }; }