Ленивая инициализация — это подход, при котором объекты Waypoints создаются только в момент их непосредственного использования, а не при загрузке страницы. Такой подход значительно повышает производительность на страницах с большим количеством элементов, требующих отслеживания скролла, поскольку уменьшает нагрузку на память и сокращает количество прослушивателей событий, созданных заранее.
Отложенное создание объектов Waypoint Вместо немедленной инициализации всех waypoint’ов при загрузке документа, создаётся событие или условие, которое инициирует их создание только тогда, когда элемент становится потенциально видимым для пользователя.
Минимизация количества активных слушателей Каждый Waypoint регистрирует слушатель события scroll. Создание их заранее для всех элементов может замедлять работу страницы, особенно на мобильных устройствах. Ленивая инициализация позволяет активировать слушатели только для элементов, которые действительно нужно отслеживать.
Использование Intersection Observer для триггера
Для реализации ленивой инициализации часто применяется
IntersectionObserver. Он отслеживает, когда элемент
появляется в пределах видимой области, и только после этого создаётся
соответствующий Waypoint.
// Функция для создания Waypoint
function createWaypoint(element) {
return new Waypoint({
element: element,
handler: function(direction) {
console.log('Waypoint сработал!', direction);
},
offset: '75%' // срабатывает, когда элемент на 75% виден
});
}
// Настройка IntersectionObserver
const observerOptions = {
root: null,
rootMargin: '0px',
threshold: 0.1 // срабатывает, когда хотя бы 10% элемента в зоне видимости
};
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
createWaypoint(entry.target);
observer.unobserve(entry.target); // удаляем наблюдение после инициализации
}
});
}, observerOptions);
// Применяем наблюдатель к каждому элементу
document.querySelectorAll('.lazy-waypoint').forEach(el => {
observer.observe(el);
});
Ключевые моменты:
observer.unobserve(entry.target)
предотвращает повторное создание Waypoint для одного и того же
элемента.threshold позволяет точно регулировать момент
активации Waypoint.При страницах с десятками или сотнями элементов, ленивое создание Waypoint позволяет избежать проблем с производительностью:
document.querySelectorAll('.section').forEach(section => {
const sectionObserver = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.querySelectorAll('.item').forEach(item => {
createWaypoint(item);
});
observer.unobserve(entry.target);
}
});
}, { threshold: 0.1 });
sectionObserver.observe(section);
});
const wp = new Waypoint({
element: document.querySelector('.single-use'),
handler: function(direction) {
console.log('Сработало один раз!');
this.destroy();
}
});
Для страниц с бесконечной прокруткой или динамическими подгрузками элементов ленивую инициализацию можно комбинировать с MutationObserver:
const mutationObserver = new MutationObserver(mutations => {
mutations.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if (node.matches && node.matches('.lazy-waypoint')) {
observer.observe(node); // подключаем IntersectionObserver
}
});
});
});
mutationObserver.observe(document.body, { childList: true, subtree: true });
Таким образом, любые новые элементы автоматически получают ленивую инициализацию Waypoint без повторной регистрации всех существующих.
offset и threshold Тонкая настройка этих параметров позволяет минимизировать количество вызовов handler и экономить ресурсы.
Разделение видимых и невидимых элементов Если на странице есть элементы, которые никогда не появляются на экране без скролла, можно игнорировать их до момента реальной видимости.
Ограничение количества одновременных Waypoints Для тяжелых страниц можно создавать Waypoints пачками, активируя новые только после срабатывания предыдущих.
Ленивая инициализация позволяет создавать страницы с большим количеством интерактивных элементов без падения производительности, делая работу скролл-триггеров лёгкой и предсказуемой.