Sidebar menu
Sidebar menu with accordeon and hamburger trigger, nice animation transition. All in pure lightweight JavaScript
by Axiniya
HTML
<div id="nav-icon3" class="pushmenu">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<nav class="sidebar">
<div class="text d-flex p-2">
<a href="#tel-modal"> Меню Сайта</a>
<div id="nav-icon3" class="pushmenu opened">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
<div class="menu-main-menu-container">
<ul id="menu-main-menu">
<li class="current-menu-item"><a href="#" >Главная</a></li>
<li class="menu-parent-item"><a href="#">Услуги<i></i></a>
<ul class="sub-menu">
<li><a href="#">Какая-то услуга 1</a></li>
<li><a href="#">Какая-то услуга 2</a></li>
<li><a href="#">Какая-то услуга 4</a></li>
</ul>
</li>
<li><a href="#">Клиентам</a></li>
<li><a href="#">Контакты</a></li>
</ul>
</div>
</nav>
<div class="hidden-overley"></div>
CSS
#nav-icon3 {
width: 40px;
height: 30px;
position: relative;
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
-webkit-transition: .5s ease-in-out;
-moz-transition: .5s ease-in-out;
-o-transition: .5s ease-in-out;
transition: .5s ease-in-out;
cursor: pointer;
}
#nav-icon3 span {
display: block;
position: absolute;
height: 4px;
width: 100%;
background: #90b5cc;
border-radius: 3px;
opacity: 1;
left: 0;
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
-webkit-transition: .25s ease-in-out;
-moz-transition: .25s ease-in-out;
-o-transition: .25s ease-in-out;
transition: .25s ease-in-out;
}
#nav-icon3 span:nth-child(1) {
top: 0px;
}
#nav-icon3 span:nth-child(2),#nav-icon3 span:nth-child(3) {
top: 12px;
}
#nav-icon3 span:nth-child(4) {
top: 24px;
}
#nav-icon3.open span:nth-child(1),#nav-icon3.opened span:nth-child(1) {
top: 12px;
width: 0%;
left: 50%;
}
#nav-icon3.open span:nth-child(2),#nav-icon3.opened span:nth-child(2) {
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
#nav-icon3.open span:nth-child(3),#nav-icon3.opened span:nth-child(3) {
-webkit-transform: rotate(-45deg);
-moz-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
}
#nav-icon3.open span:nth-child(4),#nav-icon3.opened span:nth-child(4) {
top: 12px;
width: 0%;
left: 50%;
}
.sidebar #nav-icon3 span {background: #fff;}
body.sidebar-opened {overflow:hidden;}
.hidden-overley {
position: fixed;
top: 0;
left: 0;
z-index: 99;
background: #000000;
opacity:0;
width:0;
height:0;
transition: opacity 1s;
}
.hidden-overley.show {
height: 100%;
width: 100%;
opacity:0.5;
transition: opacity 1s;
}
.sidebar{
position: fixed;
z-index:100;
...
JavaScript
document.addEventListener('DOMContentLoaded', () => {
// получаем все элементы с классом pushmenu
const pushmenu = document.getElementsByClassName('pushmenu');
// получаем элемент с классом hidden-overley
const hiddenOverley = document.querySelector('.hidden-overley');
// отслеживаем клик клика по оверлею
hiddenOverley.addEventListener('click', (e) => {
e.currentTarget.classList.toggle('show');
document.querySelector('.sidebar').classList.toggle('show');
document.querySelector('body').classList.toggle('sidebar-opened');
for( i=0; i < pushmenu.length; i++ ){
pushmenu[i].classList.toggle('open');
}
});
const pushmenuFunction = function() {
document.querySelector('.pushmenu').classList.toggle('open');
document.querySelector('.sidebar').classList.toggle('show');
document.querySelector('.hidden-overley').classList.toggle('show');
document.body.classList.toggle('sidebar-opened')
};
// Отслеживаем клики кнопок с классом pushmenu
for( i=0; i < pushmenu.length; i++ ){
pushmenu[i].addEventListener('click', pushmenuFunction, false);
}
// Получим все родительские элементы в меню
const sidebarAccordeon = document.querySelectorAll('.sidebar .menu-parent-item a:first-child');
const accordeonFunction = function() {
this.parentNode.querySelector('ul').classList.toggle('show');
this.querySelector('i').classList.toggle('rotate');
}
// Отслеживаем клики родительских пунктов меню
for( i=0; i < sidebarAccordeon.length; i++ ){
sidebarAccordeon[i].addEventListener('click', accordeonFunction, false);
}
});