SortableJS — это мощная библиотека для реализации перетаскивания элементов в веб-интерфейсе. Основой её работы является манипуляция DOM-структурой: библиотека взаимодействует непосредственно с HTML-элементами, изменяя их порядок в родительских контейнерах. Понимание структуры DOM и того, как SortableJS её использует, критично для эффективного применения библиотеки.
Основной элемент, с которым работает SortableJS, — это
контейнер (container). Контейнер — это любой элемент
DOM, который содержит дочерние элементы, подлежащие сортировке. Чаще
всего это <ul>, <ol>,
<div> или <table>.
<ul id="sortable-list">
<li>Элемент 1</li>
<li>Элемент 2</li>
<li>Элемент 3</li>
</ul>
Контейнер определяется при инициализации:
new Sortable(document.getElementById('sortable-list'), {
animation: 150
});
Ключевые моменты:
Элементы, которые подлежат сортировке, называются items. По умолчанию SortableJS считает всеми прямыми потомками контейнера. Каждый item становится «перетаскиваемым» и может быть перемещён в пределах контейнера или между контейнерами.
new Sortable(list, {
draggable: 'li'
});
Особенности работы с дочерними элементами:
draggable позволяет указать селектор для элементов,
которые будут перемещаемыми.filter.SortableJS поддерживает вложенные контейнеры, что позволяет создавать многоуровневые структуры. Каждый контейнер можно инициализировать как отдельный Sortable-объект.
<ul id="parent-list">
<li>
Элемент A
<ul class="child-list">
<li>Подэлемент A1</li>
<li>Подэлемент A2</li>
</ul>
</li>
<li>Элемент B</li>
</ul>
new Sortable(document.querySelector('.child-list'), {
group: 'nested',
animation: 100
});
Важные нюансы:
group позволяет соединять контейнеры для
перемещения элементов между ними.observer.SortableJS напрямую изменяет порядок DOM-узлов. Это означает, что после перетаскивания визуальный порядок элементов совпадает с их фактическим порядком в DOM:
list.addEventListener('sortupdate', function (event) {
console.log('Новый порядок элементов:', list.children);
});
Ключевые моменты:
onEnd, onAdd,
onUpdate для синхронизации с данными на сервере.Для более точного контроля над элементами можно использовать атрибуты
data-* или CSS-классы. Это позволяет фильтровать элементы,
определять их уникальность и взаимодействовать с ними при
перетаскивании.
<li data-id="1" class="draggable-item">Элемент 1</li>
<li data-id="2" class="draggable-item">Элемент 2</li>
new Sortable(list, {
draggable: '.draggable-item'
});
Особенности:
draggable и filter для
сложных сценариев.SortableJS добавляет временные CSS-классы к элементам во время перетаскивания:
.sortable-chosen — элемент, который выбран для
перемещения..sortable-ghost — прозрачный «призрак» элемента во
время перетаскивания..sortable-drag — элемент в процессе перетаскивания
(иногда совпадает с ghost).Применение стилей через классы:
.sortable-ghost {
opacity: 0.4;
border: 2px dashed #aaa;
}
Это позволяет визуально разделять исходный элемент и его временную копию.
SortableJS корректно работает с элементами, добавляемыми и удаляемыми из DOM после инициализации. Для этого важно:
sort() или destroy() и повторную
инициализацию.const newItem = document.createElement('li');
newItem.textContent = 'Новый элемент';
list.appendChild(newItem);
После добавления можно вызвать sortableInstance.sort()
или повторно инициализировать контейнер.
Структура DOM-элементов в SortableJS определяет, как библиотека управляет перетаскиванием, визуальными эффектами и синхронизацией данных. Правильная организация контейнеров и элементов обеспечивает стабильную работу интерфейса и гибкость при взаимодействии с данными.