IntersectionObserver判斷是否在可視區(qū)域詳解
前言
在日常的開(kāi)發(fā)過(guò)程中,有時(shí)候會(huì)有一些要求判斷節(jié)點(diǎn)是否進(jìn)入可視化區(qū)域的需求。例如:判斷信息是否在可視區(qū)域曝光再進(jìn)行曝光,圖片懶加載等。通常我們可以通過(guò)scroll和getBoundingclient來(lái)進(jìn)行判斷。
el.offsetTop - document.documentElement.scrollTop <= 視口高度 // 或 el.getBoundingClientRect().top <= 視口高度
但是scroll,getBoundingclient會(huì)引起回流,計(jì)算過(guò)于頻繁可能會(huì)引起很大的性能問(wèn)題,例如用戶(hù)在使用的過(guò)程中,滑動(dòng)卡頓啊等。那么有沒(méi)有更好的辦法來(lái)代替判斷是否進(jìn)入可視化區(qū)域呢?使用IntersectionObserver即可解決這種煩惱。
概念
Intersection Observer API 提供了一種異步檢測(cè)目標(biāo)元素與祖先元素或 viewport 相交情況變化的方法。瀏覽器顯示頁(yè)面的時(shí)候,首先會(huì)用js處理邏輯,然后進(jìn)行樣式計(jì)算及布局,在內(nèi)存里面形成之后會(huì)畫(huà)我們的屏幕上去,這一個(gè)過(guò)程就叫1幀,如果1幀中任一個(gè)階段占用的時(shí)間過(guò)長(zhǎng),就會(huì)影響到我們的平均幀率,導(dǎo)致掉幀等。而IntersectionObserver會(huì)在瀏覽器空閑的時(shí)候,也就是幀空閑的時(shí)候才去執(zhí)行,不會(huì)一直占用我們的主線程,從而提高了性能及體驗(yàn)。
使用
IntersectionObserver接收2個(gè)參數(shù)callback和options。具體可見(jiàn)MDN
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box1 {
width: 500px;
height: 500px;
border: 1px salmon solid;
overflow-y: scroll;
}
.box2 {
width: 100px;
height: 1000px;
background: red;
}
.box3 {
width: 100px;
height: 100px;
background: blue;
}
</style>
</head>
<body>
<div class="box1">
<div class="box2"></div>
<div class="box3" id="box3"></div>
</div>
<script>
let options = {
root: document.querySelector('#box1'),
rootMargin: '0px',
threshold: 1.0
}
let callback = (entries, observer) => {
entries.forEach(entry => {
// entry.boundingClientRect
// 目標(biāo)元素的區(qū)域信息,getBoundingClientRect()的返回值
// entry.intersectionRatio
// 目標(biāo)元素的可見(jiàn)比例
// entry.intersectionRect
// 目標(biāo)元素與根元素交叉的區(qū)域信息
// entry.isIntersecting
// 目標(biāo)元素是否進(jìn)入根元素區(qū)域
// entry.rootBounds
// 根元素的矩形區(qū)域信息
// entry.target
// 被觀察dom節(jié)點(diǎn)
// entry.time
// 相交發(fā)生時(shí)距離頁(yè)面打開(kāi)時(shí)的毫秒數(shù)
});
};
let observer = new IntersectionObserver(callback, options);
let target = document.querySelector('#box3');
observer.observe(target);
</script>
</body>
</html>不兼容Safari 12.1以下和Firefox for Android 55以下,具體可以看MDN。 可以使用polyfill版解決該問(wèn)題。
注意
當(dāng)target元素已在root可視范圍,但是被其他元素遮蓋住了,該target是否被其他元素遮蓋不可判斷。
以上就是IntersectionObserver判斷是否在可視區(qū)域詳解的詳細(xì)內(nèi)容,更多關(guān)于IntersectionObserver 判斷可視區(qū)域的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript檢查數(shù)字是否為整數(shù)或浮點(diǎn)數(shù)的方法
這篇文章主要介紹了JavaScript檢查數(shù)字是否為整數(shù)或浮點(diǎn)數(shù)的方法,涉及javascript類(lèi)型判斷的相關(guān)技巧,需要的朋友可以參考下2015-06-06
JavaScript數(shù)組分組groupBy示例詳解
JavaScript?最近發(fā)布了一個(gè)方法?Object.groupBy,可以對(duì)可迭代對(duì)象中的元素進(jìn)行分組,這篇文章主要介紹了JavaScript數(shù)組分組groupBy示例,需要的朋友可以參考下2023-12-12
Javascript 判斷兩個(gè)IP是否在同一網(wǎng)段實(shí)例代碼
javascript功能的強(qiáng)大之處是我們大家有目共睹的,幾天小編向大家介紹Javascript 判斷兩個(gè)IP是否在同一網(wǎng)段,感興趣的朋友可以參考一下2016-11-11
基于JavaScript編寫(xiě)一個(gè)圖片轉(zhuǎn)PDF轉(zhuǎn)換器
本文為大家介紹了一個(gè)簡(jiǎn)單的 JavaScript 項(xiàng)目,可以將圖片轉(zhuǎn)換為 PDF 文件。你可以從本地選擇任何一張圖片,只需點(diǎn)擊一下即可將其轉(zhuǎn)換為 PDF 文件,感興趣的可以動(dòng)手嘗試一下2022-07-07
uni-app小程序分享功能實(shí)現(xiàn)方法舉例
這篇文章主要給大家介紹了關(guān)于uni-app小程序分享功能實(shí)現(xiàn)方法的相關(guān)資料,uni-app中有分享的API接口,但是需要現(xiàn)在QQ或者微信等開(kāi)發(fā)者平臺(tái)上注冊(cè)賬號(hào),驗(yàn)證公司信息,而且只能分享圖片或者文本等內(nèi)容,需要的朋友可以參考下2023-07-07
js實(shí)現(xiàn)選項(xiàng)卡內(nèi)容切換以及折疊和展開(kāi)效果【推薦】
本文主要介紹了js實(shí)現(xiàn)選項(xiàng)卡內(nèi)容切換以及文字折疊和展開(kāi)效果的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01

