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);
	}
});