You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现JS往复循环动画:从-150到150平滑反向过渡?

实现平滑往复的scale动画效果

嘿,我明白你想要的那种无缝往复动画效果了——原来的模运算逻辑确实会导致生硬的跳转,因为它没办法自动反向遍历数值区间。咱们来改一改代码,实现你要的-150→0→150→0→-150→0的平滑循环!

问题根源

你原来的代码用(liquifyVal + 1) % 150来更新数值,当liquifyVal到149时,加1变成150,模150直接回到0,跳过了从150往回降到0的过程,这就导致了动画的生硬跳转。

解决方案:用方向变量控制往复

我们可以引入一个direction变量,控制数值的增减方向:当数值到达150时,切换为递减;到达-150时,切换为递增。这样就能形成平滑的往复运动,完全避免跳转。

改进后的代码

JavaScript部分

let liquifyVal = -150;
let direction = 1; // 1表示递增,-1表示递减

window.setInterval(function() {
  liquifyVal += direction;
  
  // 到达边界时切换方向
  if (liquifyVal === 150) {
    direction = -1;
  } else if (liquifyVal === -150) {
    direction = 1;
  }
  
  document.getElementById('liquid').setAttribute('scale', liquifyVal);
}, 25);

完整代码整合

<h1> Hello </h1>
<svg id="svgeffects">
  <defs>
    <filter class="safari_only" id="liquify">
      <feTurbulence baseFrequency="0.015" numOctaves="2" result="warp" type="fractalNoise"></feTurbulence>
      <feDisplacementMap id="liquid" in="SourceGraphic" in2="warp" scale="150" xChannelSelector="R" yChannelSelector="B"></feDisplacementMap>
    </filter>
  </defs>
</svg>

<style>
h1 {
  filter: url("#liquify");
  font-size: 100px;
}
</style>

<script>
let liquifyVal = -150;
let direction = 1;

window.setInterval(function() {
  liquifyVal += direction;
  
  if (liquifyVal === 150) {
    direction = -1;
  } else if (liquifyVal === -150) {
    direction = 1;
  }
  
  document.getElementById('liquid').setAttribute('scale', liquifyVal);
}, 25);
</script>

更流畅的优化:使用requestAnimationFrame

如果你想让动画更流畅(避免setInterval可能出现的掉帧问题),可以用requestAnimationFrame代替setInterval,它会在浏览器的每一帧渲染前执行回调,动画效果更丝滑:

let liquifyVal = -150;
let direction = 1;

function updateLiquify() {
  liquifyVal += direction;
  
  if (liquifyVal === 150) {
    direction = -1;
  } else if (liquifyVal === -150) {
    direction = 1;
  }
  
  document.getElementById('liquid').setAttribute('scale', liquifyVal);
  requestAnimationFrame(updateLiquify);
}

// 启动动画
requestAnimationFrame(updateLiquify);

把上面的JS代码替换原来的setInterval部分即可,效果会更平滑。

内容的提问来源于stack exchange,提问作者Olly F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:23:31