Пытаюсь реализовать что-то типа навигации, при клике на элементы которой ниже будет выпадать подсписок, состоящий из нескольких ссылок.
Есть такой JS код:
(function() {
var links = document.querySelectorAll('.nav--link-select');
var subLists = document.querySelectorAll('.nav__sub-list');
var navItems = document.querySelectorAll('.nav--item-select');
for (var i = 0; i < links.length; i++) {
links[i].addEventListener('click', showSubList(i),false);
}
function showSubList(i){
return function (evt) {
// при клике на ссылку закрываем все открытые подсписки
for (var j = 0; j < subLists.length; j++) {
subLists[j].classList.remove('nav--sub-show');
links[j].classList.remove('nav--link-after');
navItems[j].classList.remove('nav--item-selected');
}
evt.stopPropagation();
evt.preventDefault();
// console.log(i);
// при клике на ссылку открываем соответствующий подсписок
subLists[i].classList.add('nav--sub-show');
links[i].classList.add('nav--link-after');
navItems[i].classList.add('nav--item-selected');
};
};
// при клике по окну закрываем все подсписки
document.onclick = function(evt) {
for (var k = 0; k < links.length; k++) {
subLists[k].classList.remove('nav--sub-show');
links[k].classList.remove('nav--link-after');
navItems[k].classList.remove('nav--item-selected');
}
}
})();
Вот ссылка на Codepen.
При клике по ссылкам .nav--link-select
1, 2 и 4 им добавляется класс nav--link-after
, который изменяет внешний вид псевдоэлемента (стрелки). И выпадает подсписок .nav__sub-list
путём добавления ему класса nav--sub-show
.
Также когда открывается новый подсписок, все те, которые были до него, закрываются; при клике на любой другой элемент окна подсписок также закрывается.
Не понимаю, как реализовать, чтобы при клике на ссылку с открытым подсписком она закрывалась?
Для этого вам надо сохранять состояние подписка. Заведите массив состояний для каждого подписка, которые будут меняться по мере того, как вы кликаете в соответствующий подписок. Изначально состояния все выключены
var flags = [];
После чего вы кликаете в подписок и там происходит событие, в котором вам надо проверить состояние подписка прежде чем ему добавлять классы.
if (!flags[i]) {
subLists[i].classList.add('nav--sub-show');
links[i].classList.add('nav--link-after');
navItems[i].classList.add('nav--item-selected');
}
Затем, когда классы определены, мы просто меняем состояние подписка на противоположное.
flags[i] = !flags[i];
Это все. Далее смотрим и наслаждаемся.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Разрабатываю приложение типа викторины с вопросамиНе могу решить задачу или решаю ее очень криво
При добавлении информации с формы на русском языке в БД высвечиваются непонятные символы
как сделать POST запрос с логином и паролем, и после чего сделать get ?