Библиотека Shopify Draggable предоставляет мощные инструменты для реализации интерактивного перетаскивания элементов на веб-странице. Визуальные эффекты при перетаскивании выполняют ключевую роль в создании интуитивно понятного интерфейса, повышая отзывчивость и удобство взаимодействия пользователя с элементами.
Эффекты делятся на несколько категорий: изменение внешнего вида перетаскиваемого элемента, анимации при перемещении, визуальные индикаторы цели размещения и эффекты при завершении перетаскивания.
Одним из наиболее часто используемых эффектов является
изменение стиля элемента при захвате. Shopify Draggable
предоставляет событие drag:start, которое позволяет
применить классы CSS для изменения внешнего вида:
const draggable = new Draggable(document.querySelectorAll('.list'), {
draggable: '.item'
});
draggable.on('drag:start', (event) => {
event.source.classList.add('dragging');
});
draggable.on('drag:stop', (event) => {
event.source.classList.remove('dragging');
});
Ключевые моменты:
event.source — элемент, который перемещается.dragging позволяет управлять стилями
через CSS: тень, прозрачность, масштаб.Пример CSS:
.dragging {
opacity: 0.7;
transform: scale(1.05);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
Shopify Draggable поддерживает анимацию перемещения соседних
элементов, когда пользователь перемещает элемент по списку. Для
этого используется плагин Sortable. Эффект плавного
смещения соседних элементов достигается с помощью CSS переходов и
настройки плагина.
const sortable = new Draggable.Sortable(document.querySelectorAll('.list'), {
draggable: '.item',
delay: 100
});
sortable.on('sortable:sorted', (event) => {
console.log('Элемент отсортирован:', event.source);
});
CSS для анимации:
.item {
transition: transform 0.3s ease;
}
Особенности:
transition применяется к перемещаемым элементам для
плавного смещения.delay позволяет задавать задержку перед
началом перетаскивания, улучшая точность и предотвращая случайные
срабатывания.Shopify Draggable предоставляет возможность использовать
placeholders — визуальные индикаторы, показывающие,
куда будет вставлен элемент. Для их реализации используется событие
drag:move:
draggable.on('drag:move', (event) => {
const placeholder = document.querySelector('.placeholder');
const rect = event.source.getBoundingClientRect();
placeholder.style.top = `${rect.top}px`;
placeholder.style.left = `${rect.left}px`;
});
CSS для placeholder:
.placeholder {
position: absolute;
width: 100px;
height: 50px;
background-color: rgba(0, 150, 255, 0.2);
border: 2px dashed #0096ff;
pointer-events: none;
}
Рекомендации по использованию:
pointer-events: none, чтобы элемент не
блокировал события мыши.При событии drag:stop или sortable:stop
можно реализовать анимацию возвращения элемента на место или
закрепления в новом положении. Пример с плавным возвратом:
draggable.on('drag:stop', (event) => {
event.source.style.transition = 'transform 0.3s ease';
event.source.style.transform = 'none';
setTimeout(() => {
event.source.style.transition = '';
}, 300);
});
Важные моменты:
Пример динамического подсвечивания:
draggable.on('drag:move', (event) => {
const target = document.elementFromPoint(event.sensorEvent.clientX, event.sensorEvent.clientY);
document.querySelectorAll('.item').forEach(item => item.classList.remove('highlight'));
if (target && target.classList.contains('item')) {
target.classList.add('highlight');
}
});
CSS для подсветки:
.highlight {
background-color: rgba(255, 200, 0, 0.3);
}
drag:move для высокой производительности.Эти подходы обеспечивают интерактивный и отзывчивый интерфейс, при котором пользователь всегда понимает текущее состояние перетаскивания и возможное место размещения элемента.