最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

面試判斷元素是否在可視區(qū)域中IntersectionObserver詳解

 更新時(shí)間:2023年03月09日 11:16:17   作者:收破爛的來(lái)了  
這篇文章主要為大家介紹了判斷元素是否在可視區(qū)域中IntersectionObserver面試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

我們面試中常見的一個(gè)問(wèn)題,如何判斷元素是否在可視區(qū)域中(即視口區(qū)域)?第一時(shí)間想到的肯定就是通過(guò),offsetHeight、clientHeight、scrollHeight、scrrollTop、window.innerHeight等等東西來(lái)計(jì)算。而IntersectionObserver更好的幫我們解決了這個(gè)問(wèn)題。

應(yīng)用場(chǎng)景

去實(shí)現(xiàn)懶加載、無(wú)限滾動(dòng)等等操作。

例:使用到的場(chǎng)景就是大量數(shù)據(jù)展示問(wèn)題,一次性渲染大量數(shù)據(jù),肯定會(huì)出現(xiàn)渲染性能問(wèn)題。如:一個(gè)select選擇框,有大量數(shù)據(jù),而視口展示的內(nèi)容只有其中一小小部分。我們只需要先渲染視口展示的內(nèi)容,當(dāng)用戶滾動(dòng)的時(shí)候,再渲染剩下的數(shù)據(jù)。這也是為什么在面試中要問(wèn)這個(gè)問(wèn)題。

使用

先放鏈接IntersectionObserver - Web API 接口參考 | MDN (mozilla.org)

IntersectionObserver 接口(從屬于 Intersection Observer API)提供了一種異步觀察目標(biāo)元素與其祖先元素或頂級(jí)文檔視口(viewport)交叉狀態(tài)的方法。其祖先元素或視口被稱為根(root)

當(dāng)一個(gè) IntersectionObserver 對(duì)象被創(chuàng)建時(shí),其被配置為監(jiān)聽根中一段給定比例的可見區(qū)域。一旦 IntersectionObserver 被創(chuàng)建,則無(wú)法更改其配置,所以一個(gè)給定的觀察者對(duì)象只能用來(lái)監(jiān)聽可見區(qū)域的特定變化值;然而,你可以在同一個(gè)觀察者對(duì)象中配置監(jiān)聽多個(gè)目標(biāo)元素。

現(xiàn)在就用一個(gè)例子演示

 <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)建了一個(gè)ul 里面有很多?。?0個(gè))li。然后我們想實(shí)現(xiàn)懶加載就需要用到IntersectionObserver這個(gè)API

第一步:先要獲取需要監(jiān)聽元素的DOM,那我們這里需要獲取滾動(dòng)條數(shù)據(jù)的最后一個(gè)元素,也就是:li.value[li.value.length - 1](即li的最后一個(gè)DOM元素)。

   const li = ref(null)

然后我們創(chuàng)建IntersectionObserver實(shí)例對(duì)象。 語(yǔ)法

var observer = new IntersectionObserver(callback[, options]); 這里有幾個(gè)參數(shù)解釋:

callback

當(dāng)元素可見比例超過(guò)指定閾值后,會(huì)調(diào)用一個(gè)回調(diào)函數(shù),此回調(diào)函數(shù)接受兩個(gè)參數(shù):

entries

一個(gè)IntersectionObserverEntry對(duì)象的數(shù)組,每個(gè)被觸發(fā)的閾值,都或多或少與指定閾值有偏差。

observer

被調(diào)用的IntersectionObserver實(shí)例。

  const intersectionObserver = new IntersectionObserver((entries) => {
  // 如果 intersectionRatio 為 0,則目標(biāo)在可視區(qū)域之外,
  //直接return
  if (entries[0].intersectionRatio <= 0) return
  //停止在前一個(gè)DOM的監(jiān)聽。
  intersectionObserver.disconnect(li.value[li.value.length - 1])
  //如過(guò)在可視區(qū)域之內(nèi),則我們添加數(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(() => {
  //這里對(duì)li的最后一個(gè)組件進(jìn)行監(jiān)聽。
  intersectionObserver.observe(li.value[li.value.length - 1])
})

這樣就能夠?qū)崿F(xiàn)一個(gè)懶加載的效果。

由此可見IntersectionObserver是多么的方便,而且還節(jié)省性能。

結(jié)語(yǔ)

IntersectionObserver現(xiàn)在對(duì)絕大多數(shù)瀏覽器都兼容,對(duì)于極個(gè)別可能不支持,在我們?nèi)粘i_發(fā)中也可以提供很大幫助。

雖然現(xiàn)在的組件庫(kù)多種多樣,且許多地方都已經(jīng)自帶了懶加載的操作方法,無(wú)需了解其原理。但如果想要我們的技術(shù)更上一個(gè)臺(tái)階需要更加去了解。

