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

使用TweenMax的加载点动画再次显示后失真问题求助

修复TweenMax加载点动画二次显示失真问题

你的问题根源在于每次调用showDots()时都会添加新的无限循环动画,但之前的动画没有被清除,导致多个动画叠加作用在同一个点元素上,第二次显示时元素的位置、缩放等属性被多个动画同时修改,自然就会出现拥挤、失真的情况。

下面是具体的修复方案:

核心修改点

  • 存储动画实例,方便后续清除
  • 在隐藏动画时主动终止所有相关TweenMax动画
  • 每次显示动画前确保旧动画已被清除

修改后的JavaScript代码

// 全局存储动画实例,方便后续清除
let dotToAnimation;
let dotFromAnimation;

function hideDots(){ 
  const dots = document.querySelector('.dotContainer'); 
  // 先清除所有相关动画,避免残留
  if (dotToAnimation) dotToAnimation.kill();
  if (dotFromAnimation) dotFromAnimation.kill();
  
  dots.style.opacity = 0; 
  dots.addEventListener('transitionend', hideDotsAnime); 
  function hideDotsAnime() { 
    dots.style.display = "none"; 
    dots.removeEventListener("transitionend", hideDotsAnime); 
  } 
} 

function showDots(){ 
  // 先清除可能存在的旧动画,确保新动画是唯一的
  if (dotToAnimation) dotToAnimation.kill();
  if (dotFromAnimation) dotFromAnimation.kill();
  
  // 存储新的动画实例
  dotToAnimation = TweenMax.staggerTo(".dots",2,{
    x:220,
    backgroundColor:'white',
    repeat:-1,
    ease:SlowMo.ease.config(0.5,0.4,false)
  },0.4); 
  
  dotFromAnimation = TweenMax.staggerFrom(".dots",2,{
    opacity:0,
    scale:0.7,
    repeat:-1,
    ease:SlowMo.ease.config(0.5,0.4,true)
  },0.4); 
  
  const dots = document.querySelector('.dotContainer'); 
  dots.style.display = "block"; 
  setTimeout(() => dots.style.opacity = 0.75, 200); 
} 

setTimeout(() => showDots(), 2500); 
setTimeout(() => hideDots(), 5900); 
setTimeout(() => showDots(), 10000);

CSS和HTML代码保持不变

body{ background-color: black } 
.dotContainer { 
  background-color: transparent; 
  position: absolute; 
  top: 60vh; 
  left: 42vw; 
  transform: translate(-50%,-50%); 
  display: none; 
  transition: all 0.5s linear; 
  z-index: 11; 
} 
.dots { 
  position: absolute; 
  width: 1em; 
  height: 1em; 
  border-radius: 50%; 
  background-color: #e2daeb; 
  opacity: 0.8; 
}
<script SRC="https://langfox.ir/english/TweenMax.min.js" TYPE="text/javascript"></script> 
<div class="dotContainer"> 
  <div class="dots"></div> 
  <div class="dots"></div> 
  <div class="dots"></div> 
  <div class="dots"></div> 
  <div class="dots"></div> 
</div>

为什么这样修复?

TweenMax的repeat:-1会创建无限循环的动画,这些动画会一直运行直到你主动调用.kill()方法终止它们。之前的代码中,隐藏加载点时只是修改了DOM的display和opacity,但后台的动画还在持续修改元素的x位置、缩放等属性。当你第二次调用showDots()时,又添加了新的动画,多个动画叠加就会导致元素的属性计算混乱,出现你看到的拥挤、失真现象。

通过存储动画实例并在合适的时机kill它们,就能确保每次显示加载点时,只有一组动画在作用,从而保证动画的流畅性和正确性。

内容的提问来源于stack exchange,提问作者Sara Ree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:43:03