如何在多个 Greensock 时间线中嵌套一个 Greensock 时间线?

How do I nest a Greensock timeline in multiple Greensock timelines?

我正在尝试让一个时间线成为 greensock 中多个时间线的一部分。我想我需要做的是一个元素在两种情况下都需要动画,但在每种情况下都需要或另一个元素需要动画。

这是我目前所拥有的

var tl1 = new TimelineMax()
tl1.to(document.getElementById("one"), 0.5, { x: 10 })

var tl2 = new TimelineMax({ paused: true })

tl2.add(tl1)
tl2.to(document.getElementById("two"), 0.5, { x: 10 })

var tl3 = new TimelineMax({ paused: true })

tl3.add(tl1)
tl3.to(document.getElementById("three"), 0.5, { x: 10 })

tl2.play()
#one, #two, #three {
  width: 10px;
  height: 10px;
}

#one {
  background-color: hsl(0,70%,50%);
}
#two {
  background-color: hsl(100,70%,50%);
}
#three {
  background-color: hsl(200,70%,50%);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.5/TweenMax.min.js"></script>
<div id="one"></div>
<div id="two"></div>
<div id="three"></div>

也许有更好的方法来实现这个...

提前致谢

有很多方法可以做到这一点,但我首先要指出几点:

  1. 动画(补间动画或时间轴)只能有 一个 父级。在这个意义上,可以把它想象成一个 DOM 节点。所以你不能将 tl1 添加到 tl2 tl3。当您将它添加()到一个时,它将从另一个中删除。
  2. 时间轴的暂停状态即使嵌套在另一个时间轴中也是如此。例如,如果您暂停 tl2,然后将其放入 tl3,然后 tl3.play(),您将看不到 tl2 播放,因为它仍处于暂停状态。
  3. 您可以只传入选择器文本作为目标,如果未加载 jQuery,GSAP 将使用 document.querySelectorAll()。因此,您可以只使用“#one”而不是 document.getElementById("one")(尽管用其他方式也完全可以)。
  4. 您不必首先暂停您的时间线然后立即调用 play() - 它们直到下一个 "tick" 才会呈现,所以暂停然后在同一个时间点播放是一种浪费。它不是 "wrong" 并且它不会改变任何东西的外观 - 它只是额外不必要的代码。

如果您的目标是让#one 在两个时间轴中从 x:0 到 x:10 设置动画,则您不必创建嵌套时间轴并尝试重复使用。相反,您可以将一个简单的 fromTo() 补间放入两者中。喜欢:

tl2.fromTo("#one", 0.5, {x:0}, {x:10})
   .fromTo("#two", 0.5, {x:0}, {x:10});
tl3.fromTo("#one", 0.5, {x:0}, {x:10})
   .fromTo("#three", 0.5, {x:0}, {x:10});

如果您确实想使用时间轴和嵌套,您仍然可以通过一种棘手的方式来实现 - 您可以创建 tl1(您想要重新使用的那个)作为最初暂停的,然后使用 tweenFromTo()从两个时间轴基本动画其播放头的方法。 tweenFromTo() 简单地吐出一个控制播放头的补间,因此您可以将该补间嵌套在另一个时间轴中(并创建多个执行相同操作的补间)。喜欢:

tl2.add(tl1.tweenFromTo(0, tl1.duration()));
tl3.add(tl1.tweenFromTo(0, tl1.duration()));

有帮助吗?