IntersectionObserver判斷是否在可視區(qū)域詳解
前言
在日常的開發(fā)過程中,有時候會有一些要求判斷節(jié)點是否進入可視化區(qū)域的需求。例如:判斷信息是否在可視區(qū)域曝光再進行曝光,圖片懶加載等。通常我們可以通過scroll和getBoundingclient來進行判斷。
el.offsetTop - document.documentElement.scrollTop <= 視口高度 // 或 el.getBoundingClientRect().top <= 視口高度
但是scroll,getBoundingclient會引起回流,計算過于頻繁可能會引起很大的性能問題,例如用戶在使用的過程中,滑動卡頓啊等。那么有沒有更好的辦法來代替判斷是否進入可視化區(qū)域呢?使用IntersectionObserver即可解決這種煩惱。
概念
Intersection Observer API 提供了一種異步檢測目標(biāo)元素與祖先元素或 viewport 相交情況變化的方法。瀏覽器顯示頁面的時候,首先會用js處理邏輯,然后進行樣式計算及布局,在內(nèi)存里面形成之后會畫我們的屏幕上去,這一個過程就叫1幀,如果1幀中任一個階段占用的時間過長,就會影響到我們的平均幀率,導(dǎo)致掉幀等。而IntersectionObserver會在瀏覽器空閑的時候,也就是幀空閑的時候才去執(zhí)行,不會一直占用我們的主線程,從而提高了性能及體驗。
使用
IntersectionObserver接收2個參數(shù)callback和options。具體可見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)元素的可見比例
// entry.intersectionRect
// 目標(biāo)元素與根元素交叉的區(qū)域信息
// entry.isIntersecting
// 目標(biāo)元素是否進入根元素區(qū)域
// entry.rootBounds
// 根元素的矩形區(qū)域信息
// entry.target
// 被觀察dom節(jié)點
// entry.time
// 相交發(fā)生時距離頁面打開時的毫秒數(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版解決該問題。
注意
當(dāng)target元素已在root可視范圍,但是被其他元素遮蓋住了,該target是否被其他元素遮蓋不可判斷。
以上就是IntersectionObserver判斷是否在可視區(qū)域詳解的詳細(xì)內(nèi)容,更多關(guān)于IntersectionObserver 判斷可視區(qū)域的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript檢查數(shù)字是否為整數(shù)或浮點數(shù)的方法
這篇文章主要介紹了JavaScript檢查數(shù)字是否為整數(shù)或浮點數(shù)的方法,涉及javascript類型判斷的相關(guān)技巧,需要的朋友可以參考下2015-06-06
JavaScript數(shù)組分組groupBy示例詳解
JavaScript?最近發(fā)布了一個方法?Object.groupBy,可以對可迭代對象中的元素進行分組,這篇文章主要介紹了JavaScript數(shù)組分組groupBy示例,需要的朋友可以參考下2023-12-12
Javascript 判斷兩個IP是否在同一網(wǎng)段實例代碼
javascript功能的強大之處是我們大家有目共睹的,幾天小編向大家介紹Javascript 判斷兩個IP是否在同一網(wǎng)段,感興趣的朋友可以參考一下2016-11-11
基于JavaScript編寫一個圖片轉(zhuǎn)PDF轉(zhuǎn)換器
本文為大家介紹了一個簡單的 JavaScript 項目,可以將圖片轉(zhuǎn)換為 PDF 文件。你可以從本地選擇任何一張圖片,只需點擊一下即可將其轉(zhuǎn)換為 PDF 文件,感興趣的可以動手嘗試一下2022-07-07
js實現(xiàn)選項卡內(nèi)容切換以及折疊和展開效果【推薦】
本文主要介紹了js實現(xiàn)選項卡內(nèi)容切換以及文字折疊和展開效果的示例代碼。具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01