參考資料 IntersectionObserver - Web API 接口參考 | MDN (mozilla.org)

以上就是面試判斷元素是否在可視區(qū)域中IntersectionObserver詳解的詳細(xì)內(nèi)容,更多關(guān)于IntersectionObserver可視區(qū)域的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • redux-saga 初識(shí)和使用

    redux-saga 初識(shí)和使用

    這篇文章主要介紹了redux-saga 初識(shí)和使,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Three.js基礎(chǔ)學(xué)習(xí)之場(chǎng)景對(duì)象

    Three.js基礎(chǔ)學(xué)習(xí)之場(chǎng)景對(duì)象

    這篇文章主要給大家介紹了Three.js基礎(chǔ)學(xué)習(xí)之場(chǎng)景對(duì)象的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用three.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。
    2017-09-09
  • 彈出遮罩層后禁止?jié)L動(dòng)效果【實(shí)現(xiàn)代碼】

    彈出遮罩層后禁止?jié)L動(dòng)效果【實(shí)現(xiàn)代碼】

    下面小編就為大家?guī)?lái)一篇彈出遮罩層后禁止?jié)L動(dòng)效果【實(shí)現(xiàn)代碼】。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考
    2016-04-04
  • 基于JS實(shí)現(xiàn)EOS隱藏錯(cuò)誤提示層代碼

    基于JS實(shí)現(xiàn)EOS隱藏錯(cuò)誤提示層代碼

    本文給大家分享一段代碼基于js實(shí)現(xiàn)EOS隱藏錯(cuò)誤提示層,對(duì)eos隱藏提示層的相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • 基于javascript實(shí)現(xiàn)按圓形排列DIV元素(二)

    基于javascript實(shí)現(xiàn)按圓形排列DIV元素(二)

    本篇文章主要介紹基于javascript實(shí)現(xiàn)按圓形排列DIV元素的方法,此文著重于介紹怎樣實(shí)現(xiàn)的按圓形排列DIV元素的運(yùn)動(dòng)原理和實(shí)現(xiàn)效果代碼,需要的朋友來(lái)看下吧
    2016-12-12
  • javaScript實(shí)現(xiàn)網(wǎng)頁(yè)版的彈球游戲

    javaScript實(shí)現(xiàn)網(wǎng)頁(yè)版的彈球游戲

    這篇文章主要為大家詳細(xì)介紹了javaScript實(shí)現(xiàn)網(wǎng)頁(yè)版的彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Sample script that displays all of the users in a given SQL Server DB

    Sample script that displays all of the users in a given SQL

    Sample script that displays all of the users in a given SQL Server DB...
    2007-06-06
  • 使用JavaScript實(shí)現(xiàn)LRU緩存的代碼詳解

    使用JavaScript實(shí)現(xiàn)LRU緩存的代碼詳解

    LRU(Least?Recently?Used)算法是一種廣泛應(yīng)用于內(nèi)存管理和緩存系統(tǒng)的策略,本文將介紹LRU算法的基本原理,并通過(guò)JavaScript實(shí)現(xiàn)案例,幫助讀者理解其在前端開發(fā)中的應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2024-05-05
  • javascript獲取文檔坐標(biāo)和視口坐標(biāo)

    javascript獲取文檔坐標(biāo)和視口坐標(biāo)

    制作網(wǎng)頁(yè)的過(guò)程中,你有時(shí)候需要知道某個(gè)元素在網(wǎng)頁(yè)上的確切位置。下面的教程總結(jié)了Javascript在網(wǎng)頁(yè)定位方面的相關(guān)知識(shí)。有需要的小伙伴可以參考下。
    2015-05-05
  • javascript中不提供sleep功能如何實(shí)現(xiàn)這個(gè)功能

    javascript中不提供sleep功能如何實(shí)現(xiàn)這個(gè)功能

    javascript中不提供sleep功能,而我們時(shí)長(zhǎng)會(huì)用到這個(gè)功能,下面與大家分享個(gè)不錯(cuò)的解決方法,而且在不同的機(jī)器上的執(zhí)行速度是一致的
    2014-05-05

最新評(píng)論

汾阳市| 沅陵县| 盐津县| 乳源| 仁寿县| 彭泽县| 蒙城县| 大厂| 临泉县| 伊宁县| 屯留县| 陆河县| 奎屯市| 沽源县| 惠安县| 淅川县| 桂林市| 夏邑县| 日照市| 惠东县| 隆安县| 沅陵县| 嘉鱼县| 榆树市| 留坝县| 临澧县| 桦川县| 建德市| 渑池县| 大港区| 尼木县| 德安县| 裕民县| 汉沽区| 沙湾县| 南汇区| 中方县| 西宁市| 涟水县| 湘乡市| 屯门区|