В библиотеке Shopify Draggable модуль
Scrollable предназначен для автоматического прокручивания
контейнера или страницы при перетаскивании элементов к границам видимой
области. Это особенно полезно при работе с длинными списками, таблицами
или сетками, где элементы могут выходить за пределы текущей видимой
области.
Scrollable не требует отдельной установки — он является
плагином для основного класса Draggable. Для подключения
достаточно импортировать плагин:
import { Draggable, Plugins } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
plugins: [Plugins.Scrollable]
});
Ключевым моментом является передача плагина в массив
plugins при инициализации. Это автоматически активирует
функционал прокрутки.
Плагин Scrollable поддерживает несколько настраиваемых
опций:
6.50.Пример настройки:
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
plugins: [Plugins.Scrollable],
scrollable: {
speed: 10,
sensitivity: 40,
scrollableElements: [document.querySelector('.draggable-container')],
vertical: true,
horizontal: false
}
});
Когда элемент перетаскивается и достигает зоны чувствительности около края контейнера:
speed.Важным аспектом является то, что Scrollable работает не
только с вертикальной прокруткой, но и с горизонтальной, если это
необходимо для интерфейсов с широкими таблицами или галереями.
Scrollable поддерживает работу с несколькими
контейнерами одновременно. Для этого в опции
scrollableElements можно передать массив элементов:
scrollableElements: [
document.querySelector('.container-1'),
document.querySelector('.container-2')
]
Плагин автоматически определит, в каком контейнере находится перетаскиваемый элемент, и будет прокручивать только этот контейнер.
Scrollable совместим с большинством других плагинов
Draggable, включая:
Sortable – при сортировке элементов внутри длинного
списка прокрутка позволяет дотаскивать элементы до конца списка.Swappable – при замене элементов между контейнерами
прокрутка поддерживает плавное перемещение за пределы видимой
области.Mirror – визуальное отображение перетаскиваемого
элемента обновляется синхронно с прокруткой, предотвращая разрывы или
«подвисания» визуала.Важно инициализировать плагины в правильном порядке, чтобы
Scrollable не конфликтовал с вычислением позиции зеркала
(Mirror) или placeholder.
Плагин предоставляет ограниченный набор публичных методов, но активно использует события Draggable:
drag:move – срабатывает на каждом шаге перемещения,
позволяет вручную контролировать прокрутку при необходимости.drag:start и drag:stop – можно
использовать для активации или деактивации прокрутки в специфических
условиях.Прямого метода для включения/выключения прокрутки в API нет, но это
можно реализовать через управление параметром
scrollableElements во время работы.
speed и увеличение
sensitivity делает прокрутку более предсказуемой.overflow: auto или
scroll, иначе прокрутка не будет работать.const draggable = new Draggable(document.querySelectorAll('.list-container'), {
draggable: '.list-item',
plugins: [Plugins.Scrollable, Plugins.Sortable],
scrollable: {
speed: 8,
sensitivity: 60,
scrollableElements: [document.querySelector('.list-container')],
vertical: true,
horizontal: false
}
});
draggable.on('drag:move', (event) => {
console.log(`Перетаскиваем элемент: ${event.source.textContent}`);
});
В этом примере элементы списка можно перетаскивать и сортировать, при этом контейнер автоматически прокручивается при достижении границ, что делает работу с длинными списками максимально плавной и удобной.