Полный пример страницы с Lazy Blocks — блоки появляются только тогда, когда пользователь доходит до них. Intersection Observer API в действии.
Lazy Blocks — паттерн, при котором каждый раздел страницы невидим до появления в viewport. Браузер отслеживает пересечение элемента с областью видимости и запускает анимацию.
Intersection Observer отслеживает, вошёл ли элемент в видимую
область. Как только это происходит — добавляется класс
.visible,
CSS-переход завершает остальное.
Самый распространённый вариант: opacity от 0 до 1 с translateY(40px → 0). Работает для любого контента.
Дочерние элементы появляются с нарастающей задержкой — создаёт ощущение живого, упорядоченного движения.
Хорошая анимация не привлекает внимание к себе — она делает интерфейс ощутимым и понятным.— Принципы motion-дизайна
Как это работает
Каждый шаг в эволюции ленивой загрузки снижал сложность и повышал надёжность для разработчика.
Применение
Паттерн особенно полезен на длинных лендингах, порталах с контентом и SPA — везде, где большой DOM существует ещё до того, как пользователь добрался до соответствующего раздела.
Стоит избегать чрезмерных задержек и сложных цепочек: анимация должна ускорять восприятие, а не задерживать доступ к контенту.
Минимальная реализация
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
observer.unobserve(entry.target); // сработал — отписываемся
}
});
}, {
threshold: 0.1, // 10% блока в viewport
rootMargin: '0px 0px -60px 0px'
});
document.querySelectorAll('.lazy-block')
.forEach(el => observer.observe(el));