亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文教你學(xué)會用JS實現(xiàn)圖片懶加載功能

 更新時間:2023年07月27日 10:11:09   作者:chenxuyan  
圖片懶加載是日常開發(fā)會經(jīng)常使用的一個功能,但是在日常中可能使用v-lazy便直接實現(xiàn)了圖片懶加載,但是本文將通過原生js來實現(xiàn)一下圖片懶加載的功能,感興趣的同學(xué)跟著小編一起來看看吧

通過IntersectionObserver實現(xiàn)圖片懶加載功能

首先來介紹一下IntersectionObserver,這個在MDN中有十分詳細(xì)的介紹.可以直接去看原文.這里簡單介紹一下他的用法.

IntersectionObserver

IntersectionObserver 是一個 JavaScript 的 API,用于觀察目標(biāo)元素與其祖先元素或視窗(viewport)之間的交叉狀態(tài)。它能夠提供一種高效的方式來檢測目標(biāo)元素是否進(jìn)入或離開視窗,或者與其父元素發(fā)生交叉,從而實現(xiàn)懶加載、無限滾動、動態(tài)加載等功能。IntersectionObserver API 在現(xiàn)代瀏覽器中得到廣泛支持。

屬性:

  • IntersectionObserver.root:表示根元素(root)的可見區(qū)域。它是一個 Document 對象的引用。默認(rèn)情況下,根元素為視窗(viewport)。你可以指定一個特定的元素,使其成為觀察器的根元素。如果未指定,則默認(rèn)為視窗。
  • IntersectionObserver.rootMargin:用于擴(kuò)展或縮小根元素的可見區(qū)域。它是一個字符串,類似于 CSS 的 margin 屬性,可以包含像素值或百分比值。例如,"10px 20px 30px 40px" 或者 "5% 10%"。這個屬性用于擴(kuò)大或縮小根元素的可見區(qū)域,使得在進(jìn)入或離開視窗之前,目標(biāo)元素需要提前或推遲一定的距離。
  • IntersectionObserver.thresholds:一個數(shù)組,表示觸發(fā) IntersectionObserver 回調(diào)的交叉閾值。交叉閾值是一個介于 0 和 1 之間的值,表示目標(biāo)元素可見區(qū)域與根元素可見區(qū)域相交的百分比。當(dāng)目標(biāo)元素的可見區(qū)域與根元素的可見區(qū)域相交達(dá)到或超過閾值時,會觸發(fā)回調(diào)函數(shù)。默認(rèn)情況下,閾值為 [0],表示目標(biāo)元素有任何部分進(jìn)入可見區(qū)域時都會觸發(fā)回調(diào)。你可以自定義多個閾值,以實現(xiàn)更精確的觸發(fā)條件。

方法:

  • IntersectionObserver.observe(target: Element):將一個目標(biāo)元素添加到 IntersectionObserver 中進(jìn)行觀察。當(dāng)目標(biāo)元素的交叉狀態(tài)滿足設(shè)定的條件時,會觸發(fā) IntersectionObserver 的回調(diào)函數(shù)。
  • IntersectionObserver.unobserve(target: Element):停止對指定目標(biāo)元素的觀察,即使目標(biāo)元素的交叉狀態(tài)滿足條件,也不會觸發(fā) IntersectionObserver 的回調(diào)函數(shù)。
  • IntersectionObserver.disconnect():停止對所有目標(biāo)元素的觀察,調(diào)用該方法后,即使目標(biāo)元素的交叉狀態(tài)發(fā)生變化,也不會觸發(fā) IntersectionObserver 的回調(diào)函數(shù)。
  • IntersectionObserver.takeRecords():返回一個包含所有觀察目標(biāo)元素的 IntersectionObserverEntry 對象數(shù)組。每個 IntersectionObserverEntry 對象包含目標(biāo)元素的交叉狀態(tài)信息,如可見區(qū)域的大小和位置等。

