Библиотека Shopify Draggable предоставляет мощный инструмент для создания перетаскиваемых элементов в интерфейсе. Одними из ключевых концепций, обеспечивающих гибкость перетаскивания, являются placeholder и mirror элементы. Они позволяют визуально отслеживать процесс drag-and-drop, делая интерфейс интуитивно понятным.
Mirror — это копия перетаскиваемого элемента, которая визуально следует за курсором мыши во время перетаскивания. Он не заменяет оригинальный элемент, а создается динамически библиотекой и управляется событиями Draggable.
Mirror создается автоматически при инициализации Draggable:
import { Draggable } from '@shopify/draggable';
const container = document.querySelector('.draggable-container');
const draggable = new Draggable(container, {
draggable: '.draggable-item',
});
В этом примере все элементы с классом .draggable-item
будут иметь mirror при перетаскивании. Mirror элемент наследует стили
оригинала, но позиционируется абсолютно поверх других элементов.
Mirror можно кастомизировать через события:
draggable.on('mirror:create', (event) => {
event.mirror.style.backgroundColor = '#f0f0f0';
event.mirror.style.boxShadow = '0 4px 10px rgba(0,0,0,0.2)';
});
Событие mirror:create позволяет изменить внешний вид
зеркала перед его отображением. Дополнительно можно использовать события
mirror:attached и mirror:destroy для
управления жизненным циклом mirror элемента.
Особенности mirror элемента:
z-index.Placeholder используется для визуального обозначения позиции, куда может быть перемещен элемент. Он создается в контейнере и показывает пользователю, где будет вставлен перетаскиваемый объект после отпускания мыши.
Для активации placeholder необходимо подключить модуль
Sortable или использовать plugins
Draggable:
import { Draggable, Plugins } from '@shopify/draggable';
const draggable = new Draggable(document.querySelector('.draggable-container'), {
draggable: '.draggable-item',
plugins: [Plugins.Placeholder],
});
Placeholder можно настроить с помощью опций плагина:
Plugins.Placeholder.defaults = {
tagName: 'div',
className: 'draggable-placeholder',
};
Параметры:
tagName — тег, используемый для placeholder.className — CSS класс для стилизации.draggable.on('placeholder:created', (event) => {
event.placeholder.style.border = '2px dashed #999';
event.placeholder.style.height = `${event.dragged.clientHeight}px`;
});
События позволяют динамически управлять размером, стилем и поведением placeholder. Это важно при создании адаптивных интерфейсов, где элементы могут иметь разную высоту и ширину.
В процессе перетаскивания mirror и placeholder работают совместно:
draggable.on('drag:start', (event) => {
console.log('Начато перетаскивание', event.source);
});
draggable.on('drag:over', (event) => {
console.log('Элемент над placeholder', event.over);
});
draggable.on('drag:stop', (event) => {
console.log('Перетаскивание завершено', event.source);
});
Использование событий позволяет реализовать расширенные сценарии, например:
mirror:create, чтобы обеспечить визуальное соответствие
оригиналу.Mirror и placeholder обеспечивают высокую интерактивность интерфейсов с перетаскиванием и позволяют создавать плавные и предсказуемые drag-and-drop сценарии в любых приложениях на базе Shopify Draggable.