Библиотека Shopify Draggable обеспечивает гибкость в создании перетаскиваемых интерфейсов, однако правильная организация кода критически важна для масштабируемости и поддерживаемости. Основное правило — разделение ответственности: каждый компонент должен отвечать только за свою зону влияния.
Пример структурированной инициализации:
const draggableConfig = {
draggable: '.item',
delay: 100,
mirror: {
constrainDimensions: true,
},
};
function initDraggable() {
const draggable = new Draggable(document.querySelectorAll('.container'), draggableConfig);
draggable.on('drag:start', handleDragStart);
draggable.on('drag:stop', handleDragStop);
return draggable;
}
Зеркало (mirror) — это отдельный визуальный элемент, который повторяет перетаскиваемый объект. Его поведение напрямую влияет на восприятие интерфейса пользователем.
constrainDimensions: true предотвращает растягивание
зеркала и сохраняет исходный вид элемента.mirror-класс. Лучше заранее определить CSS для плавного
перехода и уменьшения мерцаний.requestAnimationFrame для
ручного контроля перемещения повышает производительность при сложных
списках.Пример настройки кастомного зеркала:
const draggable = new Draggable(container, {
draggable: '.item',
mirror: {
constrainDimensions: true,
xAxis: true,
yAxis: true,
},
});
draggable.on('mirror:created', ({ mirror }) => {
mirror.style.transition = 'transform 0.2s ease';
});
Контейнеры определяют область, в которой разрешено перемещение элементов. При работе с несколькими списками важно учитывать ограничения:
containers в конфигурации и правильной обработки событий
sortable:sorted.document fragments для временного
хранения элементов, чтобы уменьшить количество рендеров DOM.Пример работы с несколькими контейнерами:
const containers = document.querySelectorAll('.list');
const draggable = new Draggable(containers, {
draggable: '.item',
delay: 50,
mirror: { constrainDimensions: true },
});
draggable.on('sortable:sorted', ({ oldIndex, newIndex, source, over }) => {
console.log(`Элемент перемещен с ${oldIndex} в ${newIndex}`);
});
Draggable предоставляет широкий спектр событий:
drag:start, drag:move, drag:stop,
mirror:created, sortable:sorted. Для крупных
приложений важно следовать нескольким правилам:
drag:move снижают нагрузку на рендер и улучшают
отзывчивость интерфейса.Пример троттлинга события перемещения:
function throttle(fn, limit) {
let inThrottle;
return function(...args) {
if (!inThrottle) {
fn.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
draggable.on('drag:move', throttle(event => {
console.log(event.source);
}, 16));
Draggable не предоставляет встроенных средств для полной доступности, поэтому стоит соблюдать следующие практики:
tabindex и
обработчиков клавиш.Для крупных проектов рекомендуется:
Следуя этим практикам, Draggable становится мощным инструментом для реализации интерактивных списков, перетаскиваемых панелей и сложных пользовательских интерфейсов с высокой производительностью и удобством поддержки.