簡單實現(xiàn)

圖片獲取:

// globEager是靜態(tài)加載模式
// glob是懶加載模式
// let imgList=import.meta.glob('./assets/*.*',{eager:true}) ----便是靜態(tài)加載模式
let imgList:Record<string,{default:string}>=import.meta.glob('./assets/*.*',{eager:true})
let arr=Object.values(imgList).map((item:any)=>item.default)
console.log(arr);

在很多時候,獲取圖片列表的方式都是將圖片路徑添加到一個數(shù)組中,進(jìn)行獲取,十分繁瑣,而上面的這種方式相對而言要簡單很多.import.meta.globimport.meta.globEager兩種方式大同小異,但是import.meta.glob這種可以直接實現(xiàn)圖片懶加載引入,而后面那種則是通過靜態(tài)資源的方式將圖片進(jìn)行引入.這便是這兩種方式的區(qū)別.由于在這個dome中要實現(xiàn)圖片懶加載,所以是使用的是第二種方式引入(在第一種方式加一個{eager:true}便可以達(dá)到第二種引入方式的效果).

先來看看imgList的輸出結(jié)果:

可以很明顯的看到default就是圖片的路徑,那么只需要將其獲取即可

let arr=Object.values(imgList).map((item:any)=>item.default)

因為返回的是一個對象,所以便可以使用Object.values來獲取到value,再通過map遍歷的方式獲取到其default

從而便獲得了其路徑,這種獲取路徑的方式還是比較輕松,且方便的.

再解決完圖片問題之后,便是懶加載部分的實現(xiàn)了.

懶加載實現(xiàn):

關(guān)于IntersectionObserver的屬性和方法在前面也簡單的介紹了.同時也附上了MDN相關(guān)鏈接.這里便不會再去贅述了.

相關(guān)代碼展示:

let vLazy:Directive<HTMLImageElement,string>=async (el,binging)=>{
  const def=await import('./assets/vue.svg')
  el.src=def.default
  console.log(el);
  const observer=new IntersectionObserver(enr=>{
    console.log(enr[0]);
    if(enr[0].intersectionRatio>0){
      setTimeout(()=>{
        el.src=binging.value
      },2000)
      observer.unobserve(el)
    }
  })
  observer.observe(el)
}

在對于前面屬性和方法的了解的加持下,看這段代碼屬實不難.其中定時器只是為了更好的去呈現(xiàn)懶加載的這個過程.

上述代碼中,通過使用vue的矢量圖來作為默認(rèn)圖片,當(dāng)未加載時,展示這張圖.看函數(shù)主體:

enr所返回的就是每一個圖片所返回的IntersectionObserver

因為只添加了三張圖片所以返回了三個對象,而所需要關(guān)注的就是intersectionRatio這個屬性,當(dāng)它大于0時,便會將圖片路徑更換為指定路徑,從而實現(xiàn)了圖片懶加載,當(dāng)然在實現(xiàn)這一功能之后,也要關(guān)閉 observer.unobserve(el),不然會一直關(guān)注這一個.

整體代碼呈現(xiàn):

<template>
<div >
  <div class="card">
    <img v-lazy="item" v-for="(item,index) in arr" :src="item" :key="index" alt="" width="360" height="500" >
  </div>
</div>
</template>
<script setup lang='ts'>
import HelloWorld from './components/HelloWorld.vue';
import type {Directive } from 'vue'
// globEager是靜態(tài)加載模式
// glob是懶加載模式
// let imgList=import.meta.glob('./assets/*.*',{eager:true}) ----便是靜態(tài)加載模式
let imgList:Record<string,{default:string}>=import.meta.glob('./assets/*.*',{eager:true})
let arr=Object.values(imgList).map((item:any)=>item.default)
console.log(arr);
let vLazy:Directive<HTMLImageElement,string>=async (el,binging)=>{
  const def=await import('./assets/vue.svg')
  el.src=def.default
  console.log(el);
  const observer=new IntersectionObserver(enr=>{
    console.log(enr[0]);
    if(enr[0].intersectionRatio>0){
      setTimeout(()=>{
        el.src=binging.value
      },2000)
      observer.unobserve(el)
    }
  })
  observer.observe(el)
}
</script>

