В библиотеке Shopify Draggable концепция handle играет ключевую роль в управлении интерактивными перетаскиваемыми элементами. Handle — это специальный подэлемент внутри draggable-элемента, который отвечает за инициирование действия перетаскивания. Использование handle позволяет ограничить область, с которой пользователь может начать перемещение, повышая точность интерфейса и предотвращая случайные срабатывания.
Изоляция взаимодействия Draggable-элемент может содержать несколько подэлементов. Без handle любое нажатие на элемент инициирует перетаскивание. При указании handle перетаскивание срабатывает только при взаимодействии с этим подэлементом.
Селектор handle Для определения handle
используется CSS-селектор, передаваемый в опции handle при
создании экземпляра Draggable:
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.list'), {
draggable: '.list-item',
handle: '.drag-handle'
});
Здесь .drag-handle — это класс подэлемента, который
будет служить точкой захвата для перетаскивания. Все клики вне этого
элемента на .list-item игнорируются.
Вложенные handle элементы Draggable корректно работает с глубокими вложениями. Handle может находиться на любой глубине внутри перетаскиваемого элемента. Например:
<div class="list-item">
<div class="item-content">
<button class="drag-handle">Перетащить</button>
</div>
</div>
В этом случае только кнопка с классом .drag-handle
инициирует drag-событие, что предотвращает случайное перемещение при
клике на контент элемента.
Множественные handle Draggable поддерживает несколько handle для одного элемента. Достаточно указать селектор, который выбирает несколько подэлементов:
handle: '.drag-handle, .icon-move'
Перетаскивание сработает при клике на любой из указанных элементов.
Динамические элементы Если элементы создаются
динамически после инициализации Draggable, handle по умолчанию не
привязывается к ним. Необходимо использовать метод
draggable.add() для добавления новых элементов или
полностью пересоздать экземпляр с обновленным селектором.
CSS-подсказки для UX Рекомендуется визуально обозначать handle (например, иконкой или изменением курсора). Для этого можно использовать CSS:
.drag-handle {
cursor: grab;
}
.drag-handle:active {
cursor: grabbing;
}
Это повышает интуитивность интерфейса и снижает риск неправильных действий пользователя.
Списки с контентом и кнопками Когда элемент списка содержит текст, ссылки и кнопки, handle обеспечивает безопасное перетаскивание только через специально выделенную область:
<ul class="list">
<li class="list-item">
<span class="drag-handle">☰</span>
<span class="item-title">Элемент 1</span>
<button>Удалить</button>
</li>
</ul>Карточки с изображениями и текстом Handle может быть маленькой иконкой в верхнем углу карточки, а остальная часть карточки может оставаться интерактивной (клики по тексту или кнопкам не будут инициировать drag):
<div class="card">
<img src="image.jpg" alt="Изображение">
<div class="card-body">
<h4>Название</h4>
<button>Подробнее</button>
</div>
<div class="drag-handle">⇅</div>
</div>Горизонтальные и вертикальные сетки При работе с сетками handle помогает избегать конфликтов с кликабельными элементами внутри ячеек. Это особенно важно для сложных интерфейсов типа Kanban-досок или таблиц.
Определение handle — это фундаментальная часть настройки Draggable. Оно позволяет полностью контролировать, какие части элементов интерактивны для перетаскивания, предотвращает случайные движения и делает интерфейс более предсказуемым и удобным.