Waypoints - 动画触发两次

Waypoints - Animation firing twice

好的,所以我正在进行一个我参与的项目。该问题包含 hover.css 和 waypoints.

我的问题是我有一个按钮使用 hover.css 作为按钮悬停动画。该按钮还使用 waypoints 在到达视口时进行动画处理。一切正常,加载正常,然后当我将鼠标悬停时,它的动画效果很好。问题是当我将鼠标悬停在路点动画上时第二次触发。我不能,任何帮助将不胜感激。

按钮HTML:

<div style="width:100%;" class="vert-stack-right"><a href="" class="in_from_left hvr-buzz-out animate_start" target="" title="">My Button</a></div>

悬停Css

/* Buzz Out */
@-webkit-keyframes hvr-buzz-out {
  10% {
    -webkit-transform: translateX(3px) rotate(2deg);
    transform: translateX(3px) rotate(2deg);
  }

  20% {
    -webkit-transform: translateX(-3px) rotate(-2deg);
    transform: translateX(-3px) rotate(-2deg);
  }

  30% {
    -webkit-transform: translateX(3px) rotate(2deg);
    transform: translateX(3px) rotate(2deg);
  }

  40% {
    -webkit-transform: translateX(-3px) rotate(-2deg);
    transform: translateX(-3px) rotate(-2deg);
  }

  50% {
    -webkit-transform: translateX(2px) rotate(1deg);
    transform: translateX(2px) rotate(1deg);
  }

  60% {
    -webkit-transform: translateX(-2px) rotate(-1deg);
    transform: translateX(-2px) rotate(-1deg);
  }

  70% {
    -webkit-transform: translateX(2px) rotate(1deg);
    transform: translateX(2px) rotate(1deg);
  }

  80% {
    -webkit-transform: translateX(-2px) rotate(-1deg);
    transform: translateX(-2px) rotate(-1deg);
  }

  90% {
    -webkit-transform: translateX(1px) rotate(0);
    transform: translateX(1px) rotate(0);
  }

  100% {
    -webkit-transform: translateX(-1px) rotate(0);
    transform: translateX(-1px) rotate(0);
  }
}

@keyframes hvr-buzz-out {
  10% {
    -webkit-transform: translateX(3px) rotate(2deg);
    transform: translateX(3px) rotate(2deg);
  }

  20% {
    -webkit-transform: translateX(-3px) rotate(-2deg);
    transform: translateX(-3px) rotate(-2deg);
  }

  30% {
    -webkit-transform: translateX(3px) rotate(2deg);
    transform: translateX(3px) rotate(2deg);
  }

  40% {
    -webkit-transform: translateX(-3px) rotate(-2deg);
    transform: translateX(-3px) rotate(-2deg);
  }

  50% {
    -webkit-transform: translateX(2px) rotate(1deg);
    transform: translateX(2px) rotate(1deg);
  }

  60% {
    -webkit-transform: translateX(-2px) rotate(-1deg);
    transform: translateX(-2px) rotate(-1deg);
  }

  70% {
    -webkit-transform: translateX(2px) rotate(1deg);
    transform: translateX(2px) rotate(1deg);
  }

  80% {
    -webkit-transform: translateX(-2px) rotate(-1deg);
    transform: translateX(-2px) rotate(-1deg);
  }

  90% {
    -webkit-transform: translateX(1px) rotate(0);
    transform: translateX(1px) rotate(0);
  }

  100% {
    -webkit-transform: translateX(-1px) rotate(0);
    transform: translateX(-1px) rotate(0);
  }
}

.hvr-buzz-out {
  display: inline-block;
  vertical-align: middle;
  -webkit-transform: translateZ(0);
  transform: translateZ(0);
  box-shadow: 0 0 1px rgba(0, 0, 0, 0);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
  -moz-osx-font-smoothing: grayscale;
}
.hvr-buzz-out:hover, .hvr-buzz-out:focus, .hvr-buzz-out:active {
  -webkit-animation-name: hvr-buzz-out;
  animation-name: hvr-buzz-out;
  -webkit-animation-duration: 0.75s;
  animation-duration: 0.75s;
  -webkit-animation-timing-function: linear;
  animation-timing-function: linear;
  -webkit-animation-iteration-count: 1;
  animation-iteration-count: 1;
}

我知道我使用的是旧版本的 waypoints,因为我知道现在已为 this.destroy() 删除了 triggerOnce。我已经尝试进行更新,但这是我没有做的项目的一部分,而且我无论如何都不是 jQuery wiz。因此,如果有人对如何更新代码以使用销毁有建议,请不要犹豫给我业务。

Waypoints inti JS

jQuery(document).ready(function () {
    "use strict";
    animation_init();
});

function animation_init() {
    jQuery(".in_from_left").waypoint(function () {
        if (!jQuery(this).hasClass("animate_start")) {
            var e = jQuery(this);
            setTimeout(function () {
                e.addClass("animate_start")
            }, 20)
        }
    }, {
        offset: "85%",
        triggerOnce: !0
    })
}

Waypoints动画Css

/* global */
.in_from_left {
  opacity: 0
}

/* animate from left */
@keyframes animate_left {
  from {
    opacity: 0;
    transform: translateX(-100px)
  }
  to {
    opacity: 1;
    transform: translateX(0)
  }
}
@-webkit-keyframes animate_left {
  from {
    opacity: 0;
    -webkit-transform: translateX(-100px)
  }
  to {
    opacity: 1;
    -webkit-transform: translateX(0)
  }
}
.in_from_left.animate_start {
  -webkit-animation: 1.0s cubic-bezier(1,0,0,1) 0s normal backwards 1 animate_left;
  animation: 1.0s cubic-bezier(1,0,0,1) 0s normal backwards 1 animate_left;
  opacity: 1
}

所以回顾一下。一切正常,直到我将鼠标悬停在按钮上。当我执行 waypoints 动画时,它会像在初始加载时一样第二次触发,我们不希望这样。我的一部分感觉它可能与 css 相关。在过去的一天里,我一直在看着它,但没有运气。正如我所说,非常感谢您的帮助。

干杯!

以下不是完美的答案。您必须获得适合您需求的概念。动画再次触发的原因是 CSS 默认情况下是这样工作的。您可以使用 JS 修复该问题(检查 similar question/answer here。)

整个想法是添加 in_from_left class 但在动画完成后也将其删除。这样它就不会在你 "hover out".

之后再次触发

Here's a demo

$(document).ready(function () {
    $('.my-link').addClass('in_from_left').one('webkitAnimationEnd oanimationend msAnimationEnd animationend',function(e) {
        $(this).removeClass('in_from_left');
    });
    animation_init();
});

function animation_init() {
    $(".my-link").waypoint(function () {
      console.log($(this.element).parent().index());
      var el = $(this.element)
        if (!el.hasClass("animate_start")) {

            setTimeout(function () {
                el.addClass("animate_start").one('webkitAnimationEnd oanimationend msAnimationEnd animationend',function(e) {
                    $(this).removeClass('animate_start');
                });
            }, 20)
        }
    }, {
        offset: "50%",
        //triggerOnce: !0
    })
}

请记住,我已经更改了很多代码以使用此 jsbin。 确保你也检查了 CSS。您可能不需要 animate_startin_from_left