Interact.js предоставляет мощный механизм для работы с интерактивными элементами на странице, включая перетаскивание, изменение размера и жесты. Одной из часто востребованных возможностей является автоматическая прокрутка контейнеров при перетаскивании элементов, чтобы пользователи могли перемещать объекты за пределы видимой области без ручного скролла.
Для реализации автопрокрутки используется параметр
autoScroll в настройках draggable объекта.
Этот параметр может быть задан как булево значение или объект с
конфигурацией:
interact('.draggable')
.draggable({
autoScroll: {
container: document.querySelector('.scrollable-container'),
margin: 50,
speed: 400,
}
});
window.Автопрокрутка срабатывает только тогда, когда курсор приближается к краю контейнера, что предотвращает случайное скольжение и обеспечивает естественное взаимодействие.
Параметр autoScroll поддерживает более детальные
настройки:
autoScroll: {
container: document.querySelector('.scrollable-container'),
margin: 50,
speed: 300,
interval: 10
}
speed) может быть увеличена для
больших контейнеров или уменьшена для точного управления.Если необходимо ограничить прокрутку только по горизонтали или
вертикали, можно комбинировать overflow-x и
overflow-y на контейнере вместе с кастомной логикой в
событии dragmove.
dragmoveАвтопрокрутка работает в связке с событием dragmove, что
позволяет синхронизировать позицию перетаскиваемого элемента с
прокруткой:
interact('.draggable')
.draggable({
autoScroll: { container: document.querySelector('.scrollable-container') }
})
.on('dragmove', function (event) {
const target = event.target;
const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;
const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-x', x);
target.setAttribute('data-y', y);
});
Автопрокрутка автоматически смещает контейнер, если курсор подходит к
его краю, а dragmove обновляет координаты элемента. Такой
подход обеспечивает плавное и предсказуемое поведение при перетаскивании
внутри больших областей.
Если на странице есть несколько вложенных прокручиваемых элементов,
autoScroll можно настраивать для каждого контейнера
отдельно:
interact('.draggable')
.draggable({
autoScroll: [
{ container: document.querySelector('.scrollable-container1'), margin: 40, speed: 300 },
{ container: document.querySelector('.scrollable-container2'), margin: 30, speed: 200 }
]
});
Interact.js при этом автоматически определяет, к какому контейнеру ближе курсор, и прокручивает соответствующий блок.
interval и
speed, чтобы не перегружать рендеринг.scroll-behavior: smooth; на контейнере делает движение
более естественным, но может конфликтовать с быстрым обновлением позиции
при dragmove.restrict:interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
],
autoScroll: true
});
Это гарантирует, что элемент останется в пределах видимой области, даже если прокрутка продолжается.
На сенсорных устройствах автопрокрутка также работает, но важно
учитывать размеры сенсорной зоны и скорость движения пальца. Оптимальные
значения для margin находятся в диапазоне 30–70 px. Для
плавного взаимодействия с тачскрином рекомендуется тестировать
одновременно с inertia, чтобы элементы не “выпрыгивали” из
контейнера.
Автопрокрутка Interact.js сочетает в себе точное управление, высокую производительность и гибкость настройки, позволяя создавать сложные интерфейсы с перетаскиванием внутри любых прокручиваемых областей.