SwapAnimation — это модуль в библиотеке Shopify Draggable, предназначенный для плавной анимации элементов при их перестановке. Он реализует визуальный эффект «обмена местами» элементов списка, обеспечивая естественное и интуитивное восприятие интерфейса. Модуль особенно полезен для sortable-списков, сеток и карточек продуктов.
SwapAnimation работает на основе отслеживания начальных и конечных позиций элементов при событии drag:start и последующей анимации их перемещения до новых координат.
transform: translate3d) для обеспечения высокой
производительности.Это позволяет избежать резких «прыжков» элементов при перестановке и создавать ощущение физического взаимодействия.
SwapAnimation подключается как плагин к основному объекту Draggable:
import { Draggable, SwapAnimation } from '@shopify/draggable';
const container = document.querySelector('.draggable-container');
const draggable = new Draggable(container, {
draggable: '.draggable-item',
delay: 0,
mirror: {
constrainDimensions: true
}
});
draggable.addPlugin(SwapAnimation, {
duration: 300,
easing: 'ease-in-out'
});
Параметры плагина:
duration — время анимации в миллисекундах (по умолчанию
250).easing — функция сглаживания движения (по умолчанию
ease).horizontal и vertical — можно явно указать
направление анимации.collapse — позволяет сжимать элементы, чтобы
предотвратить визуальные пересечения.SwapAnimation позволяет тонко настраивать визуальные эффекты:
draggable.addPlugin(SwapAnimation, {
duration: 500,
easing: 'cubic-bezier(0.4, 0, 0.2, 1)'
});
Можно ограничивать анимацию только горизонтальной или вертикальной осью:
draggable.addPlugin(SwapAnimation, {
horizontal: true,
vertical: false
});
При использовании параметра collapse: true соседние
элементы плавно смещаются, освобождая место для перетаскиваемого
элемента:
draggable.addPlugin(SwapAnimation, {
collapse: true
});
SwapAnimation тесно интегрирован с жизненным циклом Draggable и реагирует на следующие события:
sortable:start — фиксирование исходных координат
элементов.sortable:swap — инициирование анимации перестановки при
изменении порядка.sortable:stop — завершение анимации и очистка временных
стилей.Пример подписки на события:
draggable.on('sortable:swap', (event) => {
console.log('Произошла перестановка элементов', event);
});
SwapAnimation использует requestAnimationFrame для выполнения анимации без блокировки основного потока. Это обеспечивает:
Каждый элемент получает временное смещение через CSS переменные или инлайн стиль:
transform: translate3d(x, y, 0);
transition: transform 300ms ease-in-out;
После завершения анимации эти стили удаляются, возвращая DOM в чистое состояние.
const productList = new Draggable('.product-list', {
draggable: '.product-item'
});
productList.addPlugin(SwapAnimation, { duration: 350, easing: 'ease' });
const grid = new Draggable('.grid', {
draggable: '.grid-item'
});
grid.addPlugin(SwapAnimation, {
duration: 400,
collapse: true
});
const menu = new Draggable('.menu', {
draggable: '.menu-item'
});
menu.addPlugin(SwapAnimation, {
vertical: true,
horizontal: false,
duration: 250
});
will-change: transform для элементов,
чтобы ускорить анимацию на уровне GPU.duration), чтобы не перегружать браузер.collapse только при
необходимости, так как он требует пересчета позиций всех соседних
элементов.SwapAnimation в Shopify Draggable обеспечивает высокоэффективную и
наглядную анимацию при перестановке элементов, делая пользовательский
интерфейс интуитивно понятным и визуально привлекательным. Правильная
настройка параметров duration, easing и
collapse позволяет адаптировать эффект под любые списки,
сетки и меню.