SortableJS — это легковесная библиотека для организации элементов на
странице методом drag-and-drop. Она позволяет создавать интерактивные
списки, галереи и таблицы с возможностью перетаскивания элементов мышью
или сенсорным вводом. Основной объект библиотеки создаётся с помощью
конструктора Sortable, которому передаётся контейнер
элементов и объект с опциями.
const gallery = document.getElementById('gallery');
const sortable = new Sortable(gallery, {
animation: 150,
ghostClass: 'dragging'
});
Ключевые параметры:
animation — длительность анимации перемещения элементов
(в миллисекундах).ghostClass — CSS-класс для элемента, который
перемещается (отображается полупрозрачным).handle — селектор, указывающий, за какую часть элемента
можно перетаскивать.draggable — селектор элементов внутри контейнера,
которые можно перетаскивать.Для галереи используется список элементов <ul> или
<div>, где каждый элемент содержит изображение и, при
необходимости, подпись. Важным аспектом является определение класса для
перетаскиваемых элементов.
<div id="gallery">
<div class="item"><img src="img1.jpg" alt="1"></div>
<div class="item"><img src="img2.jpg" alt="2"></div>
<div class="item"><img src="img3.jpg" alt="3"></div>
</div>
const gallery = document.getElementById('gallery');
new Sortable(gallery, {
animation: 200,
draggable: '.item',
handle: 'img',
chosenClass: 'selected',
ghostClass: 'dragging'
});
Описание параметров:
chosenClass — CSS-класс для элемента, который выбран и
готов к перемещению.handle в примере установлен на
<img>, что позволяет перетаскивать только по
изображению.SortableJS предоставляет множество событий для контроля за процессом перетаскивания:
onStart — вызывается при начале перемещения.onEnd — вызывается по завершении перетаскивания.onAdd — срабатывает при добавлении элемента в другой
контейнер.onUpdate — вызывается, когда изменился порядок
элементов внутри текущего контейнера.Пример логирования нового порядка изображений:
const sortable = new Sortable(gallery, {
animation: 150,
draggable: '.item',
onEnd: function (evt) {
const order = Array.from(gallery.children).map(item => item.querySelector('img').alt);
console.log('Новый порядок:', order);
}
});
SortableJS поддерживает работу с несколькими контейнерами, что
позволяет перемещать изображения между различными галереями. Для этого
используется параметр group.
const gallery1 = document.getElementById('gallery1');
const gallery2 = document.getElementById('gallery2');
new Sortable(gallery1, { group: 'shared', animation: 150, draggable: '.item' });
new Sortable(gallery2, { group: 'shared', animation: 150, draggable: '.item' });
Особенности параметра group:
pull и put позволяет гибко управлять
доступностью элементов для перемещения.group: {
name: 'shared',
pull: 'clone', // создаёт копию элемента при переносе
put: false // запрещает вставку извне
}
Для визуального эффекта важно использовать CSS-классы
ghostClass и chosenClass. Например:
.dragging {
opacity: 0.5;
border: 2px dashed #aaa;
}
.selected {
transform: scale(1.05);
transition: transform 0.2s;
}
Эти классы обеспечивают плавный и интуитивно понятный интерфейс для взаимодействия с элементами галереи.
SortableJS поддерживает расширенные функции:
swap — позволяет обменивать элементы местами без
смещения остальных.sort — включение/отключение возможности
сортировки.filter — предотвращает перетаскивание определённых
элементов по CSS-селектору.new Sortable(gallery, {
animation: 150,
draggable: '.item',
filter: '.locked',
onFilter: function (evt) {
console.log('Попытка переместить заблокированный элемент', evt.item);
}
});
SortableJS легко интегрируется с фронтенд-фреймворками (React, Vue, Angular) и системами хранения данных (localStorage, серверная база). При обновлении порядка элементов можно сохранять состояние галереи, отправляя массив идентификаторов изображений на сервер или в локальное хранилище.
const order = Array.from(gallery.children).map(item => item.dataset.id);
localStorage.setItem('galleryOrder', JSON.stringify(order));
Использование SortableJS обеспечивает гибкость, интерактивность и удобство управления визуальными элементами галереи, делая интерфейс современным и отзывчивым.