jQuery悬停依赖于两个元素

前端之家收集整理的这篇文章主要介绍了jQuery悬停依赖于两个元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有主导航和子导航,出于设计原因,它们位于不同的DIV中.我希望在主要导航项目悬停时显示相应的子导航,我可以这样做,但是如果用户将鼠标移动到主导航项目之外并进入子导航,我还希望保持子导航打开-nav区域.最后一部分是我被卡住的地方.

我正在考虑悬停我需要用setTimeout()和IF语句做一些事情,但我无法在该领域取得任何进展.这甚至是一种值得尝试的方法吗?

HTML

  1. <div id="mnav">
  2. <ul id="buttons">
  3. <li class="one"><a href="#">Main 1</a></li>
  4. <li class="two"><a href="#">Main 2</a></li>
  5. <li class="three"><a href="#">Main 3</a></li>
  6. <li class="four nav-dark"><a href="#">Main 4</a></li>
  7. </ul>
  8. </div> <!-- /mnav -->
  9.  
  10. <div id="snav">
  11. <ul class="snav-one">
  12. <li><a href="#">Sub 1.1</a></li>
  13. <li><a href="#">Sub 1.2</a></li>
  14. <li><a href="#">Sub 1.3</a></li>
  15. <li><a href="#">Sub 1.4</a></li>
  16. <li><a href="#">Sub 1.5</a></li>
  17. <li><a href="#">Sub 1.6</a></li>
  18. </ul>
  19. <ul class="snav-two">
  20. <li><a href="#">Sub 2.1</a></li>
  21. <li><a href="#">Sub 2.2</a></li>
  22. </ul>
  23. </div> <!-- /snav -->

JS:

  1. $(document).ready(function() {
  2. $("#buttons li.one,#buttons li.two").hover(function(){
  3. var subnav = 'ul.snav-' + $(this).attr('class');
  4.  
  5. $("#snav").slideDown('fast').addClass("open").find(subnav).show();
  6.  
  7. },function(e){
  8. var subnav = 'ul.snav-' + $(this).attr('class');
  9.  
  10. $("#snav").slideUp('fast').removeClass("open").find(subnav).hide();
  11. });
  12. });

解决方法

对于鼠标菜单人体工程学,您需要在从主菜单到子菜单的鼠标中进行小延迟,因此在鼠标到达之前子菜单不会关闭. (正如问题所说.)

但是,在菜单打开之前还需要延迟 – 既可以避免恼人的“天桥”激活,又可以减少在离开主菜单时偶然从sub1切换到sub2的常见情况.

所以,问题代码需要:

>将鼠标悬停在子菜单ul元素上.
>如果鼠标选择发生变化,请停止停止运行动画.
>可重置的计时器,控制打开和关闭.

See the demo at jsFiddle.

把它们放在一起:

  1. $("#buttons li.one,#buttons li.two").hover ( function () { MenuOpenCloseErgoTimer (
  2. 100,function (node) {
  3. var subnav = 'ul.snav-' + $(node).attr ('class');
  4. $("#snav ul").hide ();
  5. $("#snav").stop (true,true).slideDown ('fast').addClass ("open").find (subnav).show ();
  6. },this
  7. ); },function () { MenuOpenCloseErgoTimer (
  8. 200,function () {
  9. $("#snav").stop (true,true).slideUp ('fast').removeClass ("open").find ('ul').hide ();
  10. }
  11. ); }
  12. );
  13.  
  14. $("div#snav ul").hover ( function () { MenuOpenCloseErgoTimer (
  15. 0,true).slideDown ('fast').addClass ("open");
  16. $(this).show ();
  17. }
  18. ); },true).slideUp ('fast').removeClass ("open");
  19. $("#snav ul").hide ();
  20. }
  21. ); }
  22. );
  23.  
  24. function MenuOpenCloseErgoTimer (dDelay,fActionFunction,node) {
  25. if (typeof this.delayTimer == "number") {
  26. clearTimeout (this.delayTimer);
  27. this.delayTimer = '';
  28. }
  29. if (node)
  30. this.delayTimer = setTimeout (function() { fActionFunction (node); },dDelay);
  31. else
  32. this.delayTimer = setTimeout (function() { fActionFunction (); },dDelay);
  33. }

请注意#snav ul所需的额外操作,以便在子菜单之间中断交换后进行清理.

猜你在找的jQuery相关文章