SortableJS — это легковесная и мощная библиотека для организации перетаскиваемых элементов на веб-странице. Она предоставляет удобный API для создания интерактивных списков с поддержкой drag-and-drop. Основной принцип работы библиотеки заключается в привязке экземпляра Sortable к контейнеру DOM-элементов, внутри которого элементы могут быть перемещены пользователем.
SortableJS можно подключить несколькими способами:
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
npm install sortablejs
После установки через npm используется импорт:
import Sortable from 'sortablejs';
Подключение через CDN удобно для быстрого прототипирования, а npm — для интеграции в современные сборщики модулей, такие как Webpack или Vite.
Инициализация производится через вызов конструктора
Sortable и передачу ему DOM-элемента контейнера и объекта
настроек:
const list = document.getElementById('sortable-list');
const sortable = new Sortable(list, {
animation: 150,
ghostClass: 'sortable-ghost',
handle: '.handle'
});
Пояснение ключевых параметров:
animation — скорость анимации при перетаскивании,
задается в миллисекундах.ghostClass — CSS-класс для элемента, который
отображается при перетаскивании (прозрачный «призрак»).handle — CSS-селектор, указывающий, за какую часть
элемента пользователь может захватить его для перемещения. Если не
указан, элемент можно перетаскивать за любую область.SortableJS позволяет гибко управлять элементами списка через множество опций:
draggable — CSS-селектор дочерних элементов, которые
можно перетаскивать. По умолчанию это все прямые потомки
контейнера.group — настройка группировки списков для поддержки
drag-and-drop между несколькими контейнерами. Может быть строкой (имя
группы) или объектом с параметрами name, pull
и put.sort — булевое значение, разрешающее сортировку внутри
контейнера. По умолчанию true.filter — селектор элементов, которые нельзя
перетаскивать.preventOnFilter — булевое значение, указывающее,
блокировать ли события по умолчанию для элементов, попавших в
filter.Пример с группировкой и фильтром:
const listA = document.getElementById('list-a');
const listB = document.getElementById('list-b');
Sortable.create(listA, {
group: { name: 'shared', pull: 'clone', put: true },
filter: '.disabled',
animation: 200
});
Sortable.create(listB, {
group: 'shared',
animation: 200
});
SortableJS поддерживает обширную систему событий, позволяя реагировать на действия пользователя:
onStart(evt) — вызывается при начале
перетаскивания.onEnd(evt) — вызывается после завершения
перемещения.onAdd(evt) — элемент добавлен в контейнер из другой
группы.onRemove(evt) — элемент удален из текущего
контейнера.onUpdate(evt) — порядок элементов изменился внутри
контейнера.Пример использования событий:
Sortable.create(list, {
animation: 150,
onEnd: function (evt) {
console.log(`Элемент ${evt.item.textContent} перемещен с позиции ${evt.oldIndex} на ${evt.newIndex}`);
}
});
evt содержит полезные свойства:
item — перемещаемый DOM-элемент,oldIndex — исходная позиция элемента,newIndex — новая позиция элемента,from и to — контейнеры источника и
назначения при перетаскивании между списками.SortableJS поддерживает настройку прямо в HTML через
data-* атрибуты, что упрощает интеграцию без явного
Jav * aScript:
<ul id="sortable" data-sortable='{"animation": 150, "handle": ".handle"}'>
<li class="handle">Элемент 1</li>
<li class="handle">Элемент 2</li>
</ul>
<script>
new Sortable(document.getElementById('sortable'));
</script>
Это особенно удобно для статических страниц или проектов с минимальным объемом JS.
CSS играет ключевую роль в визуальном оформлении drag-and-drop:
.sortable-ghost {
opacity: 0.4;
background-color: #f0f0f0;
}
.sortable-chosen {
border: 2px dashed #333;
}
sortable-ghost — элемент, который перемещается по
экрану.sortable-chosen — элемент, который пользователь только
что выбрал для перетаскивания.Эти классы можно настраивать для достижения плавной анимации и удобного UX при сортировке.
clone при pull, чтобы избежать мерцания
элементов.