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

mouseleave事件实现鼠标离开下拉菜单全元素触发收起功能问题求解

问题根因

你的子菜单DOM结构没有嵌套在触发事件的父li元素内部,导致父元素的mouseleave事件在你鼠标移动到子菜单时就会触发,而不是等你离开整个菜单区域再触发。
你当前的结构是同级关系:

<li class="navigation__list-menu-about">
  <a href="/about" class="now">About</a>
</li>
<!-- 子菜单和父li平级,不属于父li的子元素 -->
<ul id="nav" class="navigation__list-menu-about-options now">
  <li><a href="/bio">my bio</a></li>
  <li><a href="/cv">curriculum vitae</a></li>
</ul>

解决方案

方法一:调整DOM结构(最推荐,符合语义且无需修改JS)

将子菜单嵌套进父li内部,此时父li的事件监听范围会包含自身和子菜单,鼠标在两者之间移动不会触发mouseleave,只有完全离开整个父li区域才会触发隐藏逻辑。
修改后的完整代码如下:

<ul class="navigation__list-menu">
  <li class="navigation__list-menu-about">
    <a href="/about" class="now">About</a>
    <!-- 子菜单移入父li内部 -->
    <ul id="nav" class="navigation__list-menu-about-options now">
      <li><a href="/bio">my bio</a></li>
      <li><a href="/cv">curriculum vitae</a></li>
    </ul>
  </li>
</ul>

<script>
const navOptions = document.querySelector(".navigation__list-menu-about");
const navOptionMenu = document.querySelector(
  ".navigation__list-menu-about-options"
);

navOptions.addEventListener("mouseenter", (e) => {
  navOptionMenu.classList.add("active");
});

navOptions.addEventListener("mouseleave", (e) => {
  navOptionMenu.classList.remove("active");
});
</script>

注意:如果你的子菜单用了绝对定位,需要给父元素.navigation__list-menu-about添加position: relative样式,避免子菜单定位偏移。

方法二:不调整DOM结构的兼容方案

如果因为历史原因不能修改DOM结构,可以给父元素和子菜单都绑定事件,用计时器延迟判断鼠标是否真的离开了整个菜单区域:

const navOptions = document.querySelector(".navigation__list-menu-about");
const navOptionMenu = document.querySelector(
  ".navigation__list-menu-about-options"
);
let hideTimer = null;

// 统一显示逻辑
const showMenu = () => {
  clearTimeout(hideTimer);
  navOptionMenu.classList.add("active");
};

// 统一隐藏逻辑
const hideMenu = () => {
  hideTimer = setTimeout(() => {
    navOptionMenu.classList.remove("active");
  }, 100); // 100ms延迟,避免鼠标在两个元素之间移动时误触发隐藏
};

// 给父元素和子菜单都绑定事件
navOptions.addEventListener("mouseenter", showMenu);
navOptions.addEventListener("mouseleave", hideMenu);
navOptionMenu.addEventListener("mouseenter", showMenu);
navOptionMenu.addEventListener("mouseleave", hideMenu);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:06:05