【问题标题】:Close Dropdown when another Dropdown is opened打开另一个下拉菜单时关闭下拉菜单
【发布时间】:2020-08-11 08:26:28
【问题描述】:

我有一个带有多个按钮的垂直侧边栏导航菜单,每个按钮都包含一个链接下拉菜单。单击按钮会显示导航菜单中的锚链接下拉列表(例如 TF000120),以及主内容区域导航菜单右侧的 div(例如“森林”)。目前,如果我点击一个按钮,它的 div 和下拉菜单都显示得很好。但是,如果我在关闭第一个按钮之前单击另一个按钮,则会打开两组 div 和下拉菜单。当点击另一个按钮时,我将如何做到这一点,在显示新的 div 和下拉链接之前,当前打开的 div 和下拉链接再次被隐藏?

我在 W3 上使用了this 教程。

HTML(导航菜单)

<nav class="sidenav">
            <a href="#theforest" class="dropdown-btn" onclick="toggle_visibility('theforest');">The Forest
            </a>
            <div class="dropdown-container">
                <a class="entry-num" href="#TF000120">[TF000120]</a>
                <a class="entry-num" href="#TF000220">[TF000220]</a>
                <a class="entry-num" href="#TF000320">[TF000320]</a>
            </div>
            <a href="#theocean" class="dropdown-btn" onclick="toggle_visibility('theocean');">The Ocean</a>
            <div class="dropdown-container" >
                <a class="entry-num" href="#TO000120">[TO000120]</a>
                <a class="entry-num" href="#TO000220">[TO000220]</a>
                <a class="entry-num" href="#TO000320">[TO000320]</a>
            </div>
            <a href="#thesky" class="dropdown-btn" onclick="toggle_visibility('thesky');">The Sky</a>
            <div class="dropdown-container" >
                <a class="entry-num" href="#TS000120">[TS000120]</a>
                <a class="entry-num" href="#TS000220">[TS000220]</a>
                <a class="entry-num" href="#TS000320">[TS000320]</a>
            </div>
        </nav>

JS

    <script>
        var dropdown = document.getElementsByClassName("dropdown-btn");
        var i;

        for (i = 0; i < dropdown.length; i++) {
            dropdown[i].addEventListener("click", function() {
                this.classList.toggle("active");
                var dropdownContent = this.nextElementSibling;
                if (dropdownContent.style.display === "block") {
                    dropdownContent.style.display = "none";
                    } else {
                    dropdownContent.style.display = "block";
                    }
                });
            }
    </script>


<!--Toggle Function-->

  <script type="text/javascript">

    function toggle_visibility(id) {
       var e = document.getElementById(id);
       if(e.style.display == 'block')
          e.style.display = 'none';
       else
          e.style.display = 'block';
    }
</script>

谢谢!

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    在点击时重置所有下拉菜单的样式,然后再显示新的:

    dropdown[i].addEventListener("click", function() {
            //hide all divs that may be visible
            var lst = document.getElementsByClassName("dropdown-containder");
            for (var j = 0; j < lst.length; j++) { lst[j].style.display = "none";}
    
            //show the dive that the user selected
            this.classList.toggle("active");
            var dropdownContent = this.nextElementSibling;
            if (dropdownContent.style.display === "block") {
                dropdownContent.style.display = "none";
            } else {
                dropdownContent.style.display = "block";
            }
        });
    }
    

    【讨论】:

    • 感谢您的快速回复!这可以关闭第一个按钮/隐藏下拉菜单并打开新按钮/显示下拉菜单,但它仍然使两个 div 都显示在主要内容区域中。此外,一旦打开一个按钮/下拉菜单,我就无法完全最小化所有按钮/下拉菜单?
    • 如果 html sn-p 之外还有其他元素不响应选择器,您可以向这些元素添加一个类并更新选择器。请注意,与该选择器对应的所有元素都将被隐藏。
    • 无法完全正常工作。不知道我哪里出错了。我认为切换可见性功能或其他东西一定有冲突
    • 您正在复制事件。移除我上面使用的事件监听器,将toggle_visibility中的两行移动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2021-08-15
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多