javascript - 下拉菜单 : Infinite Slide on Hover with jQuery

标签 javascript jquery html css drop-down-menu

我用 jquery 创建了一个简单的下拉菜单

https://jsfiddle.net/pmksgz3w/

HTML

<ul>
  <li>Page A</li>
  <li>Page B
    <ul>
      <li>Dropdown</li>
      <li>Dropdown</li>
    </ul>
   </li>
</ul>

查询

$(document).ready(function(){
            $('ul> li').hover(function() {
                 $(this).find('ul').slideToggle();
            });
        });

当我将鼠标悬停在页面 B 上时,会显示下拉菜单。如果我将光标从页面 B 非常缓慢地向右移动(参见图片),则下拉菜单将关闭,因为 li 不会短暂悬停。如何防止下拉菜单立即关闭?

enter image description here

如果我将光标极快地移动到下拉菜单,则会出现更糟糕的问题。因为那样的话,下拉菜单就会无限循环地向上滑动和向下滑动。

我在 How to tell .hover() to wait? 找到了2009 年的一个有前途的解决方案,但当我尝试时答案不起作用,(编辑说明:现在有效,请参见下面的编辑)。此外还提到应该使用 hoverIntend插入。我下载了插件并将我的 jQuery 代码更改为

$(document).ready(function(){
            $('ul> li').hoverIntend(function() {
                 $(this).find('ul').slideToggle();
            });
        });

虽然它改进了一些东西,但是上面它立即关闭和无限循环的问题仍然存在。我该如何解决这个问题?


编辑:我设法解决了第一个问题!现在下拉菜单不会立即关闭!

https://jsfiddle.net/5sxvsu8w/

我必须按如下方式更改 jQUery 代码:

$(document).ready(function(){
    var timer;

    $('ul> li').hover(function() {
      clearTimeout(timer);
      $(this).find('ul').slideDown('fast');
    }, function() {
      var list = $(this).find('ul');
      timer= setTimeout(function() {
      list.slideUp('fast');
     }, 2000);
    });
});

但是,死循环问题依然存在。

最佳答案

您在 here 中找到的解决方案很有用,这段 javascript 代码可能会有所帮助:

$(document).ready(function(){
            
  $('.menu li').hover(
    function () {
        $('.sub', this).stop().slideDown(650);
    }, 
    function () {
        $('.sub', this).stop().slideUp(650);
    }
);

});




/*$('ul >li').hover(function() {
    clearTimeout($(this).data('timeout'));
    $('li > ul').slideDown('fast');
}, function() {
    var t = setTimeout(function() {
        $('li > ul').slideUp('fast');
    }, 650);
    $(this).data('timeout', t);
});*/
li{
  list-style-type:none;
  display: inline-block;
  position: relative;
  padding: 20px;
  background-color: #08c;
}

li ul li{
  min-width:200px;
}

li ul{
  margin:0;
  padding:0;
  position: absolute;
  top: 100%;
  left:0;
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="menu">
  <li>Page A</li>
  <li>Page B
    <ul class="sub">
      <li>Dropdown</li>
      <li>Dropdown</li>
    </ul>
   </li>
   
</ul>

编辑: 经过一些研究,我更改了我的 javascript 代码;不幸的是,这个解决方案并没有完全解决第一个问题(它仍然基于计时器)但避免了无限循环。

关于javascript - 下拉菜单 : Infinite Slide on Hover with jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35366509/

相关文章:

javascript - 我如何使用 thymeleaf 在 javascript 中使用 for 循环?

javascript - 使用JS渲染Django表单

JavaScript 类型转换

javascript - 如何将参数传递给动态设置的 JavaScript 函数?

jquery - 如何将动态创建的div附加到容器

javascript - 使用 class 获取 div 标签的内容

javascript - Highcharts - 导出模块

JavaScript - "Identifier has already been declared"

javascript - 在 Javascript 字符串中使用 Bootstrap 的 popover 插件

javascript - 解析文本文件以兼容 HTML?