#javascript #html #css
Вопрос:
Я недавно выучил javascript и хотел создать выпадающее меню. Так что с помощью Google мне это удалось. Проблема в том, что когда я хочу создать несколько таких выпадающих списков, это работает не так, как я хочу. Раскрывающиеся списки остаются открытыми даже после того, как я нажму за пределами раздела. Я пробовал делать с этим много вещей, которые я не собираюсь показывать, потому что это немного сбивает с толку, и мой последний вопрос был удален. Вот мой код.
index.html
<div class="dropdown">
<a onclick="myFunction()" class="nav-link dropbtn">Dropdown</a>
<div id="myDropdown" class="dropdown-content">
<a href="#home" class="nav-link">Home</a>
<a href="#about" class="nav-link">About</a>
<a href="#contact" class="nav-link">Contact</a>
</div>
</div>
<div class="dropdown">
<a onclick="myFunction()" class="nav-link dropbtn">Dropdown2</a>
<div id="myDropdown" class="dropdown-content">
<a href="#home" class="nav-link">Home</a>
<a href="#about" class="nav-link">About</a>
<a href="#contact" class="nav-link">Contact</a>
</div>
</div>
script.js
function myFunction() {
document.getElementById("myDropdown").classList.toggle("show");
}
window.onclick = function (event) {
if (!event.target.matches('.dropbtn')) {
var dropdowns = document.getElementsByClassName("dropdown-content");
var i;
for (i = 0; i < dropdowns.length; i ) {
var openDropdown = dropdowns[i];
if (openDropdown.classList.contains('show')) {
openDropdown.classList.remove('show');
}
}
}
}
и стиль.css
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #3b86ff;
z-index: 1;
min-width: 150px;
}
.dropdown-content a {
padding: 14px 16px;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.show {
display: block;
}
Ответ №1:
Объяснение содержится в коде. Вы были очень близки. Это может выглядеть совсем по-другому, но это небольшие различия. Прослушиватели щелчков лучше использовать в вашем сценарии, а не в элементах. Взгляните и задайте любые вопросы, которые у вас могут возникнуть
window.addEventListener('load', function() {
// wait until the page loads before working with HTML elements
document.addEventListener('click', function(event) {
//click listener on the document
document.querySelectorAll('.dropdown-content').forEach(function(el) {
if (el !== event.target) el.classList.remove('show')
// close any showing dropdown that isn't the one just clicked
});
if (event.target.matches('.dropbtn')) {
event.target.closest('.dropdown').querySelector('.dropdown-content').classList.toggle('show')
}
// if this is a dropdown button being clicked, toggle the show class
})
})
.dropdown {
position: relative;
display: inline-block;
width: 200px;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #3b86ff;
z-index: 1;
min-width: 150px;
}
.dropdown-content a {
padding: 14px 16px;
display: block;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.show {
display: block;
}
<div class="dropdown">
<a href='#' class="nav-link dropbtn">Dropdown</a>
<div class="dropdown-content">
<a href="#home" class="nav-link">Home</a>
<a href="#about" class="nav-link">About</a>
<a href="#contact" class="nav-link">Contact</a>
</div>
</div>
<div class="dropdown">
<a href='#' class="nav-link dropbtn">Dropdown2</a>
<div class="dropdown-content">
<a href="#home" class="nav-link">Home</a>
<a href="#about" class="nav-link">About</a>
<a href="#contact" class="nav-link">Contact</a>
</div>
</div>
Комментарии:
1. спасибо, чувак, я буду реализовывать это в своем коде, но мне это немного сложно понять, возможно, потому, что я новичок в javascript
2. также, что такое el
3. итерационные функции, такие как
forEach
автоматическое создание последнего аргумента, который является текущим элементом итерации. Вы можете называть это как угодно, это просто переменная. Я называю этоel
. Такdocument.querySelectorAll('.dropdown-content').forEach(function(el)
же происходит зацикливание (итерация) через каждый экземпляр элемента с классом.dropdown-content
, и в каждом цикле мы можем получить доступ к элементу с помощьюel