SortableJS — это мощная библиотека на JavaScript, позволяющая создавать интерактивные списки с возможностью перетаскивания элементов. Она поддерживает как простые списки, так и сложные структуры с вложенными элементами, обеспечивает гибкую настройку и управление событиями.
Для использования SortableJS достаточно подключить библиотеку через CDN или npm. После подключения создается экземпляр Sortable для контейнера с элементами:
import Sortable from 'sortablejs';
const list = document.getElementById('sortable-list');
Sortable.create(list, {
animation: 150,
ghostClass: 'sortable-ghost',
chosenClass: 'sortable-chosen'
});
Для корректного визуального отображения интерактивного списка важны CSS-правила:
#sortable-list {
list-style-type: none;
padding: 0;
margin: 0;
}
#sortable-list li {
padding: 10px 15px;
margin: 5px 0;
background-color: #f0f0f0;
border: 1px solid #ccc;
cursor: grab;
}
.sortable-ghost {
opacity: 0.4;
}
.sortable-chosen {
background-color: #d0d0ff;
}
SortableJS предоставляет большое количество событий для управления поведением списка:
Пример использования:
Sortable.create(list, {
animation: 150,
onEnd: function (evt) {
console.log(`Элемент ${evt.item.textContent} перемещен с позиции ${evt.oldIndex} на позицию ${evt.newIndex}`);
}
});
SortableJS позволяет объединять списки в группы, что дает возможность перетаскивать элементы между ними:
const listA = document.getElementById('list-a');
const listB = document.getElementById('list-b');
Sortable.create(listA, {
group: 'shared',
animation: 150
});
Sortable.create(listB, {
group: 'shared',
animation: 150
});
Для управления тем, какие элементы можно перемещать, используется параметр filter и CSS-классы:
Sortable.create(list, {
animation: 150,
filter: '.non-draggable',
onMove: function (evt) {
return !evt.related.classList.contains('non-draggable');
}
});
.non-draggable нельзя
перетаскивать.false, чтобы
заблокировать перенос определенных элементов.SortableJS поддерживает вложенные списки, что позволяет создавать сложные структуры, например, деревья или меню:
<ul id="nested-list">
<li>
Элемент 1
<ul>
<li>Подэлемент 1.1</li>
<li>Подэлемент 1.2</li>
</ul>
</li>
<li>Элемент 2</li>
</ul>
Sortable.create(document.getElementById('nested-list'), {
group: 'nested',
animation: 150,
fallbackOnBody: true,
swapThreshold: 0.65
});
SortableJS автоматически отслеживает изменения DOM, поэтому добавление новых элементов в список не требует повторной инициализации:
const newItem = document.createElement('li');
newItem.textContent = 'Новый элемент';
list.appendChild(newItem);
Перетаскивание нового элемента работает сразу, благодаря тому, что SortableJS применяет обработчики к родительскому контейнеру.
Библиотека позволяет легко изменять визуальные эффекты через CSS:
.sortable-drag {
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
}
Добавление такого класса делает интерфейс более отзывчивым и визуально привлекательным.
Базовые стили и правильная настройка SortableJS создают интуитивно понятный интерфейс с гибким управлением и расширяемостью для любых проектов на JavaScript.