Библиотека Shopify Draggable предоставляет мощный инструмент для реализации перетаскивания элементов на странице, но внешний вид и анимации поведения элементов полностью зависят от CSS. Для качественной кастомизации необходимо понимать, какие классы и состояния добавляются библиотекой и как их можно использовать для стилизации.
Draggable автоматически применяет несколько CSS-классов к элементам в зависимости от их состояния в процессе перетаскивания:
.draggable-source – присваивается
исходным элементам, которые могут быть перемещены. Используется для
задания начального вида элементов.
.draggable-source--is-dragging –
добавляется элементу в момент активного перетаскивания. Позволяет
визуально выделять перемещаемый объект (например, изменять прозрачность,
добавлять тень или трансформацию).
.draggable-source--is-moving –
активен во время перемещения, отличается от состояния
--is-dragging тем, что может использоваться для
динамических анимаций при смещении.
.draggable-container--is-over –
применим к контейнеру, когда перетаскиваемый элемент находится над ним.
Позволяет менять стиль зоны, куда возможно размещение элемента
(например, подсветка или изменение границы).
.draggable-mirror – создается
библиотекой как визуальная копия перемещаемого элемента, которая следует
за курсором. Этот элемент можно стилизовать отдельно для более
выразительных эффектов перемещения.
Исходный элемент можно стилизовать так, чтобы он выглядел интерактивно даже в неподвижном состоянии:
.draggable-source {
cursor: grab;
transition: box-shadow 0.2s ease, transform 0.2s ease;
border-radius: 6px;
background-color: #f9f9f9;
}
Чтобы подчеркнуть активное перетаскивание, можно использовать
комбинацию box-shadow, scale и
opacity:
.draggable-source--is-dragging {
cursor: grabbing;
opacity: 0.8;
transform: scale(1.05);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15);
}
Контейнер, принимающий элементы, можно подсветить при наведении перемещаемого объекта:
.draggable-container--is-over {
border: 2px dashed #0074d9;
background-color: #e6f0ff;
}
mirror)Элемент-миррор создается динамически и его можно использовать для создания плавного и реалистичного эффекта перетаскивания:
.draggable-mirror {
pointer-events: none;
position: fixed;
z-index: 1000;
transform: translate3d(0, 0, 0);
transition: transform 0.1s ease;
opacity: 0.9;
}
Для больших проектов удобно использовать CSS-переменные для унификации стилей Draggable:
:root {
--draggable-bg: #f9f9f9;
--draggable-dragging-scale: 1.05;
--draggable-shadow: 0 10px 20px rgba(0, 0, 0, 0.15);
}
.draggable-source {
background-color: var(--draggable-bg);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.draggable-source--is-dragging {
transform: scale(var(--draggable-dragging-scale));
box-shadow: var(--draggable-shadow);
}
Это позволяет быстро менять тему перетаскивания без правки каждого правила отдельно.
Для плавного взаимодействия с пользователем рекомендуется использовать CSS-переходы и анимации на все изменяемые свойства:
transform – идеален для перемещений и
масштабирования без потери производительности.opacity – для мягкого появления и
исчезания.box-shadow – для эффекта глубины при
перетаскивании..draggable-source {
transition: transform 0.25s cubic-bezier(0.25, 0.8, 0.25, 1),
box-shadow 0.25s cubic-bezier(0.25, 0.8, 0.25, 1),
opacity 0.25s ease;
}
Draggable поддерживает возможность добавления своих классов через опции при инициализации. Это позволяет создавать уникальные эффекты без модификации стандартных классов:
const draggable = new Draggable.Draggable(container, {
draggable: '.custom-draggable',
mirror: {
constrainDimensions: true
}
});
CSS для кастомных классов:
.custom-draggable {
border: 1px solid #ccc;
padding: 8px;
border-radius: 4px;
}
.custom-draggable--is-dragging {
border-color: #0074d9;
background-color: #dceeff;
}
.draggable-mirror позволяет создать эффект “прыжка” или
“тягучести” при перемещении.::before и ::after для добавления декоративных
элементов при перетаскивании..draggable-source и .draggable-mirror можно
менять в зависимости от размера экрана через медиазапросы.@media (max-width: 768px) {
.draggable-source--is-dragging {
transform: scale(1.02);
}
}
Эти техники обеспечивают гибкую и высококачественную кастомизацию интерфейсов с Draggable, позволяя создавать профессиональный и отзывчивый UX.