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

如何实现点击按钮后下拉菜单保持展开状态?

如何实现点击按钮后下拉菜单保持展开状态?

嘿,我看了你的代码,一下子就找到问题所在啦!你的下拉菜单之所以闪一下就关闭,核心原因是你用了CSS的:active伪类来控制菜单展开——这个伪类只有鼠标按住按钮的时候才生效,松开鼠标它就失效了,自然菜单就收回去了。咱们来一步步修复:

第一步:把CSS里的:active替换成持久的类

把所有控制菜单展开的:active伪类换成.active类,这样只有当我们用JS给元素加上这个类时,菜单才会保持展开:

修改后的关键CSS代码片段:

/* 替换原来的.nav-list li:active>.sub-menu */
.nav-list li.active > .sub-menu {
    top: 8rem;
    opacity: 1;
    visibility: visible;
}

/* 替换原来的.sub-menu li:active>.sub-menu */
.sub-menu li.active > .sub-menu {
    top: 0;
    left: 100%;
}

/* 移动端的子菜单也要改 */
@media screen and (max-width: 900px) {
    /* 替换原来的.nav-list li:active > .sub-menu */
    .nav-list li.active > .sub-menu {
        opacity: 1;
        visibility: visible;
        max-height: initial;
    }
}

第二步:用JavaScript控制下拉菜单的展开/收起

现在需要给带有子菜单的链接添加点击事件,切换父元素的active类,同时阻止链接的默认跳转行为(避免页面刷新):

更新后的JS代码:

let menu_icons = document.querySelector('.menu-icons'),
nav = document.querySelector('nav');

// 控制汉堡菜单的展开/收起
menu_icons.addEventListener('click', () => {
    nav.classList.toggle('active');
});

// 控制下拉子菜单的展开/收起
const dropdownLinks = document.querySelectorAll('.nav-list li:has(.sub-menu) a');
dropdownLinks.forEach(link => {
    link.addEventListener('click', (e) => {
        // 阻止链接默认跳转行为
        e.preventDefault();
        // 切换父li元素的active类
        const parentLi = link.closest('li');
        parentLi.classList.toggle('active');
        
        // 如果需要点击其他菜单时关闭当前菜单,可以加上这段(可选)
        // dropdownLinks.forEach(otherLink => {
        //     const otherLi = otherLink.closest('li');
        //     if (otherLi !== parentLi) {
        //         otherLi.classList.remove('active');
        //     }
        // });
    });
});

第三步:可选优化——点击页面其他区域关闭菜单

如果想要点击页面空白处时关闭所有展开的菜单,可以再加一段代码:

document.addEventListener('click', (e) => {
    // 判断点击的区域不是菜单按钮和菜单本身
    if (!menu_icons.contains(e.target) && !nav.contains(e.target)) {
        nav.classList.remove('active');
        // 关闭所有下拉子菜单
        document.querySelectorAll('.nav-list li.active').forEach(li => {
            li.classList.remove('active');
        });
    }
});

这样修改后,你的下拉菜单点击后就会保持展开状态,再次点击就会收起啦!测试一下应该就没问题了~

备注:内容来源于stack exchange,提问作者Lozinator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:34:30