JavaScript實(shí)現(xiàn)圖片懶加載的兩種方式
引言
現(xiàn)在的科技發(fā)達(dá),圖片的資源占比越來越大,對(duì)圖片在頁面的優(yōu)化已經(jīng)成為前端開發(fā)必備的技術(shù)之一,難的圖片懶加載方法咱們看著頭大,簡單,易懂的才適合我們程序員。
很好,開始第一步將圖片的標(biāo)簽放好,設(shè)定一個(gè)data-origin
標(biāo)簽在img當(dāng)中,這樣使用data-
的命名方式是為了與HTML5的自定義數(shù)據(jù)屬性約定保持一致。
簡單的方式
思路就是
- 先獲取到可視區(qū)域,我們使用
clientHeight
,它可以獲取到html元素的客戶端高度。 - 獲取到帶有
data-origin
標(biāo)簽的全部img屬性 - 獲取每張圖片相對(duì)視窗口的高度,使用
getBoundingClientRect
,其中包含各種元素相對(duì)于視口的信息和元素本身的信息。 - 一旦圖片相對(duì)于視窗頂部的距離小于可視區(qū)域高度,那就將
data-origin
標(biāo)簽的url賦給src,最后清除data-origin
標(biāo)簽。
<style> img{ height: 300px; width: 300px; margin-bottom: 50px; display: block; } </style> </head> <body> <img src="" data-origin="https://t7.baidu.com/it/u=2604797219,1573897854&fm=193&f=GIF" alt=""> <img src="" data-origin="https://img1.baidu.com/it/u=435134468,1942448903&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=889" alt=""> <img src="" data-origin="https://img0.baidu.com/it/u=3628503530,464378779&fm=253&fmt=auto&app=120&f=JPEG?w=1200&h=800"> <img src="" data-origin="https://img2.baidu.com/it/u=855369075,175194576&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500" alt=""> <img src="" data-origin="https://img2.baidu.com/it/u=2004708195,3393283717&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500" alt=""> <img src="" data-origin="https://img1.baidu.com/it/u=1331863463,2594844301&fm=253&fmt=auto?w=1067&h=800" alt=""> <img src="" data-origin="https://img1.baidu.com/it/u=1331863463,2594844301&fm=253&fmt=auto?w=1067&h=800" alt=""> <img src="" data-origin="https://img0.baidu.com/it/u=2788901948,3907873318&fm=253&fmt=auto?w=500&h=281" alt=""> <img src="" data-origin="https://img2.baidu.com/it/u=811993169,635123395&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=889" alt=""> <img src="" data-origin="https://img0.baidu.com/it/u=924031950,2251460669&fm=253&fmt=auto&app=138&f=JPEG?w=1105&h=500" alt=""> <script> //獲取可視區(qū)域的高度 offsetHeight包含外部高度(邊框) const viewHeight = document.documentElement.clientHeight //window.innerHeight // console.log(viewHeight); function lazyLoad(){ const imgs = document.querySelectorAll('img[data-origin]') //屬性選擇 console.log(imgs); imgs.forEach(item =>{ let res = item.getBoundingClientRect() // console.log(res); if(res.top < viewHeight){ item.src = item.dataset.origin item.removeAttribute('data-origin') } }) // 獲取可視區(qū)域的高度 // const viewHeight = document.documentElement.clientHeight // const io = new IntersectionObserver( // (entries) => { // entries.forEach(entry => { // if (entry.isIntersecting) { // entry.target.src = entry.target.dataset.original || '' // entry.target.removeAttribute('data-original') // io.unobserve(entry.target) // } // }) // }, // { // threshold: 0 // } // ) // const imgs = document.querySelectorAll('img[data-original]') // imgs.forEach(item => { // io.observe(item) // }) } document.addEventListener('scroll',lazyLoad) lazyLoad() </script> </body>
第二個(gè)方法
第二個(gè)方法就相對(duì)更復(fù)雜一些,通過判斷某個(gè)元素和父元素交叉比例來判斷是否需要懶加載。是異步監(jiān)聽的。當(dāng)交叉比例達(dá)到某個(gè)值就會(huì)觸發(fā)回調(diào)函數(shù)。我們這里使用的是IntersectionObserver
方法,用一個(gè)外部box包裹所有圖片,讓圖片超出box就滾動(dòng)??戳松厦娴姆椒ǎ@個(gè)方法也就明白在干什么了。
#box{ width: 100vw; height: 100vh; overflow: scroll; } img{ height: 300px; margin-bottom: 50px; display: block; } const viewHeight = document.documentElement.clientHeight const io = new IntersectionObserver( (entries) => { entries.forEach(entry => { //判斷是否進(jìn)入可視區(qū) if (entry.isIntersecting) { entry.target.src = entry.target.dataset.original || '' //移除標(biāo)簽 entry.target.removeAttribute('data-original') io.unobserve(entry.target) } }) }, { 取值范圍從0~1,表示交叉比例 threshold: 0 } ) //監(jiān)聽每一張圖片 const imgs = document.querySelectorAll('img[data-original]') imgs.forEach(item => { io.observe(item) })
到此這篇關(guān)于JavaScript實(shí)現(xiàn)圖片懶加載的兩種方式的文章就介紹到這了,更多相關(guān)JavaScript圖片懶加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript實(shí)現(xiàn)時(shí)間格式輸出FormatDate函數(shù)
這篇文章主要介紹了javascript實(shí)現(xiàn)時(shí)間格式輸出FormatDate函數(shù),可實(shí)現(xiàn)fmt標(biāo)簽一樣對(duì)日期時(shí)間型內(nèi)容格式輸入的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2015-01-01小程序中canvas的drawImage方法參數(shù)使用詳解
這篇文章主要介紹了小程序中canvas的drawImage方法參數(shù)使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07JavaScript參數(shù)個(gè)數(shù)可變的函數(shù)舉例說明
JavaScript允許一個(gè)函數(shù)傳遞個(gè)數(shù)可變的參數(shù),因?yàn)橛衋rguments這個(gè)內(nèi)置對(duì)象,它一個(gè)函數(shù)傳遞的所有參數(shù)的數(shù)組2014-10-10location對(duì)象的屬性和方法應(yīng)用(解析URL)
本文將與大家分享下location對(duì)象使用屬性和方法來解析URL的實(shí)例,感興趣的朋友可以參考下,希望對(duì)你有所幫助2013-04-04微信小程序 調(diào)用微信授權(quán)窗口相關(guān)問題解決
這篇文章主要介紹了微信小程序 調(diào)用微信授權(quán)窗口相關(guān)問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07javascript自動(dòng)給文本url地址增加鏈接的方法分享
這篇文章主要介紹了javascript自動(dòng)給文本url地址增加鏈接的方法,有需要的朋友可以參考一下2014-01-01