You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现点击已激活按钮隐藏对应下拉菜单

实现点击已激活按钮关闭对应下拉菜单

当前下拉菜单已支持:点击其他按钮关闭激活菜单、点击菜单区域外关闭所有菜单,现在补充点击已激活按钮时隐藏其对应下拉菜单的功能,修改后的代码如下:

修改后的JavaScript代码

const btn = document.querySelectorAll('.menu_btn');
const menuOff = document.querySelector('.first_menu');

// 仅绑定一次全局点击事件,处理点击区域外关闭所有菜单
document.addEventListener('click', function(e) {
    const clickInsideMenu = e.composedPath().includes(menuOff);
    if (!clickInsideMenu) {
        document.querySelectorAll('.dropdown.active').forEach(item => {
            item.classList.remove('active');
        });
    }
});

btn.forEach(item => {
    item.addEventListener('click', (e) => {
        e.stopPropagation(); // 阻止事件冒泡,避免触发全局区域外关闭逻辑
        const currentBtn = e.currentTarget;
        const targetDropdown = currentBtn.nextElementSibling;
        const isDropdownActive = targetDropdown.classList.contains('active');

        // 先关闭所有已激活的下拉菜单
        document.querySelectorAll('.dropdown.active').forEach(menu => {
            menu.classList.remove('active');
        });

        // 若当前菜单未激活则打开,已激活则保持关闭
        if (!isDropdownActive) {
            targetDropdown.classList.add('active');
        }
    });
});

关键改动说明

  • 判断菜单激活状态:点击按钮时先检查对应下拉菜单是否已处于激活状态,以此决定是打开还是关闭菜单
  • 修复重复事件绑定:将点击区域外关闭菜单的逻辑从按钮点击回调中移出,仅绑定一次,避免多次触发导致的异常
  • 阻止事件冒泡:在按钮点击事件中加入e.stopPropagation(),防止点击按钮时误触发全局的区域外关闭逻辑

保留原HTML与CSS代码

HTML代码

<ul class="first_menu">
    <li class="menu_item">
        <button class="menu_btn">1 btn</button>
        <div class="dropdown">
            <ul class="dropdown__list">
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">1 Подпункт</a>
                </li>
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">2 Подпункт</a>
                </li>
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">3 Подпункт</a>
                </li>
            </ul>
        </div>
    </li>
    <li class="menu_item">
        <button class="menu_btn">2 btn</button>
        <div class="dropdown">
            <ul class="dropdown__list">
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">1 Подпункт</a>
                </li>
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">2 Подпункт</a>
                </li>
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">3 Подпункт</a>
                </li>
            </ul>
        </div>
    </li>
    <li class="menu_item">
        <button class="menu_btn">3 btn</button>
        <div class="dropdown">
            <ul class="dropdown__list">
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">1 Подпункт</a>
                </li>
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">2 Подпункт</a>
                </li>
                <li class="dropdown__item">
                    <a href="#" class="dropdown__link">3 Подпункт</a>
                </li>
            </ul>
        </div>
    </li>
</ul>

CSS代码

.first_menu {
    position: relative;
    justify-content: center;
    display: flex;
}
.menu_item,.dropdown__item {
    list-style-type: none;
}
.menu_btn {
    cursor: pointer;
    border: none;
    padding: 25px;  
    background-color: black;
    color: #ffffff;
    font-weight: bold;
}
.dropdown {
    transition: all 1s;
    position: absolute;
    top: 0;
    transform: translateY(-100%);
    background-color: black;
}
.dropdown__item {
    text-align: center;
    padding-bottom: 20px;
}
.dropdown__link {
    text-decoration: none;
    color: white;
    font-weight: bold;
}
.active {
    top: 100px;
    transition: all 1s;
    transform: translateY(-30%);
}

内容的提问来源于stack exchange,提问作者user20100694

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:50:22