Как правильно сделать выпадающее бургер меню на чистом JS

html:

<div class="container">
    <div class="header__inner">
        <div class="krea__logo">
            <img src="img/KreaLogo.png" alt="">
        </div>
        <nav class="krea__nav" >
            <ul class="menu__link">
                <li><a data-goto="#Services" class="nav__link" href="#">Services</a></li>
                <li><a data-goto="#Works" class="nav__link" href="#">Works</a></li>
                <li><a data-goto="#References" class="nav__link" href="#">References</a></li>
                <li><a data-goto="#Contact" class="nav__link" href="#">Contact</a></li>
            </ul>
        </nav>
        
        <a class="burger" id="dropDown">
            <span class="burger__item"></span>
        </a>

    </div>
</div><!--/Container-->

Бургер меню используется только в адаптивной вёрстке, поэтому на десктопной версии сайта он скрыт. CSS:

.krea__nav {
        display:  none;
        margin-top: 23px;
        position: absolute;
        background-color: #333366;
        right: 0;
        min-width: 160px;
        z-index: 1;  
    }
       
    .burger {
        z-index: 5;
        display: block;
        position: relative;
        width: 30px;
        height: 18px;
        cursor: pointer;   
    }
    
    .burger span,
    .burger::before,
    .burger::after {
        left: 0;
        position: absolute;
        height: 10%;
        width: 100%;
        transition: all .2s linear;
        background-color: #fff;
    }
    
    .burger::before,
    .burger::after {
        content: "";
    }
    
    .burger::before {
        top: 0;
    }
    
    .burger::after {
         bottom: 0;
    }
    
    .burger span {
        top: 50%;
        transform: scale(1) translate(0px, -50%);
    }
    
    
    .menu__link {
        display: flex;
        flex-direction: column;
        padding: 12px 5px 12px 5px;
        text-decoration: none;
        display: block;
        text-align: left;

    }

Ответы (3 шт):

Автор решения: WalkMess

//Получаем бургер
const menuBurger = document.querySelector(".menu__burger"); 

//Вешаем слушатель событий при его клике - вызываем функцию.
menuBurger.addEventListener("click", function() {  
  //Функция добавляет класс или удаляет его. 
  menuBurger.classList.toggle('active');
});

→ Ссылка
Автор решения: Alexandr

и зачем бургеру JS? стилизуйте чекбокс через ::after, а при помощи :checked ловите состояние для показа/скрытия блока с меню. делов то.

→ Ссылка
Автор решения: Andrei Fedorov

Тут вам не нужен JS, воспользуйтесь возможностями, которые предлагает современный HTML.

.krea__nav {
  margin-top: 23px;
  position: absolute;
  inset: auto;
  background-color: #333366;
  min-width: 160px;
  z-index: 1;
  border: none;
}

.burger {
  z-index: 5;
  display: flex;
  align-items: center;
  width: 30px;
  height: 18px;
  cursor: pointer;
  border: none;
  background: #444;
}

.burger__item {
  fill: white;
  width: 30px;
  height: 18px;
}

.menu__link {
  display: flex;
  flex-direction: column;
  padding: 12px 5px 12px 5px;
  text-decoration: none;
  display: block;
  text-align: left;
}

.nav__link {
  color: white;
}
<div class="container">
  <div class="header__inner">
    <div class="krea__logo">
      <img src="img/KreaLogo.png" alt="">
    </div>
    <nav class="krea__nav" id="mypopover" popover>
      <ul class="menu__link">
        <li><a data-goto="#Services" class="nav__link" href="#">Services</a></li>
        <li><a data-goto="#Works" class="nav__link" href="#">Works</a></li>
        <li><a data-goto="#References" class="nav__link" href="#">References</a></li>
        <li><a data-goto="#Contact" class="nav__link" href="#">Contact</a></li>
      </ul>
    </nav>
    <button class="burger" id="dropDown" popovertarget="mypopover" popovertargetaction="toggle">
       <svg class="burger__item" clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m22 16.75c0-.414-.336-.75-.75-.75h-18.5c-.414 0-.75.336-.75.75s.336.75.75.75h18.5c.414 0 .75-.336.75-.75zm0-5c0-.414-.336-.75-.75-.75h-18.5c-.414 0-.75.336-.75.75s.336.75.75.75h18.5c.414 0 .75-.336.75-.75zm0-5c0-.414-.336-.75-.75-.75h-18.5c-.414 0-.75.336-.75.75s.336.75.75.75h18.5c.414 0 .75-.336.75-.75z" fill-rule="nonzero"/></svg>
    </button>
  </div>
</div>

→ Ссылка