当鼠标悬停在另一个 div 上时,有什么更好的选择来代替 jQuery 的 .is(':hover') 来显示 div。

What is a better option to use instead of jQuery’s .is(‘:hover’) to show a div when hovering over another div.

当鼠标悬停在另一个 div 上时,有什么可以代替 jQuery 的 .is(':hover') 显示 div 的另一个或更好的选择。

我有一个全局导航,在最右边的最后一项有一个搜索图标 (li#search-open)。当鼠标悬停(悬停)时,我想要一个 div 包含位于全局导航正下方的搜索表单(#search-container)到 none 向下滑动。

http://thetownie.com/nav/index.html

我没有得到满意的结果。到目前为止,主要依靠 jQuery 的 .is(':hover') 函数并使用 window.setInterval 函数来持续检查用户是否将鼠标悬停在 #search-open 或 #search-容器。它正在间歇性工作。

执行此操作的更好方法是什么?这可以只用 CSS 完成吗?

注意 CNN 全球导航与我在这里尝试实现的相同。例如,尝试将鼠标悬停在“美国”、“世界”或“政治”上

www.cnn.com

如有任何帮助,我们将不胜感激。我的代码如下

<nav>
 <div id="main-nav-wrapper">
  <div id="main-nav-inner-wrapper">
   <ul id="six-items">
    <li class="a"><a href="#">Item 1</a></li>
    <li class="a"><a href="#">Item 2</a></li>
    <li class="a"><a href="#">Item 3</a></li>
    <li class="b"><a href="#">Item 4</a></li>
    <li><a href="#">Item 5</a></li>
    <li id="search-open"><a href="#" class="flaticon-magnifier13"></a></li>
    </ul>
<div id="search-container" class="closed">
 <form>
  <input type="text" placeholder="enter search terms here...." id="search-input"/>
  <input type="submit" value="search" />
 </form>
 </div>         
 </div><!-- end nav inner wrapper -->
 </div></div></nav>

我很抱歉 js 在这里,....

var searchcontainerhover = false;
var searchopenhover ;

function slideSearchUp(){
  jQuery('#search-container').slideUp('fast');  
 }

 function testIfHover(){
  if(jQuery('#search-container').is(':hover')) {
 searchcontainerhover = true;
 } else {
 searchcontainerhover = false;
}

if(jQuery('#search-open').is(':hover')) {
 searchopenhover = true;
} else {
 searchopenhover = false;
}

console.log(searchcontainerhover);
console.log(searchopenhover);

if((searchcontainerhover == false) && (searchopenhover == false)) {
setTimeout(slideSearchUp, 3000); 
 } 
}  
window.setInterval(testIfHover, 1000);

jQuery('#search-open').mouseenter(
  function(){
   jQuery('#search-container').slideDown('fast');
   jQuery( "#search-container").removeClass( "closed" ).addClass( "open" );
 searchopen = true;
 console.log(searchopen);
});

我会通过向按钮和搜索容器添加一个 mouseleave 处理程序以及在搜索容器上添加一个 mouseenter 来解决这个问题。

function slideSearchUp(){
  jQuery('#search-container').slideUp('fast');  
}
var searchContainerTimeout;

jQuery('#search-open').mouseenter(function(){
   jQuery('#search-container').slideDown('fast');
   jQuery( "#search-container").removeClass( "closed" ).addClass( "open" );
});
jQuery('#search-open,#search-container').mouseleave(function(){
   searchContainerTimeout = setTimeout(slideSearchUp,3000);
})
$('#search-container').mouseenter(function(){
   clearTimeout(searchContainerTimeout);
   searchContainerTimeout = setTimeout(slideSearchUp,3000);
});

现在会发生的事情是当鼠标进入search-open时,search-container会滑动打开。当鼠标离开 search-open 时,将开始超时并在三秒后关闭 search-container。如果鼠标输入search-container或重新输入search-open,超时将停止。如果鼠标离开search-container,它会重新开始。

这个Demo可能对你有帮助,你可以用动画等扩展它

  
  
 $(document).ready(function(){
  
  $("#search").mouseenter(function(){

   $("#searchdiv").show();
   $(document).bind("mousemove", mousemove);

  });

  function mousemove(e){
    
   if(!$(e.target).hasClass("search")){
    $(document).unbind("mousemove", mousemove);
    $("#searchdiv").hide();
   }  
  }
  
 }); 
span{      
  border: 1px solid blue;
}


.search{
  border: 1px solid red;
  cursor:pointer;
}

#searchdiv{
  display:none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<span>One</span><span>Two</span><span>Three</span><span>Four</span><span id="search" class="right search">Search</span>

<div id="searchdiv" class="search">Search Div</div>