Модуль Inview библиотеки Waypoints предназначен для отслеживания момента появления или исчезновения элемента в области видимости (viewport). В отличие от базового механизма waypoint, который реагирует на пересечение одной фиксированной линии, Inview анализирует положение элемента целиком относительно окна браузера.
Ключевая идея: элемент может находиться в одном из четырёх состояний:
enter — элемент полностью или частично появился в
области видимостиentered — элемент уже находится внутри viewportexit — элемент начал покидать область видимостиexited — элемент полностью вышел за пределы
viewportЭто позволяет более гибко реагировать на прокрутку страницы, особенно при создании анимаций и ленивой загрузки.
<script src="jquery.js"></script>
<script src="jquery.waypoints.min.js"></script>
<script src="inview.min.js"></script>
Пример инициализации:
var inview = new Waypoint.Inview({
element: document.getElementById('block'),
enter: function(direction) {
console.log('Вошёл в экран');
},
entered: function(direction) {
console.log('Находится в экране');
},
exit: function(direction) {
console.log('Начал выход');
},
exited: function(direction) {
console.log('Полностью вышел');
}
});
Срабатывает в момент, когда любая часть элемента появляется в viewport.
enter: function(direction) {
if (direction === 'down') {
console.log('Прокрутка вниз');
} else {
console.log('Прокрутка вверх');
}
}
Особенности:
Срабатывает после enter, когда элемент уже стабильно
находится в зоне видимости.
entered: function() {
this.element.classList.add('visible');
}
Используется для:
Срабатывает, когда элемент начинает покидать viewport.
exit: function(direction) {
console.log('Начало выхода');
}
Срабатывает, когда элемент полностью выходит за границы viewport.
exited: function() {
this.element.classList.remove('visible');
}
Каждый обработчик получает параметр direction:
'down' — прокрутка вниз'up' — прокрутка вверхПример:
enter: function(direction) {
if (direction === 'down') {
console.log('Элемент появился снизу');
}
}
Внутри обработчиков доступен объект waypoint:
entered: function() {
console.log(this.element); // DOM-элемент
}
inview.destroy();
Удаляет все обработчики и освобождает ресурсы.
inview.disable();
inview.enable();
new Waypoint.Inview({
element: document.querySelector('.fade-block'),
enter: function() {
this.element.classList.add('fade-in');
}
});
CSS:
.fade-block {
opacity: 0;
transition: opacity 1s;
}
.fade-in {
opacity: 1;
}
new Waypoint.Inview({
element: document.getElementById('chart'),
enter: function() {
renderChart();
this.destroy(); // больше не нужен
}
});
new Waypoint.Inview({
element: img,
enter: function() {
img.src = img.dataset.src;
}
});
new Waypoint.Inview({
element: document.querySelector('.stats'),
entered: function() {
startCounter();
},
exited: function() {
stopCounter();
}
});
| Характеристика | Waypoints Inview | Intersection Observer |
|---|---|---|
| Поддержка старых браузеров | высокая | ограниченная |
| Простота API | высокая | средняя |
| Производительность | ниже | выше |
| Гибкость настройки | средняя | высокая |
Минимизация количества экземпляров
document.querySelectorAll('.item').forEach(function(el) {
new Waypoint.Inview({ element: el });
});
Лучше группировать или ограничивать количество наблюдаемых элементов.
Удаление после использования
enter: function() {
doSomething();
this.destroy();
}
Использование debounce/throttle
При сложных сценариях стоит ограничивать частоту вызовов внутри обработчиков.
new Waypoint({
element: el,
handler: function() {
console.log('Пересечение точки');
},
offset: '50%'
});
Используется вместе с Inview для более точного контроля.
new Waypoint.Inview({
element: el,
enter: function() {
el.classList.add('inview');
},
exit: function() {
el.classList.remove('inview');
}
});
new Waypoint.Inview({
element: el,
enter: function() {
el.classList.add('animate');
},
exited: function() {
el.classList.remove('animate');
}
});
Позволяет воспроизводить анимацию при каждом появлении элемента.
Inview не изменяет DOM напрямую, а только предоставляет события. Управление полностью остаётся за разработчиком:
1. Повторная инициализация одного элемента
new Waypoint.Inview({ element: el });
new Waypoint.Inview({ element: el }); // ошибка
2. Отсутствие destroy
При динамических интерфейсах (SPA) это приводит к утечкам памяти.
3. Слишком тяжёлые обработчики
enter: function() {
heavyFunction(); // может тормозить прокрутку
}
| Событие | Когда происходит |
|---|---|
| enter | элемент впервые появляется |
| entered | элемент уже в зоне видимости |
| exit | элемент начинает исчезать |
| exited | элемент полностью исчез |
Если элемент быстро проскроллен:
enter и exit могут происходить почти
одновременноentered может не успеть сработатьЭто важно учитывать при построении логики.
По умолчанию отслеживается окно браузера, но возможно указать контейнер:
new Waypoint.Inview({
element: el,
context: document.querySelector('.scroll-container')
});
При работе с React, Vue или Angular:
При большом количестве элементов:
увеличивается нагрузка на scroll events
рекомендуется:
Inview подходит для:
Inview создаёт несколько waypoint-объектов:
Это позволяет точно определять вход и выход из viewport.
var elements = document.querySelectorAll('.track');
elements.forEach(function(el) {
new Waypoint.Inview({ element: el });
});
Inview часто используется как триггер:
enter: function() {
this.element.classList.add('active');
}
Анимация полностью реализуется в CSS.
enter: function() {
if (!this.triggered) {
doSomething();
this.triggered = true;
}
}