Библиотека Shopify Draggable построена на принципах модульного взаимодействия с элементами DOM и требует правильной организации структуры для корректной работы перетаскивания. Основная идея заключается в разделении интерфейса на контейнеры и элементы, которые можно перемещать, а также в четкой иерархии, обеспечивающей совместимость с событиями библиотеки.
Контейнер — это элемент, внутри которого происходят перетаскивания. Он служит родителем для всех draggable элементов и обеспечивает контроль над границами перемещения. Обычно контейнер обозначается через класс или атрибут, например:
<div class="draggable-container">
<div class="draggable-item">Элемент 1</div>
<div class="draggable-item">Элемент 2</div>
<div class="draggable-item">Элемент 3</div>
</div>
Ключевые моменты:
position для контейнера не обязательны, но
рекомендуется использовать relative для удобства
позиционирования перемещаемых элементов.Draggable элемент — это элемент, который можно перетаскивать внутри контейнера. Он должен быть отдельным DOM-узлом и иметь уникальный класс или идентификатор для правильной инициализации:
const container = document.querySelector('.draggable-container');
const draggable = new Draggable(container, {
draggable: '.draggable-item'
});
draggable-item используется для выбора всех
элементов, которые будут перемещаться.Для сортируемых списков рекомендуется использовать следующий DOM:
<ul class="draggable-list">
<li class="draggable-item">Элемент A</li>
<li class="draggable-item">Элемент B</li>
<li class="draggable-item">Элемент C</li>
</ul>
Особенности:
ul или ol) выступает контейнером,
а li — draggable элементами.Mirror элемент — это визуальное отображение перетаскиваемого элемента, создаваемое библиотекой автоматически. DOM должен предусматривать возможность свободного позиционирования:
position: fixed,
pointer-events: none, z-index выше, чем у
других элементов.Placeholder используется для обозначения места, где элемент будет после отпускания:
.draggable-item--placeholder {
border: 2px dashed #ccc;
height: 50px;
}
Правильная иерархия элементов обеспечивает предсказуемое поведение drag-and-drop:
Дополнительно можно использовать атрибуты:
data-id для уникальной идентификации элементов.data-draggable для явного указания, какие элементы
перетаскиваемые.aria-grabbed и другие ARIA атрибуты для
доступности.Эта структура DOM является фундаментальной для использования всех возможностей Shopify Draggable, включая сортировку, совместную работу нескольких контейнеров и динамическое создание элементов. Правильная организация контейнеров, draggable элементов и их визуальных отображений (mirror/placeholder) напрямую влияет на стабильность и плавность drag-and-drop.