【问题标题】:jQuery: How do you make a panel stay visible on mouseover, after a slideToggle?jQuery:在滑动切换之后,如何让面板在鼠标悬停时保持可见?
【发布时间】:2013-06-11 11:55:56
【问题描述】:


当鼠标停留在slide div 上时,slide_panel div 将变得可见。

但是,当鼠标随后退出slide div 并位于slide_panel 中的内容上方时,面板 仍然可见。

那么,一旦面板最初可见,如何保持切换面板在mouseover 上可见?


HTML:
<div class = "slide">category:</div>
<div class = "slide_panel">
     <a href = "#" title = "">asdf</a><br />
     <a href = "#" title = "">qwerty</a><br />
</div>

<div class = "slide">another category:</div>
<div class = "slide_panel">
     <a href = "#" title = "">another asdf</a><br />
     <a href = "#" title = "">another qwerty</a><br />
</div>


jQuery:

$(".slide").mouseover(function() {
    $(this).next(".slide_panel").slideToggle();

}).mouseout(function() {
    $(this).next(".slide_panel").slideToggle();
});



编辑:
我希望 slide_panel 然后在 mouseout 上消失,本质上就像一个下拉菜单。

【问题讨论】:

  • 离开元素时使用超时,应该是 700 毫秒。如果鼠标进入面板,则清除超时,否则,让超时结束并隐藏面板。
  • 谢谢@Ohgodwhy,但是我希望隐藏面板在slide_panelmouseover 上无限期保持可见..
  • $('.slide_panel') 何时可见?

标签: jquery mouseover slidetoggle mouseout


【解决方案1】:

如果您可以将子菜单包装在主菜单下,则可以避免此问题。

HTML

<div class="slide">category:
    <div class="slide_panel"> <a href="#" title="">asdf</a>
        <br /> <a href="#" title="">qwerty</a>
        <br />
    </div>
</div>
<div class="slide">another category:
    <div class="slide_panel"> <a href="#" title="">another asdf</a>
        <br /> <a href="#" title="">another qwerty</a>
        <br />
    </div>
</div>

JS

 $(".slide").on('mouseenter mouseleave', function () {
    $(this).find(".slide_panel").stop().slideToggle();

});

Demo

【讨论】:

  • 这很完美,谢谢@PSL!不过我很好奇——在这种情况下,slideToggle() 最初是如何被触发的? .stop() 是否仅在返回 true 时执行? (当有事停下时)
  • @IanCampbell 并不是我在 CSS 中没有提供 dsplay,这使它隐藏起来。由于事件冒泡问题,您还应该使用 mouseenter/mouseleave 而不是 mouseover/mouseout。提供停止以取消任何挂起的动画,以防您连续悬停...
【解决方案2】:

您正在触发slideToggle 两次,导致它在鼠标悬停时打开并在鼠标移出时关闭。鼠标移出时什么都不做应该保持打开状态,除非mouseover 有两个我不确定的状态。

【讨论】:

  • 谢谢@Dominic B-c。虽然我可能误导了你——你的建议确实有效,但我仍然希望面板在slide_panelmouseout 上消失。
  • @IanCampbell 根据那里的响应,问题出在结构的设计和标记中。隐藏的父元素的子元素将不可见——有几个原因。这里的解决方案是不要使元素成为父元素的子元素[暗示基于位置的关系],或者将它们都包装在单独的父元素中(因此它们是兄弟姐妹)。
  • 我在移动atm上,所以写代码太棘手了,如果明天没有人帮助你创建一个工作函数,我会尝试鞭打一个。
  • 还请各位版主注意:我不确定社区 wiki 是什么,因为 nexus 4 上的按钮有点小,所以不小心选择了它。
【解决方案3】:

试试这个Fiddle

JS:

$(".slide").mouseover(function () {
    $(".slide_panel").stop(true, true);
    $(".slide_panel").hide(0);
    $($(this).next(".slide_panel")[0]).slideToggle();

}).mouseout(function () {
    $(".slide_panel:visible").slideToggle();
});

CSS

.slide_panel {
  display: none;
}

更新

Mouseout 句柄事件已更新。我也更新了fiddle

$(".slide").mouseout(function () {
    $(this).find(".slide_panel").stop().slideToggle();
});

【讨论】:

  • 感谢@Stiger!但是,在这种情况下,'slide_panel 仍然会在 mouseenter 上消失。
  • mouseenterslide 中时,'slie_panel' 将可见。当mouseenter 在'slide_panel' 中时,'slide_panel' 会消失。对吗?
  • 是的,这是我不喜欢的行为。正如 Ohgodwhy 和 PSL 所建议的那样,问题的根源似乎在于我的 html 结构。
  • 我认为我的小提琴做得对,我不会改变你的 html 代码,只是 javascript 和 css
  • 啊哈,因此将 mouseout 处理程序的内容替换为 $(this).find(".slide_panel").stop().slideToggle(); 行(取自 PSL 的答案)将产生所需的结果。
猜你喜欢
  • 2012-03-14
  • 2011-02-06
  • 1970-01-01
  • 2015-01-29
  • 2012-09-02
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多