【问题标题】:hover/ mouseenter/ mouseleave on menu items悬停/鼠标进入/鼠标离开菜单项
【发布时间】:2020-06-23 21:38:38
【问题描述】:

希望实现以下内容。

我有一个导航菜单,当我将鼠标悬停在“服务”链接上时,会显示一个子菜单。如果光标从主菜单中的“服务”移开并悬停在子菜单上,并且光标在页面周围移动,子菜单将保持显示。将鼠标悬停在其他主菜单项之一时,子菜单将消失。

本网站上的菜单示例(对链接表示歉意,我知道页面可能很快会更改,但显示为描述所需内容的最简单方法)https://kota.co.uk/

我正在使用 WordPress

菜单结构示例

HTML

<div class="slide-in-menu-container">
<div class="menu__main">
<a class="menu__block" href="/home">Home</a>
<a class="menu__services" href="/services">Services</a>
<a class="menu__block" href="/work">Work</a>
<a class="menu__block" href="/about">About</a>
<a class="menu__block" href="/contact">Contact</a>
</div>

<div class="menu__services--hover">
<a href="/link">link</a>
<a href="/link">link</a>
<a href="/link">link</a>
<a href="/link">link</a>
</div>
</div>

我没有展示任何 jQuery,因为我尝试了几种不同的解决方案,但不知道哪个最好展示,但在我将鼠标悬停在另一个菜单项上之前,它们都不会显示子菜单。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    最初 hide() 你的服务 div 我们可以通过使用 jQuery mouseover()mouseleave() 来实现这一点

    在下面运行 sn-p 以查看实际情况。

    $(".menu__services").mouseover(function() {
     $('.menu__services--hover').removeClass('d-none')
      $(".menu__block").mouseover(function() {
        $('.menu__services--hover').addClass('d-none')
     });
       });
    .d-none {
      display: none;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <div class="slide-in-menu-container">
      <div class="menu__main">
        <a class="menu__block" href="/home">Home</a>
        <a class="menu__services" href="/services">Services</a>
        <a class="menu__block" href="/work">Work</a>
        <a class="menu__block" href="/about">About</a>
        <a class="menu__block" href="/contact">Contact</a>
      </div>
    
      <div class="menu__services--hover d-none">
        <a href="/link">link</a>
        <a href="/link">link</a>
        <a href="/link">link</a>
        <a href="/link">link</a>
      </div>
    </div>

    【讨论】:

    • 谢谢,但还不完全正确。将鼠标悬停在“服务”链接上会显示子菜单,但是如果我将光标直接移动到另一个菜单链接,子菜单仍然会显示,当悬停在另一个菜单链接上时子菜单应该会消失。此外,将鼠标悬停在子菜单上后,一旦您离开容器,子菜单就会消失,它应该会一直显示,直到您将鼠标悬停在另一个父菜单链接上。
    • @tonyd 感谢您提供更多说明 - 我已更新我的答案以符合您的期望。请告诉我。不需要为此使用setTimeout
    • 几乎在那里,一旦“服务”被悬停并出现子菜单,我需要它保持显示,直到另一个菜单链接悬停在 menu__main div 中。类似于原始问题中的示例网站。
    • @tonyd 请查看我的更新答案。我知道你的意思。它现在的工作方式与网站完全一样。
    • @AlwaysHelping....是的....一切都很好,按要求工作,非常感谢!
    【解决方案2】:

    当鼠标悬停在另一个菜单上时,只需隐藏所有菜单,然后显示您要显示的菜单,不要在 mouseleve 上添加功能

    【讨论】:

    • 欢迎来到 SO。在答案中提供一个可行的解决方案而不是用陈述来解释是理想的。这样其他成员也将受益。谢谢。在此处阅读有关如何回答的更多信息:stackoverflow.com/help/how-to-answer
    • @alpha-wolf-gamer 但我想同时显示父菜单和子菜单。
    【解决方案3】:

    @AlwaysHelping 的回答很好,当鼠标离开主菜单选项时出现问题,子菜单面板没有隐藏,所以我只是更正并针对该问题进行了修改。

    它会检查主菜单和子菜单是否已经鼠标悬停,然后它不会为d-none添加类。

    $(document).ready(function(){
        $(".menu__services").mouseenter(function() {
            $('.menu__services--hover').removeClass('d-none')
        });
    
        $(".menu__services, .menu__services--hover").mouseleave(function() {
            setTimeout(function(){
                if(!$('.menu__services:hover').length && !$(".menu__services--hover:hover").length){
                    $(".menu__services--hover").addClass('d-none')
                }
            }, 100);
        });
    });
    .d-none {
      display: none;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <div class="slide-in-menu-container">
      <div class="menu__main">
        <a class="menu__block" href="/home">Home</a>
        <a class="menu__services" href="/services">Services</a>
        <a class="menu__block" href="/work">Work</a>
        <a class="menu__block" href="/about">About</a>
        <a class="menu__block" href="/contact">Contact</a>
      </div>
    
      <div class="menu__services--hover d-none">
        <a href="/link">link</a>
        <a href="/link">link</a>
        <a href="/link">link</a>
        <a href="/link">link</a>
      </div>
    </div>

    希望对您有所帮助。

    【讨论】:

    • 谢谢,不幸的是,即使将鼠标悬停在其他父菜单项上,子菜单仍然可见。
    • 其实刚刚检查了控制台报错Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: hover
    • 您使用的是哪个 Jquery 版本?
    • 我认为您使用的是旧的 jquery 版本,或者浏览器可能出现问题,这就是 is(":hover") 不起作用的原因,所以我更新了答案,检查它是否工作。
    • jQuery ver=1.12.4 和 jquery-migrate.min.ver=1.4.1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2013-07-16
    • 2023-03-31
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多