SortableJS — это мощная библиотека JavaScript для реализации перетаскивания элементов внутри списков и между ними. Она позволяет управлять порядком элементов на странице без использования сторонних фреймворков, обеспечивая плавное и интерактивное поведение интерфейса.
Для начала необходимо подключить SortableJS к проекту. Это можно сделать через CDN:
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
Либо через npm для проектов с модульной системой:
npm install sortablejs
После установки библиотеку можно импортировать:
import Sortable from 'sortablejs';
Создание интерактивного списка осуществляется с помощью конструктора
Sortable. Ключевым параметром является элемент DOM, на
котором будет применяться сортировка:
const list = document.getElementById('items');
const sortable = new Sortable(list, {
animation: 150, // Время анимации перемещения элементов
ghostClass: 'sortable-ghost', // Класс для визуального отображения перетаскиваемого элемента
chosenClass: 'sortable-chosen' // Класс для выделенного элемента
});
Ключевые моменты:
animation обеспечивает плавное перемещение
элементов.ghostClass помогает визуализировать перетаскиваемый
элемент.chosenClass обозначает элемент, который в данный момент
выбран для перемещения.SortableJS предоставляет обширный набор опций для гибкой настройки поведения списка:
new Sortable(list, {
group: 'shared', // Элементы можно перемещать между списками с одной группой
pull: true, // Разрешает вытаскивать элементы
put: true // Разрешает вставлять элементы
});
filter: '.no-drag', // Элементы с этим классом не будут перетаскиваться
SortableJS предоставляет широкий набор событий для управления поведением элементов:
onStart — вызывается при начале перетаскивания.onEnd — срабатывает после завершения перемещения
элемента.onAdd — срабатывает при добавлении элемента из другого
списка.onRemove — вызывается при удалении элемента из
списка.onUpdate — обновление порядка элементов внутри одного
списка.Пример использования событий:
const sortable = new Sortable(list, {
onEnd: function(evt) {
console.log(`Элемент перемещён с позиции ${evt.oldIndex} на ${evt.newIndex}`);
},
onAdd: function(evt) {
console.log('Элемент добавлен из другого списка');
}
});
SortableJS предоставляет методы для получения и установки порядка элементов:
toArray() — возвращает массив идентификаторов элементов
в текущем порядке.sort() — сортировка элементов по заданному массиву
идентификаторов:const order = sortable.toArray();
console.log(order); // ['item1', 'item2', 'item3']
sortable.sort(['item3', 'item1', 'item2']); // Изменение порядка элементов
Для корректной работы toArray и sort
необходимо, чтобы каждый элемент имел атрибут data-id.
SortableJS легко интегрируется с React, Vue и другими фреймворками. В
React, например, используется useEffect для
инициализации:
import React, { useEffect, useRef } from 'react';
import Sortable from 'sortablejs';
function ItemList({ items }) {
const listRef = useRef(null);
useEffect(() => {
const sortable = new Sortable(listRef.current, {
animation: 150
});
return () => sortable.destroy();
}, []);
return (
<ul ref={listRef}>
{items.map(item => <li key={item.id} data-id={item.id}>{item.name}</li>)}
</ul>
);
}
Vue использует аналогичный подход через директиву
v-sortable или создание плагина для управления списком.
SortableJS поддерживает ряд продвинутых функций:
direction: 'vertical' или 'horizontal'.swap или
setData для работы с переносом данных.Для крупных приложений рекомендуется:
data-id для каждого элемента,
чтобы методы toArray и sort работали
корректно.destroy) в
cleanup для предотвращения утечек памяти.SortableJS обеспечивает гибкость и производительность при работе с интерактивными списками, позволяя создавать сложные интерфейсы с минимальными усилиями.