SortableJS — это библиотека для реализации перетаскивания элементов в списках на веб-страницах с помощью JavaScript. Она предоставляет удобный API для создания интерактивных списков, поддерживает работу с DOM, событиями и позволяет гибко настраивать поведение при сортировке.
Для начала работы с SortableJS необходимо подключить библиотеку:
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js"></script>
После подключения создается экземпляр Sortable на контейнере с элементами списка:
const sortable = new Sortable(document.getElementById('myList'), {
animation: 150,
handle: '.handle'
});
Здесь ключевые параметры:
animation — время анимации при перемещении элементов (в
миллисекундах).handle — селектор элемента внутри каждой позиции,
который будет использоваться для перетаскивания.SortableJS оперирует контейнерами (родительский элемент) и элементами внутри (дети контейнера). Все изменения сортировки происходят именно на уровне DOM-элементов.
Атрибуты и CSS:
draggable="true" — указывает, что элемент может быть
перемещаемым.cursor: grab и cursor: grabbing —
визуальные подсказки при перетаскивании..item {
padding: 10px;
border: 1px solid #ccc;
margin-bottom: 5px;
cursor: grab;
}
.item.dragging {
opacity: 0.6;
}
groupПозволяет объединять несколько списков для возможности перетаскивания элементов между ними:
new Sortable(document.getElementById('list1'), {
group: 'shared',
animation: 150
});
new Sortable(document.getElementById('list2'), {
group: 'shared',
animation: 150
});
Параметры group:
name — имя группы.pull — разрешает/запрещает вынос элементов в другие
списки. Значения: true, false,
"clone".put — разрешает/запрещает принимать элементы из других
списков.sortУправляет возможностью сортировки внутри одного списка:
new Sortable(list, {
sort: true // элементы можно перемещать внутри списка
});
Установка sort: false превращает список в статичный
контейнер, позволяя только добавлять элементы извне.
handleОпределяет элементы, за которые можно захватывать позицию для перемещения.
new Sortable(list, {
handle: '.drag-handle'
});
Это особенно полезно для сложных элементов, где только часть блока должна быть интерактивной.
filterПозволяет исключать элементы из перетаскивания:
new Sortable(list, {
filter: '.non-draggable',
onFilter: function(evt) {
console.log('Попытка перетащить запрещённый элемент');
}
});
Важно: элементы с классом non-draggable
остаются в списке, но не могут быть захвачены.
draggableСелектор дочерних элементов, которые можно перемещать:
new Sortable(list, {
draggable: '.item'
});
Без этого параметра SortableJS будет пытаться сделать перетаскиваемым каждый дочерний элемент контейнера.
SortableJS предоставляет богатый набор событий для взаимодействия с процессом сортировки:
onStart — вызывается при начале перетаскивания.onEnd — вызывается после завершения
перетаскивания.onAdd — срабатывает, когда элемент добавляется из
другого списка.onUpdate — срабатывает при изменении порядка внутри
списка.onRemove — срабатывает, когда элемент удаляется из
списка.Пример использования:
new Sortable(list, {
onEnd: function(evt) {
console.log(`Элемент ${evt.item.textContent} перемещён с позиции ${evt.oldIndex} на ${evt.newIndex}`);
}
});
События позволяют синхронизировать DOM с данными на сервере или обновлять интерфейс без перезагрузки страницы.
animation — плавность перемещения элементов.ghostClass — класс для отображения “призрачного”
элемента во время перетаскивания:new Sortable(list, {
ghostClass: 'dragging'
});
chosenClass — класс элемента, который выбран для
перетаскивания.swap — позволяет включить режим swap (замена элементов)
вместо стандартного перемещения.new Sortable(list, {
swap: true,
swapClass: 'highlight'
});
SortableJS поддерживает динамическое добавление и удаление элементов. После вставки новых элементов их можно сразу сделать перетаскиваемыми:
const newItem = document.createElement('li');
newItem.className = 'item';
newItem.textContent = 'Новый элемент';
list.appendChild(newItem);
sortable.addEventListener('onAdd', function(evt){});
Библиотека автоматически обновляет внутренние структуры после изменения DOM.
SortableJS легко интегрируется с популярными фреймворками:
vuedraggable.react-sortablejs.ngx-sortablejs.В таких случаях директивы group, handle,
filter и события остаются идентичными, а синхронизация с
состоянием фреймворка осуществляется автоматически.
Эта система директив и событий позволяет гибко управлять перетаскиванием, адаптировать списки под сложные интерфейсы и создавать динамические интерактивные элементы с минимальными усилиями.