SortableJS — это библиотека для реализации перетаскивания элементов в
списках и сетках на чистом JavaScript. Она ориентирована на высокую
интерактивность и гибкость, позволяя управлять событиями перетаскивания,
сортировкой и взаимодействием с DOM. Основной элемент библиотеки — это
инициализация контейнера через конструктор Sortable,
которому передаётся DOM-элемент и объект конфигурации с опциями.
const list = document.getElementById('items');
const sortable = new Sortable(list, {
animation: 150,
ghostClass: 'sortable-ghost',
onEnd: function (evt) {
console.log(`Элемент перемещён с позиции ${evt.oldIndex} на позицию ${evt.newIndex}`);
}
});
Ключевые моменты при работе с SortableJS:
onStart, onMove,
onEnd позволяют отслеживать начало, процесс и завершение
перетаскивания.animation задаёт
плавность перемещения элементов, что влияет на восприятие интерфейса и
производительность.Производительность при работе с SortableJS во многом зависит от того, как браузер рендерит изменения в DOM. Основные аспекты:
documentFragment или методы
cloneNode, чтобы сначала подготовить изменения вне DOM, а
затем применить их одной операцией.ghostClass: Этот класс создаёт
визуальный клон перетаскиваемого элемента. Важно назначать стили таким
образом, чтобы они минимально нагружали браузер (например, избегать
сложных теней или фильтров CSS на больших списках).transform: translate3d() значительно эффективнее, чем
изменение top/left, так как они не требуют перерасчёта
компоновки страницы..sortable-ghost {
opacity: 0.5;
background-color: #f0f0f0;
transform: scale(1.05);
}
При работе с сотнями и тысячами элементов стандартная инициализация может быть медленной. Рекомендации:
sort и draggable имеют смысл включать только
при необходимости. Для статичных списков отключение сортировки уменьшает
нагрузку.const largeList = document.getElementById('large-list');
const sortableLarge = new Sortable(largeList, {
animation: 100,
sort: false, // если сортировка не нужна
ghostClass: 'sortable-ghost'
});
Каждое событие onMove, onUpdate,
onEnd создаёт нагрузку, особенно если в обработчике
выполняются сложные операции. Оптимальные практики:
onEnd), а не во
время движения (onMove).throttle или
debounce для уменьшения частоты вызовов.function throttle(fn, delay) {
let last = 0;
return function (...args) {
const now = Date.now();
if (now - last >= delay) {
last = now;
fn.apply(this, args);
}
}
}
sortableLarge.option("onMove", throttle(function (evt) {
// Лёгкая логика проверки возможности перемещения
}, 50));
SortableJS позволяет объединять несколько списков и перетаскивать элементы между ними. Для производительности:
onEnd.const container1 = document.getElementById('list1');
const container2 = document.getElementById('list2');
new Sortable(container1, { group: 'shared', animation: 150 });
new Sortable(container2, { group: 'shared', animation: 150 });
Стиль элементов напрямую влияет на FPS при перетаскивании:
transform, opacity,
background-color быстрее, чем box-shadow,
filter или border-radius на больших
списках.translate3d или will-change: transform
улучшает плавность анимации на GPU..item {
will-change: transform, opacity;
transition: transform 0.15s ease, opacity 0.15s ease;
}
Использование SortableJS требует внимания к деталям DOM и CSS, особенно при больших объёмах данных. Основные приоритеты — минимизация перерисовок, оптимизация анимации и правильное управление событиями. Применение этих подходов позволяет создавать быстрые, отзывчивые интерфейсы с перетаскиваемыми элементами.