Intersection Observer API
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since маÑÑ 2019 г..
* Some parts of this feature may have varying levels of support.
Intersection Observer API позволÑÐµÑ Ð²ÐµÐ±-пÑиложениÑм аÑÐ¸Ð½Ñ Ñонно ÑледиÑÑ Ð·Ð° изменением пеÑеÑеÑÐµÐ½Ð¸Ñ ÑлеменÑа Ñ ÐµÐ³Ð¾ ÑодиÑелем или облаÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи докÑменÑа viewport.
ÐÑÑоÑиÑеÑки обнаÑÑжение видимоÑÑи оÑделÑного ÑлеменÑа или видимоÑÑи двÑÑ ÑлеменÑов по оÑноÑÐµÐ½Ð¸Ñ Ð´ÑÑг к дÑÑÐ³Ñ Ð±Ñло непÑоÑÑой задаÑей. ÐаÑианÑÑ ÑеÑÐµÐ½Ð¸Ñ ÑÑой задаÑи бÑли ненадÑжнÑми и замедлÑли ÑабоÑÑ Ð±ÑаÑзеÑа. РнеÑÑаÑÑÑÑ, по меÑе Ñого как веб "взÑоÑлел", поÑÑебноÑÑÑ Ð² ÑеÑении ÑÑой пÑÐ¾Ð±Ð»ÐµÐ¼Ñ ÑолÑко ÑоÑла по многим пÑиÑинам, Ñаким как:
- ÐÑÐ»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ð³ÑÑзка изобÑажений или дÑÑгого конÑенÑа по меÑе пÑокÑÑÑки ÑÑÑаниÑÑ.
- РеализаÑÐ¸Ñ Ð²ÐµÐ±-ÑайÑов Ñ "беÑконеÑнÑм ÑкÑоллом", где конÑÐµÐ½Ñ Ð¿Ð¾Ð´Ð³ÑÑжаеÑÑÑ Ð¿Ð¾ меÑе Ñого как ÑÑÑаниÑа пÑокÑÑÑиваеÑÑÑ Ð²Ð½Ð¸Ð·, и полÑзоваÑÐµÐ»Ñ Ð½Ðµ нÑжно пеÑеклÑÑаÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑÑÑаниÑами.
- ÐÑÑÑÑ Ð¾ видимоÑÑи ÑÐµÐºÐ»Ð°Ð¼Ñ Ñ ÑелÑÑ Ð¿Ð¾ÑÑиÑаÑÑ Ð´Ð¾Ñ Ð¾Ð´Ñ Ð¾Ñ Ð½ÐµÑ.
- ÐÑинÑÑие ÑеÑениÑ, запÑÑкаÑÑ Ð»Ð¸ какой-Ñо пÑоÑеÑÑ Ð¸Ð»Ð¸ анимаÑÐ¸Ñ Ð² завиÑимоÑÑи Ð¾Ñ Ñого, ÑÐ²Ð¸Ð´Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑезÑлÑÑÐ°Ñ Ð¸Ð»Ð¸ неÑ.
РпÑоÑлом ÑеализаÑÐ¸Ñ Ð¾Ð±Ð½Ð°ÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑеÑеÑÐµÐ½Ð¸Ñ ÑлеменÑов подÑазÑмевала иÑполÑзование обÑабоÑÑиков ÑобÑÑий и Ñиклов, вÑзÑваÑÑиÑ
меÑÐ¾Ð´Ñ Ñипа Element.getBoundingClientRect(), ÑÑÐ¾Ð±Ñ ÑобÑаÑÑ Ð½ÐµÐ¾Ð±Ñ
одимÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ каждом заÑÑонÑÑом ÑлеменÑе. ÐоÑколÑÐºÑ Ð²ÐµÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´ ÑабоÑÐ°ÐµÑ Ð² оÑновном поÑоке, возникаÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ñ Ð¿ÑоизводиÑелÑноÑÑÑÑ.
РаÑÑмоÑÑим веб-ÑÑÑаниÑÑ Ñ Ð±ÐµÑконеÑнÑм ÑкÑоллом. Ðа ней иÑполÑзÑеÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑиодиÑеÑки ÑазмеÑаемой по вÑей ÑÑÑаниÑе Ñекламой, повÑÑÐ´Ñ Ð°Ð½Ð¸Ð¼Ð¸ÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð³ÑаÑика, а Ñакже библиоÑека Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²ÑплÑваÑÑÐ¸Ñ Ð¾ÐºÐ¾Ð½. РвÑе ÑÑи веÑи иÑполÑзÑÑÑ Ñвои ÑобÑÑвеннÑе пÑавила Ð´Ð»Ñ Ð¾Ð±Ð½Ð°ÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑеÑеÑений, и вÑе они запÑÑÐµÐ½Ñ Ð² оÑновном поÑоке. ÐвÑÐ¾Ñ ÑайÑа Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°Ð¶Ðµ не подозÑеваÑÑ Ð¾Ð± ÑÑой пÑоблеме, а Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ знаÑÑ, как ÑабоÑаÑÑ ÑÑоÑонние библиоÑеки изнÑÑÑи. Ð Ñо же вÑÐµÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿Ð¾ Ñ Ð¾Ð´Ñ Ð¿ÑокÑÑÑки ÑÑÑаниÑÑ ÑÑалкиваеÑÑÑ Ñ Ñем, ÑÑо ÑабоÑа ÑайÑа замедлÑеÑÑÑ Ð¿Ð¾ÑÑоÑннÑм ÑÑабаÑÑванием обнаÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑеÑеÑениÑ, ÑÑо в иÑоге пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо полÑзоваÑÐµÐ»Ñ Ð½ÐµÐ´Ð¾Ð²Ð¾Ð»ÐµÐ½ бÑаÑзеÑом, ÑайÑом и Ñвоим компÑÑÑеÑом.
Intersection Observer API даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²ÑполниÑÑÑ Ð¿Ñи пеÑеÑеÑении наблÑдаемÑм ÑлеменÑом гÑÐ°Ð½Ð¸Ñ Ð´ÑÑгого ÑлеменÑа (или облаÑÑи видимоÑÑи докÑменÑа viewport), либо пÑи изменении велиÑÐ¸Ð½Ñ Ð¿ÐµÑеÑеÑÐµÐ½Ð¸Ñ Ð½Ð° опÑеделÑнное знаÑение. Таким обÑазом, болÑÑе Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи вÑÑиÑлÑÑÑ Ð¿ÐµÑеÑеÑение ÑлеменÑов в оÑновном поÑоке, и бÑаÑÐ·ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑимизиÑоваÑÑ ÑÑи пÑоÑеÑÑÑ Ð½Ð° ÑÐ²Ð¾Ñ ÑÑмоÑÑение.
Observer API не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑзнаÑÑ ÑоÑное ÑиÑло пикÑелей или опÑеделиÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑе пикÑели в пеÑеÑеÑении; однако, его иÑполÑзование покÑÑÐ²Ð°ÐµÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ ÑаÑÑÑе ÑÑенаÑии вÑоде "ÐÑли ÑлеменÑÑ Ð¿ÐµÑеÑекаÑÑÑÑ Ð½Ð° N%, Ñделай Ñо-Ñо".
ÐÑновнÑе понÑÑиÑ
Intersection Observer API позволÑÐµÑ ÑказаÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана вÑÑкий Ñаз Ð´Ð»Ñ ÑлеменÑа (target) пÑи пеÑеÑеÑении его Ñ Ð¾Ð±Ð»Ð°ÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи докÑменÑа (по ÑмолÑаниÑ) или заданнÑм ÑлеменÑом (root).
РоÑновном, иÑполÑзÑеÑÑÑ Ð¾ÑÑлеживание пеÑеÑеÑÐµÐ½Ð¸Ñ ÑлеменÑа Ñ Ð¾Ð±Ð»Ð°ÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи (необÑ
одимо ÑказаÑÑ null в каÑеÑÑве коÑневого ÑлеменÑа).
ÐÑполÑзÑеÑе ли Ð²Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи или дÑÑгой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² каÑеÑÑве коÑневого, API ÑабоÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾, вÑзÑÐ²Ð°Ñ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ Ð²Ð°Ð¼Ð¸ колбÑк-ÑÑнкÑиÑ, вÑÑкий Ñаз, когда видимоÑÑÑ Ñелевого ÑлеменÑа изменÑÐµÑ Ñак, ÑÑо она пеÑеÑÐµÐºÐ°ÐµÑ Ð² нÑжной ÑÑепени коÑневой ÑлеменÑ.
СÑÐµÐ¿ÐµÐ½Ñ Ð¿ÐµÑеÑеÑÐµÐ½Ð¸Ñ Ñелевого и коÑневого ÑлеменÑа задаÑÑÑÑ Ð² диапазоне Ð¾Ñ 0.0 до 1.0, где 1.0 ÑÑо полное пеÑеÑеÑение Ñелевого ÑлеменÑа гÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ñневого.
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ
ÐÐ»Ñ Ð½Ð°Ñала Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа нÑжно ÑоздаÑÑ Ð¾Ð±ÑекÑ-наблÑдаÑелÑ, ÑказаÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð²Ñзова и наÑÑÑойки оÑÑлеживаниÑ:
var options = {
root: document.querySelector("#scrollArea"),
rootMargin: "0px",
threshold: 1.0,
};
var callback = function (entries, observer) {
/* Content excerpted, show below */
};
var observer = new IntersectionObserver(callback, options);
ÐаÑамеÑÑ threshold Ñо знаÑением 1.0 ознаÑÐ°ÐµÑ ÑÑо ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана пÑи 100% пеÑеÑеÑении обÑекÑа (за коÑоÑÑм Ð¼Ñ Ñледим) Ñ Ð¾Ð±ÑекÑом root
ÐаÑÑÑойки
- root
-
ÐÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ¾ÑоÑÑй иÑполÑзÑеÑÑÑ Ð² каÑеÑÑве облаÑÑи пÑоÑмоÑÑа Ð´Ð»Ñ Ð¿ÑовеÑки видимоÑÑи Ñелевого ÑлеменÑа. Ðолжен бÑÑÑ Ð¿Ñедком Ñелевого ÑлеменÑа. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи бÑаÑзеÑа еÑли не опÑеделÑн или Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение null.
- rootMargin
-
ÐÑÑÑÑÐ¿Ñ Ð²Ð¾ÐºÑÑг root. ÐогÑÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ°Ðº ÑвойÑÑво css margin: "
10px 20px 30px 40px" (top, right, bottom, left).ÐнаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ задаваÑÑ Ð² пÑоÑенÑÐ°Ñ . Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ñе паÑамеÑÑÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð² нÑли. - threshold
-
ЧиÑло или маÑÑив ÑиÑел, ÑказÑваÑÑий, пÑи каком пÑоÑенÑе видимоÑÑи Ñелевого ÑлеменÑа должен ÑÑабоÑаÑÑ callback. ÐапÑимеÑ, в ÑÑом ÑлÑÑае callback ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿Ñи поÑвлении в зоне видимоÑÑи каждÑй 25% Ñелевого ÑлеменÑа: [0, 0.25, 0.5, 0.75, 1]
Целевой ÑлеменÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð½Ð°Ð±Ð»ÑдаÑÑÑÑ
ÐоÑле Ñого, как Ð²Ñ Ñоздали наблÑдаÑелÑ, вам нÑжно даÑÑ ÐµÐ¼Ñ Ñелевой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð¿ÑоÑмоÑÑа:
var target = document.querySelector("#listItem");
observer.observe(target);
ÐÑÑкий Ñаз, когда ÑÐµÐ»Ñ Ð´Ð¾ÑÑÐ¸Ð³Ð°ÐµÑ Ð¿Ð¾Ñогового знаÑениÑ, Ñказанного Ð´Ð»Ñ IntersectionObserver, вÑзÑваеÑÑÑ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑÐ¸Ñ callback. Ðде callback полÑÑÐ°ÐµÑ ÑпиÑок обÑекÑов IntersectionObserverEntry и наблÑдаÑелÑ:
var callback = function (entries, observer) {
entries.forEach((entry) => {
entry.time; // a DOMHightResTimeStamp indicating when the intersection occurred.
entry.rootBounds; // a DOMRectReadOnly for the intersection observer's root.
entry.boundingClientRect; // a DOMRectReadOnly for the intersection observer's target.
entry.intersectionRect; // a DOMRectReadOnly for the visible portion of the intersection observer's target.
entry.intersectionRatio; // the number for the ratio of the intersectionRect to the boundingClientRect.
entry.target; // the Element whose intersection with the intersection root changed.
entry.isIntersecting; // intersecting: true or false
});
};
ÐбÑаÑиÑе внимание, ÑÑо колбÑк-ÑÑнкÑÐ¸Ñ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð² главном поÑоке и должна вÑполнÑÑÑÑÑ ÐºÐ°Ðº можно бÑÑÑÑее, поÑÑÐ¾Ð¼Ñ ÐµÑли ÑÑо-Ñо оÑÐ½Ð¸Ð¼Ð°ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ вÑемени, Ñо иÑполÑзÑйÑе Window.requestIdleCallback().
Также обÑаÑиÑе внимание, ÑÑо еÑли Ð²Ñ Ñказали опÑÐ¸Ñ root, Ñелевой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¿Ð¾Ñомком коÑневого ÑлеменÑа.
ÐнÑеÑÑейÑÑ
IntersectionObserver-
ÐÑновной инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ API Intersection Observer. ÐÑедоÑÑавлÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ observer, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ð±Ð»ÑдаÑÑ Ð»Ñбое колиÑеÑÑво ÑелевÑÑ ÑлеменÑов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ и Ñой же конÑигÑÑаÑии пеÑеÑеÑениÑ. ÐаждÑй observer Ð¼Ð¾Ð¶ÐµÑ Ð°ÑÐ¸Ð½Ñ Ñонно наблÑдаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² пеÑеÑеÑении Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð´Ð½Ð¸Ð¼ или неÑколÑкими ÑелевÑми ÑлеменÑами и обÑим ÑлеменÑом-пÑедком или Ñ Ð¸Ñ Ð²ÐµÑÑ Ð½Ð¸Ð¼ ÑÑовнем
Document's viewport. ÐÑедок или облаÑÑÑ Ð¿ÑоÑмоÑÑа ÑпоминаеÑÑÑ ÐºÐ°Ðº root. IntersectionObserverEntry-
ÐпиÑÑÐ²Ð°ÐµÑ Ð¿ÐµÑеÑеÑение Ð¼ÐµÐ¶Ð´Ñ ÑелевÑм ÑлеменÑом и его коÑневÑм конÑейнеÑом в опÑеделÑннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð°. ÐбÑекÑÑ ÑÑого Ñипа могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ ÑолÑко двÑÐ¼Ñ ÑпоÑобами: в каÑеÑÑве Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð²Ð°Ñего колбÑка IntersectionObserver или пÑÑÑм вÑзова
IntersectionObserver.takeRecords().
СпеÑиÑикаÑии
| Specification |
|---|
| Intersection Observer > # intersection-observer-interface > |