面試判斷元素是否在可視區(qū)域中IntersectionObserver詳解
前言
我們面試中常見的一個問題,如何判斷元素是否在可視區(qū)域中(即視口區(qū)域)?第一時間想到的肯定就是通過,offsetHeight、clientHeight、scrollHeight、scrrollTop、window.innerHeight等等東西來計算。而IntersectionObserver更好的幫我們解決了這個問題。
應用場景
去實現(xiàn)懶加載、無限滾動等等操作。
例:使用到的場景就是大量數(shù)據(jù)展示問題,一次性渲染大量數(shù)據(jù),肯定會出現(xiàn)渲染性能問題。如:一個select選擇框,有大量數(shù)據(jù),而視口展示的內容只有其中一小小部分。我們只需要先渲染視口展示的內容,當用戶滾動的時候,再渲染剩下的數(shù)據(jù)。這也是為什么在面試中要問這個問題。
使用
先放鏈接IntersectionObserver - Web API 接口參考 | MDN (mozilla.org)
IntersectionObserver 接口(從屬于 Intersection Observer API)提供了一種異步觀察目標元素與其祖先元素或頂級文檔視口(viewport)交叉狀態(tài)的方法。其祖先元素或視口被稱為根(root)
當一個 IntersectionObserver 對象被創(chuàng)建時,其被配置為監(jiān)聽根中一段給定比例的可見區(qū)域。一旦 IntersectionObserver 被創(chuàng)建,則無法更改其配置,所以一個給定的觀察者對象只能用來監(jiān)聽可見區(qū)域的特定變化值;然而,你可以在同一個觀察者對象中配置監(jiān)聽多個目標元素。
現(xiàn)在就用一個例子演示:

<ul>
<li ref="li" v-for="(item, index) in lis" :key="index">{{ item }}</li>
</ul>
const lis = reactive([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
我這里創(chuàng)建了一個ul 里面有很多?。?0個)li。然后我們想實現(xiàn)懶加載就需要用到IntersectionObserver這個API
第一步:先要獲取需要監(jiān)聽元素的DOM,那我們這里需要獲取滾動條數(shù)據(jù)的最后一個元素,也就是:li.value[li.value.length - 1](即li的最后一個DOM元素)。
const li = ref(null)
然后我們創(chuàng)建IntersectionObserver實例對象。 語法
var observer = new IntersectionObserver(callback[, options]); 這里有幾個參數(shù)解釋:
callback
當元素可見比例超過指定閾值后,會調用一個回調函數(shù),此回調函數(shù)接受兩個參數(shù):
entries
一個IntersectionObserverEntry對象的數(shù)組,每個被觸發(fā)的閾值,都或多或少與指定閾值有偏差。
observer
被調用的IntersectionObserver實例。
const intersectionObserver = new IntersectionObserver((entries) => {
// 如果 intersectionRatio 為 0,則目標在可視區(qū)域之外,
//直接return
if (entries[0].intersectionRatio <= 0) return
//停止在前一個DOM的監(jiān)聽。
intersectionObserver.disconnect(li.value[li.value.length - 1])
//如過在可視區(qū)域之內,則我們添加數(shù)據(jù)。
lis.push(...[1, 2, 3, 4, 5, 6])
//更新監(jiān)聽的DOM
intersectionObserver.observe(li.value[li.value.length - 1])
console.log('Loaded new items')
})
onMounted(() => {
//這里對li的最后一個組件進行監(jiān)聽。
intersectionObserver.observe(li.value[li.value.length - 1])
})
這樣就能夠實現(xiàn)一個懶加載的效果。

由此可見IntersectionObserver是多么的方便,而且還節(jié)省性能。
結語
IntersectionObserver現(xiàn)在對絕大多數(shù)瀏覽器都兼容,對于極個別可能不支持,在我們日常開發(fā)中也可以提供很大幫助。
雖然現(xiàn)在的組件庫多種多樣,且許多地方都已經自帶了懶加載的操作方法,無需了解其原理。但如果想要我們的技術更上一個臺階需要更加去了解。
參考資料 IntersectionObserver - Web API 接口參考 | MDN (mozilla.org)
以上就是面試判斷元素是否在可視區(qū)域中IntersectionObserver詳解的詳細內容,更多關于IntersectionObserver可視區(qū)域的資料請關注腳本之家其它相關文章!
相關文章
分享9個最好用的JavaScript開發(fā)工具和代碼編輯器
這篇文章主要介紹了9個最好用的JavaScript開發(fā)工具和代碼編輯器,需要的朋友可以參考下2015-03-03
一些常用的JavaScript函數(shù)(json)附詳細說明
一些常用的JavaScript函數(shù)(json)附詳細說明,學習js的朋友可以參考下。2011-05-05

