You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AnimeJS随机颜色仅初始化生效,循环不更新的解决方法问询

解决AnimeJS循环时随机颜色不更新的问题

嘿,这个问题我太熟悉了!AnimeJS 的属性回调函数(就是你写在 backgroundColor 后面的那个函数)只会在动画第一次初始化的时候执行一次,之后循环播放时不会再重新调用,所以颜色就固定住了,不会随循环变化。

问题原因

当你设置 loop: truedirection: 'alternate' 时,AnimeJS 会重复播放已初始化好的动画序列,不会重新执行那些生成属性值的回调,所以随机颜色只会生成一次,循环时自然不会变更。

解决方案

我们可以把随机颜色的逻辑抽成单独的函数,然后通过监听动画的 loopComplete 事件(每次循环完成时触发),动态更新动画的背景色目标值。这样每次循环都会生成新的随机颜色,完美解决问题。

步骤1:抽离随机颜色生成函数

function getRandomColor() {
  let letters = "3456789ABCDEF"; 
  let color = '#'; 
  for (let i = 0; i < 6; i++) 
    color += letters[Math.floor(Math.random() * 13)]; 
  return color;
}

步骤2:创建动画实例并监听循环事件

// 创建动画实例,方便后续控制
const textAnimation = anime({
  targets: '.jumperTexts',
  scale: [{ value: [0.5, 1], easing: 'easeInOutBounce', duration: 800 }],
  backgroundColor: getRandomColor(), // 初始随机颜色
  width: ['80px', '80px'],
  height: ['80px', '80px'],
  borderRadius: ['50%', '50%'],
  duration: 1200,
  endDelay: 1000,
  delay: anime.stagger(50),
  direction: 'alternate',
  loop: true,
  // 每次循环完成时触发这个回调,更新目标颜色
  loopComplete: function(anim) {
    anim.animations.forEach(animItem => {
      if (animItem.property === 'backgroundColor') {
        // 设置下一次动画的目标颜色为新的随机色
        animItem.toValue = getRandomColor();
      }
    });
  }
});

进阶:方向切换时更新颜色

如果你希望在每次动画方向切换(比如从正向变反向)时都更换颜色,可以改用 change 事件监听:

const textAnimation = anime({
  // ...保持其他配置不变
  change: function(anim) {
    // 检测到方向切换时更新颜色
    if (anim.direction !== anim.previousDirection) {
      anim.animations.forEach(animItem => {
        if (animItem.property === 'backgroundColor') {
          animItem.toValue = getRandomColor();
        }
      });
    }
  }
});

这样修改后,每次动画循环(或方向切换)时,都会重新生成随机颜色,背景色的过渡效果也会随着循环不断变化,完全符合你的预期啦!

内容的提问来源于stack exchange,提问作者Mehdi Qanavatian

火山引擎 最新活动