【问题标题】:Nested hover events, only apply to most direct hovered element嵌套悬停事件,仅适用于最直接悬停的元素
【发布时间】:2014-05-30 07:32:08
【问题描述】:

HTML:

<div class="outer">
  <div class="inner">

  </div>
</div>

CSS:

.outer {
  outline: 1px solid green;
  padding: 20px;
}

.inner {
  outline: 1px solid red;
  height: 50px;
}

.hover {
  outline: 1px solid yellow;
}

JS:

$('.outer, .inner').on('mouseenter', function(e){

  $(this).addClass('hover');

}).on('mouseleave', function(e){

  $(this).removeClass('hover');

});

http://codepen.io/anon/pen/tEAiG/

有没有办法让悬停类只应用于直接悬停的元素? IE。当鼠标在内部 div 内部时,它是黄色的,而不是外部的?

【问题讨论】:

标签: javascript css hover


【解决方案1】:

由于您是通过自己添加类来处理悬停,而不是使用 CSS :hover,因此您可以在对 mouseenter 做出反应时在处理程序中 stop propagation 处理事件。

这样,如果处理程序对 .inner 做出反应,它将 stopPropagation() 以防止事件也转到 .outer

另一个问题是您必须进入外部并对其进行处理才能到达内部,因此您需要删除 必须已添加到的悬停类父节点。

this fiddle中展示

【讨论】:

  • 我对 .stopPropagation() 的问题是,在项目中,这似乎干扰了我在其他地方进行的其他事件处理程序。
  • @dangerDAN 我已经更新了jsfiddle.net/stephen61/3p96q/1,所以你可以从右侧直接进入.inner——如果你注释掉stopPropagation,你会看到两个div都发生了变化。如果您的 div 将始终完全嵌套,您应该能够在不停止传播的情况下进行,因为在进入内部时从父级移除悬停就足够了。
  • 这里的问题是,如果您随后退出 .inner,则 .hover 不会重新应用于 .outer。这可以通过使用 mousemove 来解决,这实际上是我目前正在做的工作,但是如果你在这里看到我的其他 cmets,我觉得这有点 hackish,所以我的问题是看看是否有处理事件的不同方式。
  • 是的,您也许可以使用 mouseleave 而不是 mousemove,但您的“解决方法”确实是唯一的方法。
  • 只是添加到上面.. 使用.parents() 这样如果用户悬停太快,它将确保它删除所有父元素上的.hover
【解决方案2】:

一种可能的方法是从外部 div 中删除悬停类,然后在鼠标位于内部 div 内时将其应用到内部 div,因为每当您进入内部 div 时,悬停类都会应用于两个 div .

【讨论】:

    【解决方案3】:

    您可以通过为每个单独的处理程序来做到这一点。

    $('.outer').on('mouseenter', function(e){      
      $(this).addClass('hover');      
    }).on('mouseleave', function(e){     
      $(this).removeClass('hover');      
    });
    
    $('.inner').on('mouseenter', function(e){
      $(this).addClass('hover');
      $('.outer').removeClass('hover');
    }).on('mouseleave', function(e){
      $(this).removeClass('hover');
      $('.outer').addClass('hover');
    });
    

    Demo

    【讨论】:

    • 查看对 Agush 回答的评论。
    • 这并不是真正的 hackish,也没有 Agush 的问题,当您离开内部 div,但仍在外部 div 中时。
    • 好的,它不是“hackish”,但它不像我想要的那样干净。这是我已经在做的工作。
    【解决方案4】:

    当鼠标进入内层div时,可以移除类悬停在父div上 像这样:

    $('.outer, .inner').on('mouseenter', function(e){
    
      $(this).addClass('hover');
      $(this).parent(".outer").removeClass('hover');
    
    }).on('mouseleave', function(e){
    
      $(this).removeClass('hover');
      $(this).parent(".outer").addClass('hover');
    
    });
    

    我觉得这有点像 hack,可以通过更具体的选择器来改进,而不是只为 .outer 和 .inner 创建一个函数

    示例:http://codepen.io/anon/pen/KzILE/

    【讨论】:

    • 这样做的问题是,当离开内部 div 时,外部不会改变颜色,但是当 .inner 离开时,可以通过另一个事件来解决。
    • 这是我目前正在使用的解决方法(我实际上循环遍历所有元素的祖先,删除每个元素的悬停类 - 在我的应用程序中 .outer 不是 @ 的直接父级987654324@)。我想知道是否有一种不那么骇人听闻的方法。
    • 抱歉,我输入回复时没有看到 :-)
    • @dangerDAN 如果是这样的话,我认为可以使用更明确的选择器/类。而不是使用通用 .parent() 通过选择器过滤它
    猜你喜欢
    • 2016-05-17
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2011-07-20
    相关资源
    最近更新 更多