меню гамбургеров закрывается по щелчку

#javascript #jquery #hamburger-menu

#язык JavaScript #jquery #гамбургер-меню

Вопрос:

Я пытаюсь найти выход из следующей проблемы, я хочу, чтобы, когда кто-то нажимает на меню гамбургера, оно открывалось, а затем, когда они выбирают что-то в меню и переходят к этой точке страницы (это целевая страница), она автоматически закрывается. На данный момент он открывается и работает нормально, просто он не закрывается после события. Спасибо! Вот мой код:

HTML:

 const btnHamburger = document.querySelector('#btnHamburger'); const body = document.querySelector('body'); const header = document.querySelector('.header'); const overlay = document.querySelector('.overlay'); const fadeElems = document.querySelectorAll('.has-fade');  btnHamburger.addEventListener('click', function(){  console.log('click hamburger');   if(header.classList.contains('open')){  body.classList.remove('noscroll');  header.classList.remove('open');   fadeElems.forEach(function(element){  element.classList.remove('fade-in');  element.classList.add('fade-out');  });    }  else { // Open Hamburger Menu  body.classList.add('noscroll');  header.classList.add('open');  fadeElems.forEach(function(element){  element.classList.remove('fade-out');  element.classList.add('fade-in');  });   }  }); 
 .header {  position: relative;  z-index: 1; }  .header.open .header__toggle gt; span:first-child {  -webkit-transform: rotate(45deg);  transform: rotate(45deg); }  .header.open .header__toggle gt; span:nth-child(2) {  opacity: 0; }  .header.open .header__toggle gt; span:last-child {  -webkit-transform: rotate(-45deg);  transform: rotate(-45deg); }  .header .overlay {  opacity: 0;  position: fixed;  top: 0px;  right: 0px;  bottom: 0px;  left: 0px;  background-image: -webkit-gradient(linear, left top, left bottom, from(#2d314d), to(transparent));  background-image: linear-gradient(#2d314d, transparent); }  .header nav {  position: relative;  background-color: white;  padding-top: 1.0625rem;  padding-bottom: 1.0625rem; }  .header__logo img {  width: 12.9125rem;  height: 4.575rem; }  .header__toggle gt; span {  display: block;  width: 26px;  height: 2px;  background-color: #2d314d;  -webkit-transition: all 300ms ease-in-out;  transition: all 300ms ease-in-out;  -webkit-transform-origin: 3px 1px;  transform-origin: 3px 1px; }  .header__toggle gt; span:not(:last-child) {  margin-bottom: 5px; }  .header__menu {  position: absolute;  width: calc(100% - 3rem);  left: 50%;  -webkit-transform: translateX(-50%);  transform: translateX(-50%);  background: white;  margin-top: 1.5rem;  padding: 1.625rem;  border-radius: 5px; }  .header__menu a {  display: block;  padding: 0.625rem;  color: #2d314d;  text-align: center; }  .header__links a {  position: relative;  font-size: 0.875rem;  color: #9698a6;  -webkit-transition: color 300ms ease-in-out;  transition: color 300ms ease-in-out; }  .header__links a:not(:last-child) {  margin-right: 32px; }  .header__links a::before {  content: "";  display: block;  position: absolute;  height: 5px;  left: 0;  right: 0;  bottom: -30px;  background: -webkit-gradient(linear, left top, right top, from(#265fd9), to(#64d9f7));  background: linear-gradient(to right, #265fd9, #64d9f7);  opacity: 0;  -webkit-transition: opacity 300ms ease-in-out;  transition: opacity 300ms ease-in-out; }  .header__links a:hover {  color: #2d314d; }  .header__links a:hover::before {  opacity: 1; } 
 lt;bodygt;  lt;a name="header" id="header"gt;lt;/agt;   lt;header class="header"gt;  lt;div class="has-fade"gt;lt;/divgt;   lt;nav class="container container--pall flex flex-jc-sb flex-ai-c"gt;  lt;a href="/" class="header__logo"gt;  lt;img src="./images/img.png" alt="A" /gt;  lt;/agt;   lt;a id="btnHamburger" href="#" class="header__toggle hide-for-desktop"gt;  lt;spangt;lt;/spangt;  lt;spangt;lt;/spangt;  lt;spangt;lt;/spangt;  lt;/agt;   lt;div class="header__links hide-for-mobile"gt;  lt;a href="#text"gt;Textlt;/agt;lt;a href="#text"gt;Textlt;/agt;lt;a href="#text"gt;Textlt;/a  gt;lt;a href="#"gt;textlt;/agt;lt;a href="text"gt;Textlt;/agt;  lt;/divgt;   lt;a href="/" class="button header__cta hide-for-mobile"  gt;Emaillt;/agt;  lt;a href="/" class="button header__cta hide-for-mobile"  gt;011lt;/agt;  lt;/navgt;   lt;div class="header__menu has-fade"gt;  lt;a href="/"gt;index 1lt;/agt;  lt;a href="#feature"gt;index 2lt;/agt;  lt;a href="#articles"gt;index 3lt;/agt;  lt;a href=""gt;index 4lt;/agt;  lt;a href=""gt;index 5lt;/agt;  lt;/divgt; 

Комментарии:

1. вы должны справиться с этим самостоятельно , используя событие , когда пользователь нажимает за пределами меню или пользователь теряет фокус на меню , вызывает событие, и оно будет закрыто.

2. что-то вроде этого @John? функция show(){ MainMenu.style.display = ‘flex’; MainMenu.style.top = ‘0’; } функция close(){ MainMenu.style.top = ‘-100%’; }

Ответ №1:

вы можете попробовать это, выбрать контейнер, в котором содержится список элементов, по его классу и добавить прослушиватель событий, чтобы при каждом нажатии на меню мы делали

  1. скрыть меню
  2. скрыть наложение фона
  3. и верните меню гамбургеров на исходные 3 строки
  4. и не удаляйте свитки из тела

и вот код

 const container = document.querySelector(".header__menu");  // then add event listener  container.addEventListener("click", () =gt; {  header.classList.remove("open");  overlay.classList.remove("fade-in");  container.classList.add("fade-out");  body.classList.remove("noscroll"); });