SortableJS — это мощная библиотека для реализации функционала перетаскивания элементов (drag-and-drop) на веб-страницах. Основная задача библиотеки — упрощение создания интерактивных списков и сеток с возможностью изменения порядка элементов без использования сложных алгоритмов и ручного управления событиями.
Для проектов, где используется современная система сборки модулей (Webpack, Vite, Parcel), рекомендуется установка через npm:
npm install sortablejs --save
После установки библиотеку можно импортировать в проект:
import Sortable from 'sortablejs';
Импорт может быть выполнен как в стандартном модуле ES6, так и в CommonJS:
// ES6
import Sortable from 'sortablejs';
// CommonJS
const Sortable = require('sortablejs');
Для простых проектов без сборки модулей доступен вариант подключения через CDN. Это позволяет использовать библиотеку без установки и интеграции в систему сборки:
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js"></script>
После подключения через CDN объект Sortable становится
доступен глобально, и его можно использовать напрямую в скриптах:
const list = document.getElementById('my-list');
const sortable = new Sortable(list, {
animation: 150
});
Для того чтобы элементы списка стали перетаскиваемыми, необходимо создать экземпляр Sortable, передав в конструктор DOM-элемент и объект с настройками:
const sortable = new Sortable(document.getElementById('my-list'), {
animation: 200, // Время анимации перемещения элементов в миллисекундах
ghostClass: 'ghost', // Класс, применяемый к элементу, который перетаскивается
handle: '.handle', // Указывает, что перетаскивание возможно только за определённый элемент внутри элемента списка
chosenClass: 'chosen', // Класс для выбранного элемента
draggable: '.item' // Ограничение элементов, которые можно перетаскивать
});
Ключевые моменты:
animation отвечает за плавность перемещения
элементов.ghostClass и chosenClass позволяют
визуально выделять элементы во время перетаскивания.handle ограничивает область, с которой элемент можно
захватить.draggable задаёт селектор элементов, которые участвуют
в drag-and-drop.SortableJS позволяет связывать несколько списков, чтобы элементы
можно было перемещать между ними. Для этого используется параметр
group:
const sortable1 = new Sortable(document.getElementById('list1'), {
group: 'shared',
animation: 150
});
const sortable2 = new Sortable(document.getElementById('list2'), {
group: 'shared',
animation: 150
});
Все списки с одинаковым значением group становятся
взаимосвязанными, и элементы можно перемещать между ними. Дополнительно
можно настроить ограничения:
pull: позволяет или запрещает вынос элементов из
списка.put: разрешает или запрещает добавление элементов из
других списков.Хотя SortableJS не требует обязательного CSS, добавление стилей для
классов ghostClass и chosenClass улучшает
визуальное восприятие:
.ghost {
opacity: 0.4;
background-color: #f0f0f0;
}
.chosen {
background-color: #d0f0d0;
}
Эти классы динамически применяются библиотекой при начале перетаскивания и выборе элемента.
Полный набор опций SortableJS позволяет гибко управлять поведением:
sort: включение или отключение сортировки внутри
списка.delay и touchStartThreshold: управление
временем и чувствительностью для тач-устройств.swap и swapClass: реализация обмена
элементов при наведении.onStart, onEnd, onAdd,
onRemove, onUpdate: обработчики событий для
отслеживания действий пользователя.Пример с использованием событий:
const sortable = new Sortable(document.getElementById('my-list'), {
animation: 150,
onEnd: function (evt) {
console.log(`Элемент ${evt.item.textContent} перемещён с позиции ${evt.oldIndex} на ${evt.newIndex}`);
}
});
toArray и fromArray для синхронизации
состояния DOM с данными.touchStartThreshold и fallbackOnBody.SortableJS обеспечивает лёгкую интеграцию, широкие возможности кастомизации и поддержку мультисписочных интерфейсов, что делает её универсальным инструментом для создания интерактивных элементов на странице.