Меню-аккордеон. Как сворачивать неактывные пункты?
Как в меню-аккордеоне делается сворачивание неактивных пунктов меню? Чтобы один открываешь, а прежде открытый закрывался.
Страница с меню: http://dmink.ru/learn/ Код JS: var btnMenu = document.querySelectorAll('.btn-menu'), subMenu = document.querySelectorAll('.sub-menu'), i, btn, sub; for (i = 0; i < btnMenu.length; i++) { btn = btnMenu[i]; sub = subMenu[i]; btn.addEventListener('click', menuOpen(btn, sub)); }; function menuOpen(btn, sub) { return function (event) { event.preventDefault(); btn.classList.toggle('btn-menu--active'); sub.classList.toggle('sub-menu--show'); }; }; Код HTML: <ul class="accordeon"> <li><a class="btn-menu" href="#">Верхний пункт</a> <ul class="sub-menu"> <li><a class="sub-menu__item" href="#">Первое меню 1</a></li> <li><a class="sub-menu__item" href="#">Первое меню 2</a></li> <li><a class="sub-menu__item" href="#">Первое меню 3</a></li> <li><a class="sub-menu__item" href="#">Первое меню 4</a></li> </ul> </li> <li><a class="btn-menu" href="#">Средний пункт</a> <ul class="sub-menu"> <li><a class="sub-menu__item" href="#">Второе меню 1</a></li> <li><a class="sub-menu__item" href="#">Второе меню 2</a></li> <li><a class="sub-menu__item" href="#">Второе меню 3</a></li> <li><a class="sub-menu__item" href="#">Второе меню 4</a></li> </ul> </li> <li><a class="btn-menu" href="#">Нижний пункт</a> <ul class="sub-menu"> <li><a class="sub-menu__item" href="#">Третье меню 1</a></li> <li><a class="sub-menu__item" href="#">Третье меню 2</a></li> <li><a class="sub-menu__item" href="#">Третье меню 3</a></li> <li><a class="sub-menu__item" href="#">Третье меню 4</a></li> </ul> </li> </ul> Без jQuery нужно решение |
Цитата:
http://jsfiddle.net/vlasenkofedor/zQ6ae/ Решение на js http://jsfiddle.net/vlasenkofedor/jLprM/ |
<style> .sub-menu { display: none; } </style> <ul class="accordeon"> <li><a class="btn-menu" href="#">Верхний пункт</a> <ul class="sub-menu"> <li><a class="sub-menu__item" href="#">Первое меню 1</a></li> <li><a class="sub-menu__item" href="#">Первое меню 2</a></li> <li><a class="sub-menu__item" href="#">Первое меню 3</a></li> <li><a class="sub-menu__item" href="#">Первое меню 4</a></li> </ul> </li> <li><a class="btn-menu" href="#">Средний пункт</a> <ul class="sub-menu"> <li><a class="sub-menu__item" href="#">Второе меню 1</a></li> <li><a class="sub-menu__item" href="#">Второе меню 2</a></li> <li><a class="sub-menu__item" href="#">Второе меню 3</a></li> <li><a class="sub-menu__item" href="#">Второе меню 4</a></li> </ul> </li> <li><a class="btn-menu" href="#">Нижний пункт</a> <ul class="sub-menu"> <li><a class="sub-menu__item" href="#">Третье меню 1</a></li> <li><a class="sub-menu__item" href="#">Третье меню 2</a></li> <li><a class="sub-menu__item" href="#">Третье меню 3</a></li> <li><a class="sub-menu__item" href="#">Третье меню 4</a></li> </ul> </li> </ul> <script> var ul = document.querySelector('.accordeon'), subMenu = document.querySelectorAll('.sub-menu'), curr; ul.addEventListener('click', function(e) { if( !e.target.classList.contains('btn-menu') ) return; curr = e.target.parentNode.querySelector('.sub-menu'); curr.style.display = curr.offsetHeight ? 'none' : 'block'; [].forEach.call(subMenu, function(item) { if(item == curr) return; item.style.display = 'none'; }); e.preventDefault(); }); </script> |
dmk,
var btnMenu = document.querySelectorAll('.btn-menu'), subMenu = document.querySelectorAll('.sub-menu'), i, btn, sub; for (i = 0; i < btnMenu.length; i++) { btn = btnMenu[i]; btn.addEventListener('click', menuOpen(i)); }; function menuOpen(i) { return function (event) { event.preventDefault(); [].forEach.call( btnMenu , function(el,a) { a == i ? (el.classList.toggle('btn-menu--active'), subMenu[a].classList.toggle('sub-menu--show')) : (el.classList.remove('btn-menu--active'), subMenu[a].classList.remove('sub-menu--show')); }); }; }; |
рони, Decode, Спасибо. Смотрю, разбираюсь как работает. В нижнем варианте функция как-то громоздко выглядит
|
Цитата:
document.querySelector('.accordeon').addEventListener('click', function (event) { var element = event.target; if (element.classList.contains('btn-menu')) { event.preventDefault(); element.classList.toggle('btn-menu--active'); element.nextElementSibling.classList.toggle('sub-menu--show'); } }); Уменьшить код можно еще если класс active задавать li? переделав разметку css Менять класс только одному єлементу |
Часовой пояс GMT +3, время: 16:49. |