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

使用Vivus.js与GSAP实现初始隐藏元素动画时SVG提前显示的问题

解决SVG在Vivus绘制前提前可见的问题

我帮你梳理下问题的核心和对应的解决思路,你遇到的情况主要是SVG初始状态没隐藏、动画逻辑没同步这两个关键点没处理好:

1. 先给SVG设置初始隐藏状态

这是最容易遗漏的基础步骤——如果SVG在页面加载时就默认可见,那Vivus启动绘制前它自然会提前显示出来。建议用CSS直接设置初始状态(用visibility而不是display,因为Vivus需要元素存在才能操作路径):

.graphic1 {
  visibility: hidden;
  opacity: 0;
}

2. 修正代码里的变量错误

看你的代码,introFadeIn函数里定义的变量是graphic1,但动画里用的是graphic1Elem,这会导致淡入动画根本没作用到SVG上,等于白写了!得把变量名统一:

function introFadeIn() {
  var graphic1 = $(".graphic1");
  tlIntrofadeIn = new TimelineLite({ onComplete: gr1Animate });
  tlIntrofadeIn.from(graphic1, 1, { autoAlpha: 0 }); // 这里改成graphic1
}

3. 让Vivus绘制和GSAP淡入同步执行

你现在的逻辑是「淡入完成→启动绘制」,但想要的是「绘制同时淡入」,所以不需要把Vivus放在onComplete里,而是让两个动画并行启动。调整后可以实现同步效果:

function introFadeIn() {
  var graphic1 = $(".graphic1");
  tlIntrofadeIn = new TimelineLite();
  
  // 先把SVG设为可见(保证Vivus能操作),同时启动淡入动画
  tlIntrofadeIn.set(graphic1, { visibility: "visible" })
               .from(graphic1, 1, { autoAlpha: 0 });
  
  // 同步启动Vivus绘制,调整duration和淡入时长匹配
  new Vivus("gr1", {
    type: "delayed",
    duration: 100 // 这个值单位是帧,100大约对应1秒,和你的淡入时间对齐
  });
}

4. 简化Vivus的回调设置

之前Vivus回调里的visibility设置已经没必要了(我们通过GSAP的set已经处理了),去掉后代码更简洁,也避免冲突。

完整调整后的代码示例

function initialAnimation() { 
  var introText = $(".text-intro");
  tlIntro = new TimelineLite({ onComplete: introFadeIn }); 
  tlIntro.from(introText, 1, { autoAlpha: 0 }); 
} 

function introFadeIn() {
  var graphic1 = $(".graphic1");
  tlIntrofadeIn = new TimelineLite();
  
  // 显示SVG并启动淡入
  tlIntrofadeIn.set(graphic1, { visibility: "visible" })
               .from(graphic1, 1, { autoAlpha: 0 });
  
  // 同步启动SVG绘制动画
  new Vivus("gr1", {
    type: "delayed",
    duration: 100
  });
}

initialAnimation();

搭配CSS初始隐藏:

.graphic1 {
  visibility: hidden;
  opacity: 0;
}

这样调整后,SVG会在文本淡入完成后,同时开始淡入和绘制动画,完全符合你的预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:30:47