SortableJS — это мощная библиотека для реализации перетаскивания и сортировки элементов на веб-странице. Основной способ использования заключается в подключении скрипта и инициализации Sortable на контейнере с элементами.
<ul id="sortable-list">
<li data-id="1">Элемент 1</li>
<li data-id="2">Элемент 2</li>
<li data-id="3">Элемент 3</li>
</ul>
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
<script>
new Sortable(document.getElementById('sortable-list'), {
animation: 150,
ghostClass: 'sortable-ghost',
chosenClass: 'sortable-chosen'
});
</script>
Ключевые параметры:
animation — плавность перемещения элементов (в
миллисекундах).ghostClass — CSS-класс для элемента-призрака во время
перетаскивания.chosenClass — класс для элемента, который был выбран
для перемещения.SortableJS предоставляет широкие возможности для отслеживания действий пользователя через события. Основные события:
onStart — инициируется при начале перетаскивания.onEnd — вызывается при завершении перемещения
элемента.onAdd — срабатывает, когда элемент добавлен из другого
списка.onUpdate — фиксирует изменения порядка элементов внутри
списка.onRemove — активируется при удалении элемента из
списка.Пример использования события onEnd:
new Sortable(document.getElementById('sortable-list'), {
animation: 150,
onEnd: function (evt) {
console.log(`Элемент с индексом ${evt.oldIndex} перемещён на позицию ${evt.newIndex}`);
}
});
Важно: evt.oldIndex и
evt.newIndex позволяют точно определить, какой элемент и на
какое место был перемещён.
SortableJS позволяет управлять тем, какие элементы можно перемещать, а какие нет.
filter — CSS-селектор, указывающий элементы, которые
нельзя перетаскивать.draggable — определяет, какие элементы внутри
контейнера могут быть перемещены.Пример фильтрации:
new Sortable(document.getElementById('sortable-list'), {
draggable: 'li',
filter: '.disabled',
onMove: function (evt) {
return !evt.related.classList.contains('disabled');
}
});
В этом примере элементы с классом disabled остаются
неподвижными.
SortableJS поддерживает взаимодействие между несколькими списками, позволяя переносить элементы из одного контейнера в другой.
<ul id="list1">
<li>Элемент A</li>
<li>Элемент B</li>
</ul>
<ul id="list2">
<li>Элемент C</li>
<li>Элемент D</li>
</ul>
<script>
new Sortable(list1, { group: 'shared', animation: 150 });
new Sortable(list2, { group: 'shared', animation: 150 });
</script>
Ключевые моменты работы с группами:
group — имя группы для совместного перемещения
элементов между списками.pull: true/false и
put: true/false, чтобы ограничивать возможность переноса
между контейнерами.Для хранения пользовательской сортировки можно использовать события
onEnd или onUpdate и обновлять состояние на
сервере или в локальном хранилище.
new Sortable(document.getElementById('sortable-list'), {
animation: 150,
onUpdate: function (evt) {
const order = Array.from(evt.from.children).map(li => li.dataset.id);
localStorage.setItem('sortableOrder', JSON.stringify(order));
}
});
Пояснение: сохраняется массив идентификаторов элементов в текущем порядке, что позволяет восстановить их после перезагрузки страницы.
SortableJS позволяет кастомизировать внешний вид элементов во время перетаскивания:
ghostClass — задаёт стиль для элемента-призрака.chosenClass — выделение выбранного элемента.dragClass — класс для элемента в момент активного
перемещения.Пример CSS:
.sortable-ghost {
opacity: 0.5;
background-color: #f0f0f0;
}
.sortable-chosen {
border: 2px solid #007bff;
}
Эти стили делают перемещение более наглядным и интуитивным для пользователя.
SortableJS предоставляет ряд дополнительных опций:
swapThreshold — порог замены элементов при
перемещении.invertSwap — изменение направления при
swap-перетаскивании.scroll — автоматическая прокрутка контейнера при
перетаскивании за пределы видимой области.new Sortable(document.getElementById('sortable-list'), {
animation: 150,
swapThreshold: 0.65,
scroll: true
});
Практическое значение: такие параметры обеспечивают гибкое управление взаимодействием с элементами в больших списках или на мобильных устройствах.
SortableJS легко интегрируется с современными фронтенд-фреймворками:
react-sortablejs.vuedraggable.Интеграция позволяет использовать двустороннее связывание данных и упрощает работу с динамическими массивами.
ghostClass, chosenClass,
dragClass.Каждый элемент функционала SortableJS обеспечивает гибкость и точное управление процессом обмена элементов местами, делая интерфейс более интерактивным и удобным для пользователя.