При работе с библиотекой Shopify Draggable ключевым аспектом является корректная адаптация элементов под разные размеры экранов. Веб-приложения, использующие перетаскивание, должны сохранять интерактивность и удобство на десктопах, планшетах и мобильных устройствах. Draggable предоставляет гибкие возможности для управления размерами и поведением элементов через события, CSS и опции конфигурации.
mirror и масштабированиеПри инициализации Draggable можно включить зеркало
(mirror), которое создаёт визуальную копию
перетаскиваемого элемента. На маленьких экранах важно контролировать
размеры зеркала, чтобы оно не перекрывало другие элементы
интерфейса.
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.list-item'), {
draggable: '.draggable-item',
mirror: {
constrainDimensions: true
}
});
constrainDimensions: true — зеркальная
копия сохраняет ширину и высоту исходного элемента, что обеспечивает
предсказуемое поведение на мобильных устройствах..draggable-mirror в зависимости от
ширины экрана.@media (max-width: 768px) {
.draggable-mirror {
transform: scale(0.8);
}
}
Draggable позволяет динамически обновлять позицию элементов при
изменении размеров окна. Для этого стоит использовать событие
resize:
window.addEventListener('resize', () => {
draggable.destroy();
draggable.init();
});
destroy() — удаляет текущие слушатели
и очищает состояние.init() — заново инициализирует
Draggable с актуальными размерами контейнера.Для мобильных устройств часто необходимо ограничить область, в
которой элементы могут перемещаться. Опция
containers позволяет задавать конкретные
контейнеры:
const draggable = new Draggable(document.querySelectorAll('.list-item'), {
draggable: '.draggable-item',
containers: [document.querySelector('.list-container')]
});
overflow: hidden можно полностью
контролировать видимую область перетаскивания.На больших экранах часто используется горизонтальное или вертикальное перетаскивание, а на мобильных — только вертикальное. Это реализуется через динамическое изменение селектора и опций Draggable:
function initDraggable() {
const direction = window.innerWidth < 768 ? 'vertical' : 'horizontal';
return new Draggable(document.querySelectorAll('.list-item'), {
draggable: '.draggable-item',
axis: direction
});
}
let draggableInstance = initDraggable();
window.addEventListener('resize', () => {
draggableInstance.destroy();
draggableInstance = initDraggable();
});
axis — ограничивает движение по одной
оси, что упрощает интерфейс на маленьких экранах.Draggable не управляет сеткой самостоятельно, поэтому важно правильно организовать контейнер:
.list-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 10px;
}
@media (max-width: 480px) {
.list-container {
grid-template-columns: 1fr;
}
}
minmax позволяет автоматически
подстраивать ширину элементов под доступное пространство.Draggable автоматически работает с мышью и сенсорными экранами, но
для мобильной оптимизации стоит обратить внимание на
handle и touch-action:
const draggable = new Draggable(document.querySelectorAll('.list-item'), {
draggable: '.draggable-item',
handle: '.drag-handle'
});
.drag-handle {
touch-action: pan-y;
}
handle — задаёт конкретную область для
захвата элемента, предотвращая случайные срабатывания.touch-action — оптимизирует жесты,
сохраняя плавность перетаскивания и скролла на мобильных
устройствах.Draggable предоставляет обширный набор событий, таких как
drag:start, drag:move и
drag:stop. Для адаптивного интерфейса можно динамически
менять стиль или размер элемента в зависимости от экрана:
draggable.on('drag:start', (evt) => {
if (window.innerWidth < 768) {
evt.source.style.width = '90%';
}
});
Для улучшения пользовательского опыта на разных экранах Draggable легко интегрируется с GSAP или другими анимационными библиотеками:
import gsap from 'gsap';
draggable.on('drag:stop', (evt) => {
gsap.to(evt.source, { duration: 0.3, scale: 1 });
});
Комбинация:
axis,позволяет создавать полностью адаптивные интерфейсы с перетаскиванием, которые одинаково удобно работают на больших экранах и мобильных устройствах.