Библиотека Shopify Draggable предоставляет мощный инструмент для создания перетаскиваемых элементов на веб-странице. Одним из способов управления поведением Draggable является настройка через HTML data-атрибуты, что позволяет отделить логику инициализации от JavaScript и облегчает масштабирование интерфейса.
data-draggable Этот атрибут
указывает, что элемент должен быть интерактивным. Он применяется к
контейнеру, содержащему элементы для перетаскивания. Пример:
<ul data-draggable="true">
<li>Элемент 1</li>
<li>Элемент 2</li>
<li>Элемент 3</li>
</ul>
Значение "true" позволяет автоматически определить, что
внутри контейнера находятся перетаскиваемые элементы.
data-draggable-handle Позволяет
указать область перетаскивания внутри элемента. Это
особенно полезно, когда элемент содержит интерактивные элементы (кнопки,
ссылки), которые не должны инициировать drag.
<li data-draggable-handle=".handle">
<span class="handle">Перетащить</span>
Контент элемента
</li>
В этом примере перетаскивание активируется только при взаимодействии
с элементом с классом .handle.
data-draggable-group Позволяет
объединять элементы в группы для ограниченного взаимодействия между
ними. Элементы из разных групп не будут взаимодействовать друг с другом
при drag-and-drop.
<ul data-draggable-group="products">
<li>Товар 1</li>
<li>Товар 2</li>
</ul>
<ul data-draggable-group="categories">
<li>Категория A</li>
<li>Категория B</li>
</ul>
Draggable автоматически определяет группу на основе атрибута и ограничивает взаимодействие только элементами внутри одного контейнера.
data-draggable-constraints позволяет
задать ограничения для перемещения элементов. Например, можно ограничить
перемещение по оси X или Y.
<li data-draggable-constraints="x">
Элемент, который можно перетаскивать только по горизонтали
</li>
<li data-draggable-constraints="y">
Элемент, который можно перетаскивать только по вертикали
</li>
Поддерживаются значения:
x — только горизонтальное перемещениеy — только вертикальное перемещениеnull — перемещение по обеим осям (значение по
умолчанию)Даже при использовании data-атрибутов, для активации Draggable требуется инициализация через JavaScript. Однако атрибуты позволяют автоматически подхватывать конфигурацию.
import { Draggable } from '@shopify/draggable';
const containers = document.querySelectorAll('[data-draggable="true"]');
containers.forEach(container => {
const draggable = new Draggable(container, {
draggable: 'li',
handle: container.querySelector('[data-draggable-handle]')?.className || null,
mirror: {
constrainDimensions: true
}
});
draggable.on('drag:start', event => {
console.log('Начало перетаскивания:', event.source);
});
});
В этом примере:
draggable — селектор элементов внутри
контейнера, которые можно перетаскиватьhandle — определяет, какая область
внутри элемента активирует dragmirror — создаёт визуальную копию
элемента при перетаскиванииИспользование data-атрибутов для группировки и ограничения перемещения упрощает работу с большими списками:
<ul data-draggable="true" data-draggable-group="tasks">
<li data-draggable-constraints="y">Задача 1</li>
<li data-draggable-constraints="y">Задача 2</li>
</ul>
<ul data-draggable="true" data-draggable-group="tasks">
<li data-draggable-constraints="y">Задача 3</li>
</ul>
JavaScript автоматически связывает элементы одной группы, а ограничения осей позволяют создавать вертикальные списки с drag-and-drop, исключая случайные смещения по горизонтали.
Data-атрибуты можно комбинировать, создавая гибкие интерфейсы без постоянного редактирования JS-кода. Пример сложного элемента:
<ul data-draggable="true" data-draggable-group="products">
<li data-draggable-handle=".handle" data-draggable-constraints="x">
<span class="handle">≡</span> Продукт 1
</li>
<li data-draggable-handle=".handle" data-draggable-constraints="x">
<span class="handle">≡</span> Продукт 2
</li>
</ul>
Здесь элементы перетаскиваются только по горизонтали, а drag
активируется только при взаимодействии с .handle.
Data-атрибуты можно менять в рантайме, и Draggable будет учитывать обновления при следующей инициализации или при повторной активации контейнера:
const firstItem = document.querySelector('li');
firstItem.setAttribute('data-draggable-constraints', 'y');
После этого элемент можно будет перемещать только по вертикали без изменения JS-инициализации.
drag:start, drag:stop,
sortable:stop).Data-атрибуты обеспечивают чистую и декларативную настройку Draggable, минимизируют дублирование кода и делают интерфейсы более предсказуемыми при масштабировании.