Svelte transitions/animations 是用 CSS 还是 JS 完成的?

Are Svelte transitions/animations done with CSS or JS?

我正在检查 Svelte,我发现了很多我期望的开箱即用的东西。

有一件事让我有点吃惊,过渡和动画工具的数量,尤其是 custom transitions 的工具,我无法从它们的语法中完全判断这些是否是编写 [= 的函数19=],或者如果它们是直接使用类似 CSS 的语法操作样式的函数。

生成的动画 CSS 是否仅?

简短回答:CSS。

较长的答案:调用转换函数时,它 returns 具有转换对象的对象,该对象必须包含 css 方法、tick 方法或两者. tick 方法很简单——它在每一帧调用(基本上使用 requestAnimationFrame)直到转换完成,允许你做一些只用 CSS 做不到的事情,比如 typewriter effect.

css 方法的工作方式不同。假设您有一个简单的淡入淡出过渡 returns 一个像这样的函数:

css: t => `opacity: ${t}`

(这几乎就是 built-in fade transition does 的内容。)在 转换开始之前,此函数将使用不同的 t 值多次调用— 次数取决于过渡的持续时间 — 这样就生成了一组关键帧:

keyframes = [
  '0% { opacity: 0 }',
  '10% { opacity: 0.1 }',
  '20% { opacity: 0.2 }',
  // ...
];

然后将这些关键帧连接在一起形成 CSS 动画并应用于元素。

在这个简单的例子中,它可能看起来 over-engineered — 毕竟,我们可以从 0% { opacity: 0 }100% { opacity: 1 }。但它使我们能够使用 CSS 动画中通常不可用的缓动函数来构建 custom transitions,所有这些都无需诉诸 JavaScript 中的操纵样式(这必须在主线程上进行,造成常见的卡顿来源。)