到此這篇關(guān)于一文教你學(xué)會用JS實現(xiàn)圖片懶加載功能的文章就介紹到這了,更多相關(guān)JS實現(xiàn)圖片懶加載功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript實現(xiàn)雙向鏈表過程解析

    JavaScript實現(xiàn)雙向鏈表過程解析

    這篇文章主要介紹了利用JavaScript實現(xiàn)雙向鏈表以及它的封裝和常用操作,文中的示例代碼講解詳細(xì),對日常的學(xué)習(xí)和工作都有一定的價值,快來和小編一起學(xué)習(xí)吧
    2021-12-12
  • JS實現(xiàn)圖片無間斷滾動代碼匯總

    JS實現(xiàn)圖片無間斷滾動代碼匯總

    這篇文章主要介紹了JS實現(xiàn)圖片無間斷滾動代碼匯總,非常實用的特效代碼,需要的朋友可以參考下
    2014-07-07
  • JS DOMReady事件的六種實現(xiàn)方法總結(jié)

    JS DOMReady事件的六種實現(xiàn)方法總結(jié)

    下面小編就為大家?guī)硪黄狫S DOMReady事件的六種實現(xiàn)方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 基于cornerstone.js的dicom醫(yī)學(xué)影像查看瀏覽功能

    基于cornerstone.js的dicom醫(yī)學(xué)影像查看瀏覽功能

    這篇文章主要介紹了基于cornerstone.js的dicom醫(yī)學(xué)影像查看瀏覽功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • wap圖片滾動特效無css3元素純js腳本編寫

    wap圖片滾動特效無css3元素純js腳本編寫

    手機(jī)圖片滑動切換,網(wǎng)上有很多這樣的例子,但都借助于其他組件,讓代碼混亂的不行,本例介紹的是無css3元素純js腳本編寫的wap圖片滾動特效
    2014-08-08
  • JS調(diào)用打印機(jī)功能簡單示例

    JS調(diào)用打印機(jī)功能簡單示例

    這篇文章主要介紹了JS調(diào)用打印機(jī)功能的方法,結(jié)合完整實例形式分析了javascript打印機(jī)功能的相關(guān)設(shè)置與使用技巧,需要的朋友可以參考下
    2016-11-11
  • 不同瀏覽器的怪癖小結(jié)

    不同瀏覽器的怪癖小結(jié)

    收集不同瀏覽器的怪癖,對于大家以后的開發(fā)與兼容性問題,有所幫助。
    2010-07-07
  • 常見瀏覽器多長時間會提示“腳本運行時間過長”總結(jié)

    常見瀏覽器多長時間會提示“腳本運行時間過長”總結(jié)

    這篇文章主要介紹了常見瀏覽器多長時間會提示“腳本運行時間過長”總結(jié),需要的朋友可以參考下
    2014-04-04
  • JavaScript訂單操作小程序完整版

    JavaScript訂單操作小程序完整版

    這篇文章主要介紹了JavaScript訂單操作小程序完整版,增加訂單,刪除訂單,修改訂單數(shù)量,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 深入理解JavaScript中的并行處理

    深入理解JavaScript中的并行處理

    這篇文章給大家詳細(xì)介紹了JavaScript中的并行處理,一直以來,JavaScript 都并沒有多線程的能力,而單線程在讓開發(fā)者方便的同時,也使它一直不能處理計算量復(fù)雜的場景,唯一方法就是讓服務(wù)端去做。下來通過這篇文章我們一起來看看詳細(xì)介紹。
    2016-09-09

最新評論