简体   繁体   English

使用setTimeout函数将鼠标悬停在两个下拉菜单上时出现问题

[英]Problem with two dropdown menu on hover with function setTimeout

I have two different dropdown menus that show on hover. 我有两个在悬停时显示的下拉菜单。 They show with delay function setTimeout, and fadeOut with delay function setTimeout. 它们使用延迟函数setTimeout来显示,并且使用延迟函数setTimeout来淡出。

Problem is if I hover on first li element to second, first submenu stays shown and doesn't fadeOut. 问题是,如果我将鼠标悬停在第一个li元素上,则第二个子菜单保持显示状态并且不淡出。 And from second li element to first is the same problem. 从第二个锂元素到第一个锂元素是同样的问题。 I know that it is a problem because there is setTimeout function. 我知道这是一个问题,因为有setTimeout函数。 Function clearTimeout is activated when hovering on li element. 将鼠标悬停在li元素上时会激活功能clearTimeout。

I want on hover to do FadeIn submenu and then when mouseover from first li element to second, first submenu hides (without fadeOut) and at the same time shows second submenu. 我想在鼠标悬停时执行FadeIn子菜单,然后将鼠标悬停在从第一个li元素到第二个li菜单上时,第一个子菜单隐藏(不使用fadeOut),同时显示第二个子菜单。 When mouse leaves li element and isn't hovering on second element, submenu fadeOut with delay. 当鼠标离开li元素而没有悬停在第二个元素上时,子菜单带有延迟淡出。

My question is: How do I solve this problem when this hover function is dynamic for both submenus with same class? 我的问题是:当具有相同类的两个子菜单的此悬停功能都是动态的时,如何解决此问题?

Thanks for help! 感谢帮助!

  // Menu-hover-script var setTimeoutFadeIn, setTimeoutFadeOut function fadeIn_Menu(thisObj) { setTimeoutFadeIn = setTimeout(function() { thisObj.children('ul.level1').stop(false, false).fadeIn(220); }, 300); } function fadeOut_Menu(thisObj) { setTimeoutFadeOut = setTimeout(function() { thisObj.children('ul.level1').stop(false, false).fadeOut(180); }, 600); } $('li.submenu').hover(function() { clearTimeout(setTimeoutFadeOut); fadeIn_Menu($(this)); }, function() { clearTimeout(setTimeoutFadeIn); fadeOut_Menu($(this)); }); // END--Menu-hover-script 
 body li a { text-decoration: none; } li.nav-item { display: inline-block; list-style-type: none; width: 70px; height: 30px; line-height: 26px; text-align: center; border: 1px solid black; cursor: pointer; } li.nav-item:first-child { margin-left: 100px; } ul.level1 { display: none; position: absolute; padding-left: 0; } ul.level1 li { list-style-type: none; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <li class="level1 nav-item submenu"> <a class="nav-link" href="#">menu1</a> <ul class="level1 submenu"> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> </ul> </li> <li class="level1 nav-item submenu"> <a class="nav-link" href="#">menu2</a> <ul class="level1 submenu"> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> </ul> </li> 

Since you call clearTimeout on each hover it won't trigger anymore once you hover over the other submenu. 由于您在每次悬停时都调用clearTimeout ,因此将鼠标悬停在另一个子菜单上时将不再触发。 Either store them in different variables or simply remove the clearTimeout in both of your functions. 可以将它们存储在不同的变量中,也可以只删除两个函数中的clearTimeout

setTimeout() and fadeIn() / fadeOut() is redundant. setTimeout()fadeIn() / fadeOut()是多余的。 Just simply set up mouseover and mouseout event handlers for the top-level menu items that cause the fade in/out. 只需为导致淡入/淡出的顶级菜单项设置mouseovermouseout事件处理程序即可。

 $("li.level1").on("mouseover", function(){ $("ul.submenu", this).fadeIn(220); }); $("li.level1").on("mouseout", function(){ $("ul.submenu", this).fadeOut(180); }); 
 body li a { text-decoration: none; } li.nav-item { display: inline-block; list-style-type: none; width: 70px; height: 30px; line-height: 26px; text-align: center; border: 1px solid black; cursor: pointer; } li.nav-item:first-child { margin-left: 100px; } ul.level1 { display: none; position: absolute; padding-left: 0; } ul.level1 li { list-style-type: none; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <li class="level1 nav-item submenu"> menu1 <ul class="level1 submenu"> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> </ul> </li> <li class="level1 nav-item submenu"> menu2 <ul class="level1 submenu"> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> </ul> </li> 

Could also do this without any jQuery at all. 完全不用任何jQuery也可以做到这一点。 Just CSS 只是CSS

 body li a { text-decoration: none; } li.nav-item { display: inline-block; list-style-type: none; width: 70px; height: 30px; line-height: 26px; text-align: center; border: 1px solid black; cursor: pointer; } li.nav-item:first-child { margin-left: 100px; } ul.level1 { opacity: 0; padding-left: 0; transition: opacity 180ms ease; } ul.level1 li { list-style-type: none; } .nav-item:hover > .submenu { display: block; opacity: 1; transition: opacity 220ms ease; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <li class="level1 nav-item submenu"> <a class="nav-link" href="#">menu1</a> <ul class="level1 submenu"> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> </ul> </li> <li class="level1 nav-item submenu"> <a class="nav-link" href="#">menu2</a> <ul class="level1 submenu"> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> <li class="level2"><a href="#">li element</a></li> </ul> </li> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM