Библиотека Interact.js предоставляет мощные возможности для реализации интерактивного поведения элементов на странице, включая перетаскивание, изменение размеров и жесты. Одной из полезных функций является управление прокруткой окна браузера, что особенно актуально для динамических интерфейсов и сложных пользовательских взаимодействий.
Interact.js позволяет отслеживать движение мыши или касания и реагировать на них, изменяя положение элементов и одновременно контролируя прокрутку. Основные моменты:
Автоскроллинг в Interact.js настраивается через объект
autoScroll. Пример базовой конфигурации:
interact('.draggable')
.draggable({
autoScroll: {
container: window,
margin: 50,
speed: 400
},
listeners: {
move(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);
}
}
});
Пояснение ключевых параметров:
container – объект, который будет прокручиваться
(window или элемент-контейнер).margin – расстояние от границы контейнера, при
достижении которого начинается прокрутка.speed – скорость прокрутки в пикселях за секунду. Можно
задавать положительные или отрицательные значения для разных
направлений.Помимо прокрутки окна, Interact.js поддерживает автоскроллинг
элементов с overflow. Для этого container указывается как
HTML-элемент:
const scrollContainer = document.querySelector('.scrollable');
interact('.draggable')
.draggable({
autoScroll: {
container: scrollContainer,
margin: 30,
speed: 300
},
listeners: {
move(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);
}
}
});
Использование внутренних контейнеров позволяет создавать сложные интерфейсы с вложенной прокруткой и интерактивными элементами без вмешательства в глобальную прокрутку окна.
Interact.js позволяет менять параметры автоскроллинга во время
перетаскивания. Для этого можно использовать обработчик
dragmove:
interact('.draggable')
.draggable({
listeners: {
move(event) {
const target = event.target;
if (event.clientY < 100) {
event.interactable.options.autoScroll.speed = 500;
} else if (event.clientY > window.innerHeight - 100) {
event.interactable.options.autoScroll.speed = 500;
} else {
event.interactable.options.autoScroll.speed = 0;
}
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);
}
}
});
Такой подход обеспечивает плавную и адаптивную прокрутку в зависимости от положения курсора, предотвращая резкие сдвиги и обеспечивая комфортное управление.
Можно задавать ограничения, чтобы предотвратить выход элемента за
пределы видимой области. Для этого используются опции
modifiers:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrict({
restriction: 'parent',
endOnly: true
})
],
autoScroll: true,
listeners: {
move(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);
}
}
});
Это позволяет сочетать управление прокруткой с ограничениями по границам контейнера, предотвращая выход элементов за пределы интерфейса.
Interact.js предоставляет события для контроля автоскроллинга и изменений позиции:
scrollstart – начало прокрутки контейнера.scrollmove – движение во время прокрутки.scrollend – окончание прокрутки.Использование этих событий позволяет синхронизировать дополнительные эффекты, например, анимацию фоновых элементов или динамическое изменение интерфейса при прокрутке.
window для глобальной прокрутки и
HTML-элементы для локальной прокрутки.modifiers и автоскроллинг для
предотвращения выхода элементов за границы контейнера.speed динамически для более плавного
интерфейса.Этот подход позволяет создавать высокоинтерактивные элементы, которые естественно реагируют на действия пользователя, оставаясь в рамках интерфейса и плавно управляя прокруткой окна и контейнеров.