Как сделать, чтобы при клике на заголовок меню развернулось/свернулось подменю?

464
30 декабря 2016, 12:56

Как сделать, чтобы при клике на заголовок меню развернулось подменю, и так же закрывалось при клике?

Answer 1

Вариант с toggle().

Переключает режим отображения каждого из элементов набора. Если элемент скрыт, то данная функция отображает его (используя метод show); если элемент видимый -- скрывает его (используя метод hide).

$(function() { 
  $('.menu').click(function(e) { 
    e.preventDefault(); 
    $('.submenu').toggle(); 
  }); 
});
.submenu{display:none;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<a href="" title="" class="menu">Я еще один пункт меню</a> 
<ul class="submenu"> 
  <li>Пункт 1</li> 
  <li>Пункт 2</li> 
  <li>Пункт 3</li> 
</ul>

Answer 2

Вариант с добавлением класса

$(function() { 
  $('.menu').click(function() { 
    if($('.submenu').hasClass('a')){ 
      $('.submenu').removeClass('a'); 
    }else{ 
      $('.submenu').addClass('a'); 
    }; 
    return false; 
  }); 
});
.submenu {display:none;} 
.submenu.a {display:block;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<a href="" class="menu">Я пункт меню :)</a> 
<ul class="submenu"> 
  <li>Пункт 1</li> 
  <li>Пункт 2</li> 
  <li>Пункт 3</li> 
</ul>

Answer 3

Например toggleClass:

$('.trigger').on('click', function(e){ 
  e.preventDefault(); 
   
  $('#js-menu').toggleClass('open'); 
});
#js-menu { 
  display: none; 
} 
 
#js-menu.open { 
  display: block; 
}
<script src="https://code.jquery.com/jquery-2.0.3.js"></script> 
 
  <button class="trigger">	&#926;</button> 
   
  <ul id="js-menu"> 
    <li>item 1</li> 
    <li>item 2</li> 
    <li>item 3</li> 
  </ul>

Или slideToggle:

$('.trigger').on('click', function(e){ 
  e.preventDefault(); 
   
  $('#js-menu').slideToggle(); 
});
#js-menu { 
  display: none; 
}
<script src="https://code.jquery.com/jquery-2.0.3.js"></script> 
 
  <button class="trigger">	&#926;</button> 
   
  <ul id="js-menu"> 
    <li>item 1</li> 
    <li>item 2</li> 
    <li>item 3</li> 
  </ul>

Answer 4

Вариант без использования классов, без дополнительной разметки, без CSS, без jQuery — чистый JS.

var button = document.querySelector('button'), 
    ul = document.querySelector('ul'); 
 
ul.setAttribute('hidden', true); 
 
button.addEventListener('click', function() { 
  if ( ul.getAttribute('hidden') ) { 
    ul.removeAttribute('hidden'); 
  } else { 
    ul.setAttribute('hidden', true); 
  } 
});
<button>click me</button> 
<ul> 
  <li>ololo 1 
    <li>ololo 2 
      <li>ololo 3 
</ul>

Answer 5

На чистом js -

let nav = document.body.querySelector('.nav'); 
 
nav.addEventListener('click', nav_clickHandler); 
 
function nav_clickHandler( {target} ){ 
  if( target.classList.contains('dropdown') ){ 
    let item = target.parentNode.querySelector(`[data-target="${target.dataset.toogle}"]`); 
    let state = item.dataset.active; 
     
    item.dataset.active = state === "true" ? false : true; 
  } 
}
ul { 
  list-style: none; 
   
  padding: 0; 
} 
 
[data-active="false"] { 
  height: 0; 
   
  overflow: hidden; 
}
<ul class="nav"> 
  <li> 
    <span class="dropdown" data-toogle="first">first</span> 
    <ul data-target="first" data-active="false"> 
      <li><span>first 1</span></li> 
      <li><span>first 1</span></li> 
    </ul> 
  </li> 
  <li> 
    <span class="dropdown" data-toogle="second">second</span> 
    <ul data-target="second" data-active="false"> 
      <li><span>second 1</span></li> 
      <li><span>second 1</span></li> 
    </ul> 
  </li> 
</ul>

На чистом css (его не советуют в коментах и я с этим согласен, но все же оставлю его) -

ul { 
  list-style: none; 
   
  padding: 0; 
} 
 
input[type="checkbox"]:not(:checked) + ul { 
  height: 0; 
   
  overflow: hidden; 
}
<ul> 
  <li> 
    <label for="first-section">first</label> 
    <input type="checkbox" id="first-section" hidden> 
    <ul class="slider"> 
      <li><span>first 1</span></li> 
      <li><span>first 2</span></li> 
    </ul> 
  </li> 
  <li> 
    <label for="second-section">second</label> 
    <input type="checkbox" id="second-section" hidden> 
    <ul class="slider"> 
      <li><span>second 1</span></li> 
      <li><span>second 2</span></li> 
    </ul> 
  </li> 
</ul>

READ ALSO
Функция объединения двух массивов

Функция объединения двух массивов

Подскажите есть ли функция в js/jquery для объединения двух массивов в один, следующим образом, чтобы значение первого массива было ключом, а значение...

344
Запись значений массива в атрибут val

Запись значений массива в атрибут val

Есть объектКак записать его значения в атрибут val input? Структура объекта такова:

356
Как отправить canvas на сервер javascript?

Как отправить canvas на сервер javascript?

Здравствуйте делаю ресайз в canvas, как его отправить на сервер

479
Вертикальная прокрутка слайдов в Owl Carousel

Вертикальная прокрутка слайдов в Owl Carousel

На странице внизу над формой есть слайдер, слайды которого всегда сдвигаются вверх при клике на кнопки вверх/вниз

1988