Модуль svelte/animate предназначен для создания анимаций
при изменении DOM-элементов после их появления или перемещения в
документе. В отличие от svelte/transition, который
применяется при монтировании или размонтировании элементов,
svelte/animate фокусируется на анимации между состояниями
уже существующих элементов.
flipflip (First-Last Invert Play) — основная функция модуля
svelte/animate. Она позволяет анимировать перемещения
элементов при изменении их позиции в DOM, используя технику, которая
минимизирует визуальные скачки.
Синтаксис:
import { flip } from 'svelte/animate';
<div animate:flip>
{#each items as item (item.id)}
<div>{item.text}</div>
{/each}
</div>
Пояснения:
animate:flip применяется к контейнеру, в
котором изменяются позиции элементов.(item.id) — ключ, необходимый для отслеживания
идентичности элементов при рендеринге списка.flip вычисляет разницу между предыдущим и
текущим положением элементов и плавно анимирует их перемещение.Настройки flip:
animate:flip={{ duration: 400, easing: cubicOut }}
duration — длительность анимации в миллисекундах.easing — функция сглаживания движения
(linear, cubicIn, cubicOut и
т.д.).each и
ключамиЧтобы анимация перемещений работала корректно, каждый элемент списка должен иметь уникальный ключ:
{#each todos as todo (todo.id)}
<div animate:flip>{todo.text}</div>
{/each}
Если ключи отсутствуют, Svelte не сможет точно сопоставить элементы между рендерами, что приведёт к нежелательной анимации.
flip поддерживает расширенные опции для управления
движением элементов:
animate:flip={{
duration: 500,
easing: cubicOut,
delay: 100,
x: true, // анимация по горизонтали
y: true, // анимация по вертикали
opacity: 0.5 // изменение прозрачности при движении
}}
delay — задержка перед началом анимации.x и y — включение/отключение анимации по
соответствующей оси.opacity — задаёт степень изменения прозрачности при
перемещении.Эти параметры позволяют создавать сложные и естественные анимации перемещения, имитирующие физику объектов.
<script>
import { flip } from 'svelte/animate';
let items = ['A', 'B', 'C', 'D'];
function shuffle() {
items = items.sort(() => Math.random() - 0.5);
}
</script>
<button on:click={shuffle}>Перемешать</button>
<div animate:flip={{ duration: 600, easing: cubicOut }}>
{#each items as item (item)}
<div class="box">{item}</div>
{/each}
</div>
<style>
.box {
width: 50px;
height: 50px;
background: #3498db;
color: white;
display: inline-flex;
align-items: center;
justify-content: center;
margin: 5px;
border-radius: 4px;
}
</style>
Элементы плавно смещаются при каждом нажатии на кнопку, сохраняя визуальную последовательность.
flipМодуль svelte/animate совместим с динамическими
списками, где элементы добавляются и удаляются. В сочетании с
svelte/transition можно добиться эффектного движения и
плавного исчезновения:
<script>
import { flip } from 'svelte/animate';
import { fade } from 'svelte/transition';
let todos = [
{ id: 1, text: 'Купить хлеб' },
{ id: 2, text: 'Позвонить маме' },
{ id: 3, text: 'Сделать задачу' }
];
function removeTodo(id) {
todos = todos.filter(todo => todo.id !== id);
}
</script>
<div animate:flip>
{#each todos as todo (todo.id)}
<div transition:fade>{{todo.text}}
<button on:click={() => removeTodo(todo.id)}>x</button>
</div>
{/each}
</div>
При удалении элемента происходит плавное исчезновение
(fade) и одновременная анимация перемещения оставшихся
элементов (flip).
flip мог правильно анимировать перемещения.transition, когда нужно анимировать
вход/выход элементов.flip для сложных интерфейсов: таблицы,
карточки, канбан-доски, динамические списки с фильтрацией и
сортировкой.flip оптимизирован для работы с динамическими
списками любых размеров. Анимации выполняются через
transform и opacity, что позволяет
использовать GPU-ускорение. В отличие от ручного вычисления координат,
встроенный механизм автоматически обрабатывает:
Модуль svelte/animate является мощным инструментом для
создания естественных и плавных интерфейсных анимаций без сложных
вычислений. Правильное использование flip и комбинаций с
transition позволяет реализовать высококачественные
анимации списков, карточек и других динамических компонентов.