jQuery 悬停鼠标在列表下拉列表中过早触发

标签 jquery

我在下面附上了我的问题的片段。当我将鼠标悬停在太多菜单项上时,它应该触发的下拉菜单将.slideUp()过早。它应该运行的逻辑很简单:

  1. 如果鼠标悬停 - 保留其关联的下拉菜单。

  2. 如果鼠标移开 - 丢失其关联的下拉菜单。

  3. 如果鼠标悬停在下拉列表上,则保持下拉列表显示。

现在看来 (2) 并不总是有效,因为如果您将鼠标悬停在一个元素上而不是另一个元素上,即使鼠标停留在第二个元素上,第二个元素也会立即失去其下拉列表。

请帮忙,它似乎只有在您稍等一下并刻意一次点击一个菜单项以触发下拉菜单时才有效,但显然这不是用户的行为方式。

编辑:考虑到我的页面 CSS 的详细信息,我需要一个 JavaScript 解决方案,这使得嵌套 CSS 解决方案不可取。

jQuery(".header2 li a").mouseover(function(event){

jQuery(".dropdown").css('display','none');

});
jQuery(".header2 li a").hover(function (event) {
    event.preventDefault();
	$id = jQuery(this).attr('id'); 
    jQuery("."+$id +".boxs").stop().slideDown(); //id of href is a class on .boxs/.dropdown for targetting
},function (event) {
$id = jQuery(this).attr('id');
    setTimeout(function () {
        if (  jQuery("."+$id+".boxs").hasClass('active')) {
        }
        else {
            event.preventDefault();
              jQuery("."+$id +".boxs").slideUp();
			  console.log($id);
        }
    }, 500);
});
 jQuery(".dropdown").mouseenter(function () {
    jQuery(this).addClass('active');
    jQuery(this).show();
});
 jQuery(".dropdown").mouseleave(function () {
    jQuery(this).slideUp();
    jQuery(this).removeClass('active');
});
.header2 li {
    display: inline-block;
    list-style: none;
    padding: 0;
    margin: 0;
}

.header2 li a{
  padding:5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="boxs header2">
  <li>
    <a href="/" class="active active1">Home</a>
  </li>

  <li>
    <a href="/category/news" class="" id="news">News</a>
  </li>
  <li>
    <a href="/category/featured" class="" id="f">Featured</a>
  </li>
  <li>
    <a href="/category/gear" class="" id="another">Another Dropdown</a>
  </li>
  <li>
    <a href="/category/the-journal" class="" id="one_more">One More! </a>
  </li>
</ul>
<!--DROPDOWNS BELOW-->

<div class="news boxs dropdown" style="display: none;">
                    <div class="container">
                        <div class="boxs">
                            <div class="row">
                                <div class="col-md-6 nopadding">
                                    <div class="col-xs-3">
                                        <ul>
                                            <li><h3>News From</h3></li>
                                        </ul>
                                    </div>
                                    <div class="col-xs-3">
                                        <ul>
                                            <li>Capitol Hill</li>
                                        </ul>
                                    </div>
                                    <div class="col-xs-3">
                                        <ul>
                                            <li>The White House</li>
                                        </ul>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
</div>

<div class="f boxs dropdown" style="display: none;">
                    <div class="container">
                        <div class="boxs">
                            <div class="row">
                                <div class="col-md-6 nopadding">
                                    <div class="col-xs-3">
                                        <ul>
                                            <li><h3>News From</h3></li>
                                        </ul>
                                    </div>
                                    <div class="col-xs-3">
                                        <ul>
                                            <li>Toronto</li>
                                        </ul>
                                    </div>
                                    <div class="col-xs-3">
                                        <ul>
                                            <li>Quebec</li>
                                        </ul>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
</div>

<div class="another boxs dropdown" style="display: none;">
                    <div class="container">
                        <div class="boxs">
                            <div class="row">
                                <div class="col-md-6 nopadding">
                                    <div class="col-xs-3">
                                        <ul>
                                            <li><h3>Zookeepers</h3></li>
                                        </ul>
                                    </div>
                                    <div class="col-xs-3">
                                        <ul>
                                            <li>Lions</li>
                                        </ul>
                                    </div>
                                    <div class="col-xs-3">
                                        <ul>
                                            <li>Tigers</li>
                                        </ul>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
</div>

<div class="one_more boxs dropdown" style="display: none;">
                    <div class="container">
                        <div class="boxs">
                            <div class="row">
                                <div class="col-md-6 nopadding">
                                    <div class="col-xs-3">
                                        <ul>
                                            <li><h3>Milk</h3></li>
                                        </ul>
                                    </div>
                                    <div class="col-xs-3">
                                        <ul>
                                            <li>1%</li>
                                        </ul>
                                    </div>
                                    <div class="col-xs-3">
                                        <ul>
                                            <li>2%</li>
                                        </ul>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
</div>

最佳答案

对于这些选项使用嵌套的多级 ul 层次结构会更有意义,因为它是单独的 div 元素(以及它们之间的后续间隙)导致问题。

如果您使用嵌套的 ul 元素,您可以单独在 CSS 中完成此操作,如下所示:

.header2 > li {
  float: left;
  list-style: none;
  padding: 0;
  margin: 0 5px;
  position: relative;
}

.header2 > li > ul {
  display: none;
  padding: 0;
  width: 200px;
}

.header2 > li:hover > ul {
  display: block;
  position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="boxs header2">
  <li>
    <a href="/" class="active">Home</a>
  </li>
  <li>
    <a href="/category/news">News</a>
    <ul>
      <li>
        <h3>News From</h3>
      </li>
      <li>Capitol Hill</li>
      <li>The White House</li>
    </ul>
  </li>
  <li>
    <a href="/category/featured">Featured</a>
    <ul>
      <li>
        <h3>News From</h3>
      </li>
      <li>Toronto</li>
      <li>Quebec</li>
    </ul>
  </li>
  <li>
    <a href="/category/gear">Another Dropdown</a>
    <ul>
      <li>
        <h3>Zookeepers</h3>
      </li>
      <li>Lions</li>
      <li>Tigers</li>
    </ul>
  </li>
  <li>
    <a href="/category/the-journal">One More! </a>
    <ul>
      <li>
        <h3>Milk</h3>
      </li>
      <li>1%</li>
      <li>2%</li>
    </ul>
  </li>
</ul>

单独使用 CSS 可以使逻辑更具可扩展性(您只需添加更多 liul 元素即可获得更多菜单项,而不会影响 JS)并且性能也更好。

关于jQuery 悬停鼠标在列表下拉列表中过早触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51787561/

相关文章:

php - 如何通过POST获取多个选择框的所有值?

javascript - 循环调用类函数

具有多个选择器的 jQuery 自定义函数

javascript:使用 javascript 在 select 标签中设置选项的标题

jquery - 在 unslider 幻灯片放映中禁用向后动画

来自图像标题属性的 Jquery 循环哈希 URL

c# - Javascript 确认或其他类型的确认

javascript - 如何使 setTimeout 表现得像等待

php - $(document).ready(function() { div 加载后不起作用

javascript - 两个容器之间的自定义形状线,像进度条一样改变颜色