ResizeMirror — это расширение для библиотеки Shopify Draggable, которое позволяет автоматически изменять размеры зеркала (mirror) перетаскиваемого элемента в зависимости от размеров исходного элемента и условий контейнера. Оно особенно полезно, когда требуется сохранить визуальную идентичность элемента при drag-and-drop взаимодействиях, учитывая динамические изменения размеров.
import { Draggable, ResizeMirror } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.container'), {
draggable: '.item',
plugins: [ResizeMirror],
resizeMirror: {
minWidth: 50,
minHeight: 50,
maxWidth: 500,
maxHeight: 500,
}
});
Ключевые параметры:
minWidth и minHeight — минимальные размеры
зеркала.maxWidth и maxHeight — максимальные
размеры зеркала.resizeMirror: true — можно также активировать
расширение без дополнительных параметров, тогда размеры зеркала будут
полностью соответствовать оригинальному элементу.Создание зеркала При начале перетаскивания
создается копия исходного элемента, которая получает класс
.draggable-mirror. Расширение ResizeMirror сразу применяет
к зеркалу размеры оригинального элемента.
Изменение размера во время drag Если исходный элемент динамически меняет размеры (например, при адаптивной верстке или контенте с переменной высотой), ResizeMirror автоматически обновляет размеры зеркала, чтобы избежать рассогласования.
Применение ограничений Размеры зеркала всегда проверяются на соответствие минимальным и максимальным ограничениям, заданным в конфигурации. Если значение выходит за пределы, применяется ближайшее допустимое.
Удаление зеркала После завершения drag-and-drop события зеркало удаляется из DOM. ResizeMirror при этом снимает все обработчики событий и освобождает ресурсы.
const draggable = new Draggable(document.querySelectorAll('.container'), {
draggable: '.item',
plugins: [ResizeMirror],
resizeMirror: {
minWidth: 50,
minHeight: 50,
maxWidth: 300,
maxHeight: 300,
scaleContainer: document.querySelector('.container')
}
});
scaleContainer — параметр, который позволяет ограничить
размеры зеркала по границам контейнера, сохраняя соотношение сторон
исходного элемента.resizeMirror: {
maintainAspectRatio: true,
}
maintainAspectRatio гарантирует, что зеркало будет
сохранять пропорции исходного элемента при изменении размера. Это
особенно важно для изображений или карточек товара, где искажение
недопустимо.scaleContainer и
maintainAspectRatio достигается эффект “живого” зеркала,
идентичного исходному элементу.draggable.on('mirror:created', event => {}) —
событие, срабатывающее при создании зеркала.draggable.on('mirror:resized', event => {}) —
событие при изменении размеров зеркала.draggable.on('mirror:destroy', event => {}) —
срабатывает при удалении зеркала из DOM.Эти события позволяют кастомизировать поведение ResizeMirror, добавлять анимацию или дополнительную логику, например, подсветку зон drop.
ResizeMirror обеспечивает стабильное и визуально корректное перетаскивание элементов с динамическими размерами, делая интерфейсы более отзывчивыми и интуитивными. Он полностью интегрируется с остальными плагинами Shopify Draggable и предоставляет мощный инструмент для управления зеркалами перетаскиваемых элементов.