IntersectionObserver для эффектов при прокрутке
Используйте IntersectionObserver внутри useEffect для запуска анимаций, отложенной загрузки и бесконечной прокрутки
«IntersectionObserver для эффектов при прокрутке» — бесплатный урок React Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Назначение IntersectionObserver
API IntersectionObserver эффективно отслеживает, входят ли один или несколько элементов в область просмотра браузера или выходят из неё (либо из указанного родительского элемента). В отличие от слушателей прокрутки, которые срабатывают при каждом изменении на один пиксель, наблюдатель вызывает функцию обратного вызова только при пересечении элементом порогового значения, поэтому он гораздо эффективнее для эффектов, связанных с прокруткой.
Функция обратного вызова и запись наблюдателя
Функция обратного вызова получает массив объектов IntersectionObserverEntry — по одному для каждого наблюдаемого элемента. Каждая запись содержит логическое значение isIntersecting (равно true, когда элемент виден) и число intersectionRatio от 0 до 1 (доля элемента, видимая в данный момент). Используйте их, чтобы определить состояние видимости.
Создание наблюдателя в useEffect
Создайте наблюдатель внутри useEffect и вызовите observer.observe(ref.current), чтобы начать отслеживать элемент. Ссылка ref должна быть прикреплена к элементу DOM, который Вы хотите отслеживать. Создавайте наблюдатель после монтирования компонента, чтобы значение ref.current уже было заполнено.
Очистка: unobserve и disconnect
В функции очистки useEffect вызовите observer.unobserve(element), чтобы прекратить отслеживание определённого элемента, или observer.disconnect(), чтобы остановить все наблюдения. Если забыть об очистке, наблюдатель продолжит работу после размонтирования компонента, что может привести к ошибкам или утечкам памяти.
Параметр threshold
Параметр threshold определяет, когда срабатывает функция обратного вызова. Значение 0 вызывает её, как только становится виден хотя бы один пиксель элемента. Значение 1 вызывает её только после полной видимости элемента. Можно также передать массив, например [0, 0.5, 1], чтобы получать вызовы при нескольких уровнях видимости.
Параметр rootMargin
rootMargin расширяет или уменьшает эффективную область пересечения с помощью синтаксиса, похожего на CSS: '100px 0px' вызывает функцию за 100px до того, как элемент войдёт в область просмотра. Используйте '-100px', чтобы вызывать её только после того, как элемент окажется на 100px внутри области просмотра. Это полезно для предварительной загрузки или запуска анимации до того, как элемент станет полностью видимым.
Отложенная загрузка изображений
Чтобы загружать изображения отложенно, сначала задайте атрибут data-src вместо src. Когда наблюдатель срабатывает при isIntersecting: true, скопируйте data-src в src, чтобы инициировать сетевой запрос. Затем вызовите observer.unobserve(entry.target), поскольку изображение нужно загрузить только один раз.
Анимации, запускаемые при прокрутке
Для анимаций плавного появления добавьте класс CSS, когда значение isIntersecting становится равным true: element.classList.add('visible'). Задайте переход в CSS: .card { opacity: 0; transform: translateY(20px); transition: opacity 0.4s, transform 0.4s; } и .card.visible { opacity: 1; transform: none; }. Наблюдатель эффективно запускает анимацию.
Аналитика: отслеживание просмотренного содержимого
IntersectionObserver идеально подходит для отслеживания просмотров. Когда элемент с атрибутом data-analytics-id попадает в область пересечения при пороге 0.5, сгенерируйте событие аналитики. Это точно показывает, какие разделы содержимого пользователи действительно прочитали, и гораздо надёжнее, чем простое измерение процента прокрутки.
Наблюдение за несколькими элементами
Один экземпляр IntersectionObserver может наблюдать за несколькими элементами: для каждого из них вызовите observer.observe(element). Все наблюдаемые элементы используют одну и ту же функцию обратного вызова и одни и те же параметры. Используйте entry.target внутри функции обратного вызова, чтобы определить, какой элемент вызвал уведомление.
Создание хука useInView
Многоразовый хук useInView возвращает [ref, inView]. Присоедините ref к любому элементу и считывайте inView, чтобы узнать, виден ли он в данный момент. Хук принимает объект options для порога и rootMargin. Эта абстракция делает эффекты прокрутки декларативными в любом компоненте.
Порог IntersectionObserver
Что означает порог IntersectionObserver, равный 0?
Итоги урока: IntersectionObserver
IntersectionObserver эффективно отслеживает видимость элементов с помощью isIntersecting и intersectionRatio. Всегда выполняйте очистку с помощью unobserve или disconnect. Используйте threshold, чтобы управлять точкой срабатывания, а rootMargin — чтобы расширить зону обнаружения. Применяйте его для отложенной загрузки, анимаций и отслеживания аналитики.
Часто задаваемые вопросы
Урок «IntersectionObserver для эффектов при прокрутке» бесплатный?
Да — полный текст урока «IntersectionObserver для эффектов при прокрутке» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «IntersectionObserver для эффектов при прокрутке»?
Используйте IntersectionObserver внутри useEffect для запуска анимаций, отложенной загрузки и бесконечной прокрутки Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «IntersectionObserver для эффектов при прокрутке»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Clipboard API: копирование и вставка в React
- Geolocation API в компонентах React
- Notifications API и обработка разрешений
- IntersectionObserver для эффектов при прокрутке