Actions

animate:name
animate:name={params}
animation = (node: HTMLElement, { from: DOMRect, to: DOMRect } , params: any) => {
    delay?: number,
    duration?: number,
    easing?: (t: number) => number,
    css?: (t: number, u: number) => string,
    tick?: (t: number, u: number) => void
}
DOMRect {
    bottom: number,
    height: number,
    ​​left: number,
    right: number,
    ​top: number,
    width: number,
    x: number,
    y:number
}

当一个通过 each 生成的块发生重排的时候,Animation 才会执行。当元素被删除的时候动画不会执行,只有 each 的列表数据发生重排的时候才会执行 Animation 。且animate: 指令只能在each块的直接子元素上。

<!-- When `list` is reordered the animation will run-->
{#each list as item, index (item)}
    <li animate:flip>{item}</li>
{/each}

animate 可以是内置的 animation 方法或自定义的 animation 方法。

Animation参数

Actions 还有 transitions 一样,Animation 也有参数。

{#each list as item, index (item)}
    <li animate:flip="{{ delay: 500 }}">{item}</li>
{/each}

双大括号 `` 不是特殊的语法,只是一个在表达式标签中包含一个对象字面量

自定义Animation函数

<script>
    import { cubicOut } from 'svelte/easing';

    function whizz(node, { from, to }, params) {

        const dx = from.left - to.left;
        const dy = from.top - to.top;

        const d = Math.sqrt(dx * dx + dy * dy);

        return {
            delay: 0,
            duration: Math.sqrt(d) * 120,
            easing: cubicOut,
            css: (t, u) =>
                `transform: translate(${u * dx}px, ${u * dy}px) rotate(${t*360}deg);`
        };
    }
</script>

{#each list as item, index (item)}
    <div animate:whizz>{item}</div>
{/each}

Animations 可以是自定义的函数,函数的参数分别是 nodeanimation 对象、及一个任何格式的参数。animation 对象参数包含 fromto 属性,且都包含了能描述元素的物理几何位置 startend 的 DOMRect 属性。当列表数据发生重排,且 DOM 已经完成更新,from 属性表示的是元素在起始位置的 DOMRect,to 属性表示的是元素结束位置的 DOMRect。

如果返回的对象有 css 的方法,Svelte 会为这个元素创建并执行一个 css 的动画。

当缓动动画执行的时候,t0 变化到 1,且会被作为参数传入到css方法中,参数 u 等同于 1-t

在动画开始之前,animate 会被通过不同的参数 tu 反复的调用。

自定义的 animation 函数同样可以返回 tick 函数,在动画的执行过程中被调用,同样的也是以参数 tu

<script>
    import { cubicOut } from 'svelte/easing';

    function whizz(node, { from, to }, params) {

        const dx = from.left - to.left;
        const dy = from.top - to.top;

        const d = Math.sqrt(dx * dx + dy * dy);

        return {
        delay: 0,
        duration: Math.sqrt(d) * 120,
        easing: cubicOut,
        tick: (t, u) =>
            Object.assign(node.style, {
                color: t > 0.5 ? 'Pink' : 'Blue'
            });
    };
    }
</script>

{#each list as item, index (item)}
    <div animate:whizz>{item}</div>
{/each}

尽可能的使用 css 而不是 tick 函数,之所以这样做-是因为 css 动画可以在主线程上进行,防止在低端设备出现卡顿。

results matching ""

    No results matching ""