javascript - 我怎样才能让这个翻滚动画的一部分连续循环?

标签 javascript jquery animation lottie bodymovin

我有一个动画,我想将其用于具有以下基本状态的翻转效果:

  1. 休息:在第 0 帧和第 55 帧之间连续循环
  2. 鼠标输入:播放一次第 56 到 78 帧,然后在第 78 帧暂停
  3. 鼠标移开:播放一次第 79-95 帧,然后返回休息状态

除了静止状态下的连续循环外,我几乎可以正常工作。循环只播放一次,然后静止不动。我的代码如下:

代码笔:https://codepen.io/anon/pen/pBXKeN

var animationContainer = document.getElementById("animation-container");

var animation = lottie.loadAnimation({
    wrapper: document.getElementById("animation-wrapper"),
    renderer: "svg",
    loop: false,
    autoplay: false,
    prerender: true,
    animationData: animationData,
});

animation.addEventListener('DOMLoaded',resting);
animationContainer.addEventListener("mouseenter", hoverStart);
animationContainer.addEventListener("mouseleave", hoverEnd);

function resting() {
    animation.removeEventListener("complete", resting);
    console.log('resting');
    animation.playSegments([0, 55], true);
}

function hoverStart() {
    console.log('hover started');
    animationContainer.removeEventListener("mouseenter", hoverStart);
    animation.playSegments([56, 78], true);
    animationContainer.addEventListener("mouseleave", hoverEnd);
}

function hoverEnd() {
    console.log('hover ended');
    animationContainer.removeEventListener("mouseleave", hoverEnd);
    animation.playSegments([79, 95], true);
    animation.addEventListener("complete", resting);
    animationContainer.addEventListener("mouseenter", hoverStart);
}

我已经尝试将循环设置为 true,但这会导致所有 3 个状态循环,这不是 mouseenter 和 mouseleave 效果的预期效果。有没有办法让单个部分循环播放?

我也很乐意切换到 jQuery,如果它能让事情变得更简单的话。

最佳答案

通过将 loop 设置为 true、在 2 帧之间循环以获得“暂停”效果以及更密切地监视悬停状态的组合来解决。我确信这可以进一步改进,但在这一点上我很高兴它能正常工作。

更新代码笔:https://codepen.io/matt3/pen/NVxWYJ

var hover = false;

animationContainer.addEventListener("mouseenter", hoverStart);
animation.addEventListener('DOMLoaded',resting);

function resting() {
  console.log('resting. hover status: ' + hover);
  animation.removeEventListener("loopComplete", resting);
  animation.playSegments([0, 55], true);
}

function hoverStart() {
  console.log('hover started. hover status: ' + hover);
  animationContainer.removeEventListener("mouseenter", hoverStart);
  animation.playSegments([56, 78], true);
  animation.addEventListener("loopComplete", hoverPause);
}

function hoverPause() {
  console.log('hover paused. hover status: ' + hover);
  animation.removeEventListener("loopComplete", hoverPause);
  animationContainer.addEventListener("mouseleave", hoverEnd);
  animation.playSegments([77, 78], true);
  console.log('hover pause complete. hover status: ' + hover);
  if (!hover) {
    animation.addEventListener("loopComplete", hoverEnd);
  }
}

function hoverEnd() {
  console.log('hover ended. hover status: ' + hover);
  animationContainer.removeEventListener("mouseleave", hoverEnd);
  animation.removeEventListener("loopComplete", hoverEnd);
  animation.playSegments([79, 95], true);
  animation.addEventListener("loopComplete", resting);
  animationContainer.addEventListener("mouseenter", hoverStart);
}

animationContainer.onmouseout = function () {
    hover = false;
}
animationContainer.onmouseover = function () {
    hover = true;
}

关于javascript - 我怎样才能让这个翻滚动画的一部分连续循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55945432/

相关文章:

javascript - 全局上下文 - 检查未定义

javascript - 使用 'this' 的正确方法(jshint.com 已验证)分配给 var

javascript - 如何从 Chrome 开发工具中删除 "REMOVE"按钮?

jquery - 如何创建 DOM 节点作为对象?

c# - DoubleAnimation端如何添加EventHandler?

javascript - 自动将序列号添加到表格行

javascript - 离开网址时淡出页面(以及登陆时淡入)

javascript - 匿名函数中 undefined variable

javascript - setInterval 在另一个 setInterval 中随着时间的推移而加速

animation - react 原生音频动画