实际上,使用Svelte 有一个更简单的方法。说loading 是一个布尔值。当loading 为真时,动画应该会运行。然后我们有例如一个 SVG line 应该上下跳跃。
<line id="line-0" class="{animateClass ? 'animate' : ''}" x1="0" y1="0" x2="0" y2="20"/>
我们添加以下 CSS。
line {
stroke: black;
stroke-width: 3px;
transition: all 0.8s ease-in-out;
}
line.animate {
animation-direction: alternate;
transition: all 0.8s ease-in-out;
transform: translateY(-50%);
}
如您所见,我们使用单次运行过渡。 animate 类存在时的跳跃过渡和animate 类消失时的下降过渡。
现在,我们需要一些 JavaScript 来控制起伏。
let animateClass = false;
let intervalId;
function animateLine(loading) {
if (loading) {
if (!intervalId) {
animateClass = true;
intervalId = setInterval(() => animateClass = !animateClass, 800);
}
} else {
clearInterval(intervalId);
intervalId = null;
animateClass = false;
}
}
$: animateLine(loading); // call the function every time loading is updated
每次loading 更改时,都会调用animateLine 函数并在跳跃和下降转换之间交替。这也保证了动画的平稳停止。此外,动画本身是纯 CSS,因此非常高效。
请注意,setInterval 函数每 800 毫秒处理一次回调执行。这正是 CSS 过渡的长度。
当然,您也可以使用 Vanilla JS 来实现这一点。但是,Svelte 提供了一些用于反应性的语法糖。
另见blog post。