css 打开下拉菜单,可单击多个选项

epggiuax  于 2024-01-09  发布在  其他
关注(0)|答案(2)|浏览(109)

当您单击Press Me时,将打开一个下拉菜单,当您再次单击它或在窗口中的其他任何位置单击它时,它将关闭。
我还想将此函数添加到旁边的dropdown-arrow中,以便同步。
我也试着给予dropdown-arrowonclick="myFunction()",但是没有用。

function myFunction() {
    document.getElementsByClassName('dropdown-content')[0].classList.toggle('show');
}
// Close dropdown if the user clicks on window
window.onclick = function(event) {
    if (!event.target.matches('#verify-name')) {
        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');
            }
        }
    }
}
.buttons {
    display: flex;
    position: relative;
}
#dropdown-arrow {
    height: 20px;
}
.dropdown-content {
    display: none;
    position: absolute;
        padding: 14px; background-color: yellow;
}
.show {
    display: flex;
}
<div class="buttons">
    <div>
        <a id="verify-name" onclick="myFunction()">Press Me</a>
        <img id="dropdown-arrow" src="https://www.svgrepo.com/show/335062/dropdown.svg">

        <div class="dropdown-content">
            <span>Logout</span>
        </div>
    </div>
</div>
eagi6jfj

eagi6jfj1#

我有两种方法可以解决你的问题:
1.为下拉箭头附加单独的点击事件监听器
1.使用closest方法检查点击的元素是Press Me文本还是.dropdown-arrow
让我添加第二个的实现。第一个是不言自明的。在下面的代码中,我已经将window.onclick赋值替换为window.addEventListener('click', function() {...}),以避免与其他单击事件侦听器发生潜在冲突,这也是推荐的方式。

function toggleDropdown() {
  document.querySelector('.dropdown-content').classList.toggle('show');
}
window.addEventListener('click', function(event) {
  const clickedElement = event.target;

  if (clickedElement.closest('#verify-name') || clickedElement.closest('#dropdown-arrow')) {
    // Clicked on "Press Me" or the dropdown-arrow
    toggleDropdown();
  } else {
    // Clicked outside the dropdown elements
    document.querySelectorAll('.dropdown-content.show').forEach(function(openDropdown) {
      openDropdown.classList.remove('show');
    });
  }
});
.buttons {
  display: flex;
  position: relative;
}

#dropdown-arrow {
  height: 20px;
}

.dropdown-content {
  display: none;
  position: absolute;
  padding: 14px;
  background-color: yellow;
}

.show {
  display: flex;
}
<div class="buttons">
  <div>
    <a id="verify-name">Press Me</a>
    <img id="dropdown-arrow" src="https://www.svgrepo.com/show/335062/dropdown.svg">
    <div class="dropdown-content">
      <span>Logout</span>
    </div>
  </div>
</div>
8qgya5xd

8qgya5xd2#

将onclick事件添加到HTML中的下拉箭头:

<img id="dropdown-arrow" src="https://www.svgrepo.com/show/335062/dropdown.svg" onclick="myFunction()">

字符串
修改window.onclick函数以检查verify-name和dropdown-arrow:

window.onclick = function(event) {
    if (!event.target.matches('#verify-name') && !event.target.matches('#dropdown-arrow')) {
        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');
            }
        }
    }
};


通过这些更改,单击“按我”链接或“关闭”箭头将切换“关闭”菜单。单击窗口上的其他任何位置将关闭它(如果它已打开)。

相关问题