Trong chương trước, chúng ta đã sử dụng các hiệu ứng chuyển tiếp trì hoãn để tạo hiệu ứng về chuyển động khi các phần tử di chuyển từ một danh sách công việc sang danh sách khác.
Để hoàn tất hiệu ứng, chúng ta cũng cần áp dụng chuyển động cho các phần tử không tham gia chuyển tiếp. Để làm điều này, chúng ta sử dụng chỉ thị animate.
Đầu tiên, nhập hàm flip — flip viết tắt của 'First, Last, Invert, Play' — từ svelte/animate vào TodoList.svelte:
<script>
import { flip } from 'svelte/animate';
import { send, receive } from './transition.js';
export let store;
export let done;
</script>Sau đó thêm nó vào các phần tử
<li
class:done
in:receive={{ key: todo.id }}
out:send={{ key: todo.id }}
animate:flip
>Chuyển động hơi chậm trong trường hợp này, nên chúng ta có thể thêm một tham số duration:
<li
class:done
in:receive={{ key: todo.id }}
out:send={{ key: todo.id }}
animate:flip={{ duration: 200 }}
>
durationcũng có thể là một hàmd => milliseconds, trong đódlà số pixel mà phần tử phải di chuyển
Lưu ý rằng tất cả các hiệu ứng chuyển tiếp và chuyển động đều được áp dụng bằng CSS, chứ không phải JavaScript, có nghĩa là chúng sẽ không chặn (hoặc bị chặn bởi) luồng chính.
<script>
import { send, receive } from './transition.js';export let store;
export let done;
</script>
<ul class="todos">
{#each $store.filter((todo) => todo.done === done) as todo (todo.id)}<li
class:done
in:receive={{ key: todo.id }} out:send={{ key: todo.id }}>
<label>
<input
type="checkbox"
checked={todo.done} on:change={(e) => store.mark(todo, e.currentTarget.checked)}/>
<span>{todo.description}</span> <button on:click={() => store.remove(todo)} aria-label="Remove"></button></label>
</li>
{/each}</ul>
<style>
label {width: 100%;
height: 100%;
display: flex;
}
span {flex: 1;
}
button {background-image: url(./remove.svg);
}
</style>