【问题标题】:Hover(), mouseenter(), mouseover(), etc jumping back and forthHover()、mouseenter()、mouseover() 等来回跳跃
【发布时间】:2016-03-09 14:43:29
【问题描述】:

当您将鼠标悬停在图像上时,我试图制造一种情况,然后它将隐藏图像并显示另一个图像。当你悬停时,反之亦然。

我尝试过使用我想到的各种悬停效果,例如 mouseenter、mouseover、hover 等。

它们都会导致相同的问题。如果我非常坚定而快速地将光标拖到行动领域,那么它将给我想要的效果。但是,如果我慢慢地将光标拖入动作区域,那么它将在图像之间跳转几次,然后最终停在正确的图像上。

这看起来很不专业,我希望它在做这个动作时更加有结果,这样无论我做的慢还是快,它都只会跳一次。

这是我的脚本:

$("#DenmarkMap").hide();
$("#InfoBadge1").hover(function(){
    $("#InfoLogo").hide("puff");
    $("#DenmarkMap").show("puff");
}, function(){
    $("#DenmarkMap").hide("puff");
    $("#InfoLogo").show("puff");
});

这是一个不起作用的小提琴 https://jsfiddle.net/ydeLvxx2/

希望你们能帮我解决这个问题。

【问题讨论】:

  • 你的 jsfiddle 没有包含 jQuery,这里有一个固定版本:jsfiddle.net/ydeLvxx2/1。但是,仍然很难弄清楚您要做什么。
  • 是的,我可以理解,因为那个小提琴可以按我的意愿工作。你需要想象当我将鼠标悬停在最后的图像上时,它会在图像之间跳转几次停止。在小提琴中,它只是替换图像而没有来回跳跃。
  • 看看stop():api.jquery.com/stop

标签: javascript jquery mouseover jquery-hover mouseenter


【解决方案1】:

这是一个纯 Javascript 解决方案(不需要 jQuery)

https://jsfiddle.net/uL0hpxbu/ 更新:带有 CSS3 “粉扑”效果的版本:https://jsfiddle.net/230ta4tk/2/

下面是主要的script 的样子:

    var InfoBadge1 = document.getElementById("InfoBadge1");
    var InfoLogo = document.getElementById("InfoLogo");
    var DenmarkMap = document.getElementById("DenmarkMap");

    InfoBadge1.addEventListener("mouseover", function() {
      InfoLogo.classList.toggle("puff");
      DenmarkMap.classList.toggle("puff");
    });
    InfoBadge1.addEventListener("mouseout", function() {
      InfoLogo.classList.toggle("puff");
      DenmarkMap.classList.toggle("puff");
    });

和CSS部分(只是一个例子,你可以改变它)

    #DenmarkMap {
      position: absolute;
      left: 0;
      top: 0;
      transition: .5s all;
    }
    #InfoLogo {
      position: absolute;
      left: 250px;
      top: 120px;
      transition: .5s all;
    }
    #InfoBadge1 {
        position: absolute;
        left: 0px;
        top: 120px;
    }
    .puff {
      transform: scale(1.2);
      opacity: 0;
    }

和 HTML:

<img id="InfoBadge1" src="http://dummyimage.com/200x100/803580/ffffff&text=InfoBadge1" alt="" />
<img id="InfoLogo" src="http://dummyimage.com/200x100/803580/ffffff&text=InfoLogo" alt="" />
<img id="DenmarkMap" class="puff" src="http://dummyimage.com/200x100/3c8036/ffffff&text=DenmarkMap" alt="" />

【讨论】:

  • 你错过了一件重要的事情,那就是“粉扑”效果。你会如何在你的代码中实现它?
  • @Nulle 什么是粉扑效果?如果您的意思是某种淡入淡出,那么它可以使用 CSS3 轻松解决,这是一种可能的解决方案 jsfiddle.net/230ta4tk,它基本上是在 css 中将 display:none 替换为 opacity: 0 并添加 transition: .5s all; 然后使用 @ Javascript 中的 987654333@ 或 .style.opacity = 1;
  • 它是 jquery。注意我写的是 show("puff");这样就会产生动画效果。 api.jqueryui.com/puff-effect
  • 这里是有“粉扑”效果的解决方案jsfiddle.net/230ta4tk/3 让我知道它是否是最好的解决方案,然后我可以更新上面的主要代码。
  • 我们已经非常接近了。过渡明智的是它不再跳跃。所以这是一件好事。但是,我的 DenmarkMap 并未按预期受到影响。我可以猜想这与我的 css 样式有关。您能否尝试使用我关于#DenmarkMap 的css 代码,看看您是否可以让它继续工作?现在丹麦地图唯一发生的事情是它在鼠标悬停时被放大,然后在鼠标移出时再次缩小。
【解决方案2】:

您不应将悬停的mouseleave/mouseout 事件绑定到同一张图片,因为您只是将其隐藏

相反,考虑将hover 函数绑定到父 DOM 节点(例如 DIV):

<div id="images">
  <img id="InfoBadge1" src="./Photos/DenmarkInfoBadge.png"> 
  <img id="InfoLogo" src="./Photos/InfoLogo.png">
  <img id="DenmarkMap" src="./Photos/DenmarkMap.png">
</div>

你的javascript可以变成:

$("#DenmarkMap").hide();
$("#images").hover(function(){
    $("#InfoLogo").hide("puff");
    $("#DenmarkMap").show("puff");
}, function(){
    $("#DenmarkMap").hide("puff");
    $("#InfoLogo").show("puff");
});

【讨论】:

  • 很抱歉,但这给了我相同的结果。仍然来回出现故障。
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多