【问题标题】:Keep Jquery slideDown menu open when hovering over that menu?将鼠标悬停在该菜单上时保持 Jquery slideDown 菜单打开?
【发布时间】:2016-02-28 18:11:20
【问题描述】:

我的 Jquery slideDown 菜单有些困难。当我将鼠标悬停在触发 slideDown 事件的按钮上时,它可以完美运行,但是当我将鼠标悬停在向下滑动的子菜单上时,它会触发 slideUp 事件并关闭菜单。

我正在寻找一种方法来更改我的代码,以说明在我将鼠标悬停在初始按钮上以触发子菜单 slideDown 之后,如果我将鼠标悬停在子菜单上,该子菜单将保持打开状态,直到我我不再将鼠标悬停在初始按钮 子菜单上。我希望这已经足够清楚了。

这是我目前拥有的 Jquery,除了子菜单外,它运行良好!

$(document).ready(function () {
var menu = $('.menu')

menu.hide();

$('#mainbutton').hover(

    function () {
        $('.menu').stop(true, true).slideDown(400);
    },

    function () {
        $('.menu').stop(true, true).slideUp(400);
    }

);

});

有什么建议吗?我确定这很容易,我只是无法正确地表达我的问题以找到其他人的解决方案 u_u

感谢您提供的任何帮助!

编辑:这是 jsfiddle -- http://jsfiddle.net/mXXEP/

【问题讨论】:

    标签: jquery


    【解决方案1】:

    这不是一个特别容易解决的问题(开箱即用),因为有多个元素依赖彼此的状态才能正常工作。我以前用 setTimeout 做过这个。

    使用setTimeout 来保持对一个变量的控制,该变量告诉每个悬停事件要做什么。只需将一个 jsFiddle 放在一起即可满足您的要求(尽管我认为 mo 的上滑部分存在问题):

    http://jsfiddle.net/3vL3a/

    还有 JS/HTML:

    $(document).ready(function () {
        var menu = $('.menu')
        var timeout = 0;
        var hovering = false;
        menu.hide();
    
        $('#mainbutton')
            .on("mouseenter", function () {
            hovering = true;
            // Open the menu
            $('.menu')
                .stop(true, true)
                .slideDown(400);
    
            if (timeout > 0) {
                clearTimeout(timeout);
            }
        })
            .on("mouseleave", function () {
            resetHover();
        });
    
        $(".menu")
            .on("mouseenter", function () {
            // reset flag
            hovering = true;
            // reset timeout
            startTimeout();
        })
            .on("mouseleave", function () {
            // The timeout is needed incase you go back to the main menu
            resetHover();
        });
    
        function startTimeout() {
            // This method gives you 1 second to get your mouse to the sub-menu
            timeout = setTimeout(function () {
                closeMenu();
            }, 1000);
        };
    
        function closeMenu() {
            // Only close if not hovering
            if (!hovering) {
                $('.menu').stop(true, true).slideUp(400);
            }
        };
    
        function resetHover() {
            // Allow the menu to close if the flag isn't set by another event
            hovering = false;
            // Set the timeout
            startTimeout();
        };
    });
    

    HTML:

    <div id="mainbutton">Hover over me!</div>
    <div class="menu" style="background-color:red;">Test menu text
        <br/>Test menu text
        <br/>Test menu text
        <br/>Test menu text
        <br/>Test menu text
        <br/>
    </div>
    

    【讨论】:

    • 有一个小问题,如果我转到主按钮,然后快速通过子菜单,它只会跳回而不是滑动。会尝试修复自己,再次感谢
    • 是的,我注意到了......它真的不需要太多修复:)
    • 我需要做什么来解决这个问题?
    【解决方案2】:

    执行此操作的简单方法是检查鼠标是否离开.menu div,如下所示:

    $(document).ready(function () {
    var menu = $('.menu')
    menu.hide();
    
    $('#mainbutton').mouseover(
        function () {
            menu.stop(true, true).slideDown(400);
        }
    );
    
    $(".menu").mouseleave(       
        function () {
            menu.stop(true, true).slideUp(400)
        })
    });
    

    Fiddle

    【讨论】:

    • 这并不是真正的菜单 - 当您将鼠标移开主按钮时它不会消失(除非您从子菜单中移开鼠标)。
    • 我通过添加一个函数来修复它,如果鼠标进入它下面的 div 然后它也会向上滑动:-)
    • 这有助于我的下拉菜单在悬停在子菜单上时不断弹跳。不错!
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    相关资源
    最近更新 更多