JavaScript的懶加載處理的方式
什么是懶加載
懶加載(Lazy Loading)是一種優(yōu)化技術(shù),它可以延遲加載某些資源,直到它們真正需要被使用的時(shí)候才進(jìn)行加載。這種技術(shù)可以提升應(yīng)用程序或網(wǎng)站的性能,減少初始加載時(shí)間。
實(shí)現(xiàn)懶加載的方式
實(shí)現(xiàn)懶加載的方法一般分為兩種:基于 Intersection Observer API 的懶加載和基于滾動(dòng)事件的懶加載。
Intersection Observer API 是一個(gè)新的瀏覽器 API,它可以異步觀察目標(biāo)元素與其祖先元素或頂級(jí)文檔視窗的交集情況。我們可以使用它來實(shí)現(xiàn)懶加載。
下面是一種實(shí)現(xiàn)懶加載的常見方式(Intersection Observer API):
1.在HTML中標(biāo)記需要延遲加載的元素,通常是圖片、視頻等資源。可以使用data屬性或class來添加標(biāo)記。
示例:
<img class="lazy" data-src="image.jpg" alt="Lazy-loaded Image">
2.使用JavaScript監(jiān)聽頁(yè)面滾動(dòng)事件或其他觸發(fā)事件,檢查需要加載的元素是否進(jìn)入了可視區(qū)域。
使用Intersection Observer API:
// 觀察器選項(xiàng) const options = { root: null, // 默認(rèn)為視窗 rootMargin: '0px', threshold: 0.5 // 當(dāng)目標(biāo)元素50%可見時(shí)觸發(fā)加載 }; const handleIntersection = (entries,) => { entries.forEach(entry => { if (entry.isIntersecting) { // 加載目標(biāo)元素 const target = entry.target; target.src = target.dataset.src; observer.unobserve(target); } }); }; // 創(chuàng)建一個(gè)觀察器實(shí)例 const observer = new IntersectionObserver(handleIntersection, options); // 找到所有需要懶加載的元素并進(jìn)行觀察 const lazyElements = document.querySelectorAll('.lazy'); lazyElements.forEach(element => { observer.observe(element); });
我們通過Intersection Observer API來監(jiān)聽目標(biāo)元素是否進(jìn)入可視區(qū)域,并在元素可見時(shí)將data-src屬性的值賦給src屬性來加載資源。觀察器選項(xiàng)可以根據(jù)需求進(jìn)行調(diào)整。
或者說,你也可以根據(jù)一定的步驟去實(shí)現(xiàn)
js四步法
設(shè)置占位圖
在HTML中,將需要懶加載的圖片的src屬性設(shè)置為一個(gè)占位圖,可以是一張小尺寸、模糊或單色的圖片,表示圖片正在加載。
<img src="placeholder.jpg" data-src="image-to-lazy-load.jpg" alt="Lazy-loaded Image">
監(jiān)聽滾動(dòng)事件
使用JavaScript監(jiān)聽頁(yè)面的滾動(dòng)事件,當(dāng)滾動(dòng)事件觸發(fā)時(shí),判斷懶加載圖片是否進(jìn)入了可視區(qū)域。
window.addEventListener('scroll', function() { // 判斷懶加載圖片是否進(jìn)入可視區(qū)域 // 如果圖片進(jìn)入可視區(qū)域,則觸發(fā)加載圖片的函數(shù) });
加載圖片
當(dāng)懶加載圖片進(jìn)入可視區(qū)域時(shí),將占位圖的data-src屬性值賦給src屬性,從而觸發(fā)加載圖片。
function lazyLoad() { const lazyImages = document.querySelectorAll('img[data-src]'); lazyImages.forEach(function(img) { if (isInViewport(img)) { img.src = img.dataset.src; img.removeAttribute('data-src'); } }); } function isInViewport(element) { var rect = element.getBoundingClientRect(); return ( rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth) ); }
觸發(fā)加載函數(shù)
在滾動(dòng)事件中觸發(fā)加載函數(shù),實(shí)現(xiàn)懶加載的效果。
window.addEventListener('scroll', function() { lazyLoad(); });
這也是一種實(shí)現(xiàn)懶加載的方式,但需要注意的是,在實(shí)際使用中可能需要根據(jù)具體情況進(jìn)行適當(dāng)?shù)恼{(diào)整和優(yōu)化,例如添加防抖和節(jié)流機(jī)制,處理圖片加載失敗等情況。同時(shí),還可以使用現(xiàn)有的懶加載庫(kù)來簡(jiǎn)化代碼并實(shí)現(xiàn)更多功能。
到此這篇關(guān)于JavaScript的懶加載處理的文章就介紹到這了,更多相關(guān)js 懶加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)環(huán)繞鼠標(biāo)旋轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)環(huán)繞鼠標(biāo)旋轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01JavaScript style對(duì)象與CurrentStyle對(duì)象案例詳解
這篇文章主要介紹了JavaScript style對(duì)象與CurrentStyle對(duì)象案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08javascript密碼強(qiáng)度校驗(yàn)代碼(兩種方法)
為了保證網(wǎng)站個(gè)人信息的安全,很多網(wǎng)站在注冊(cè)頁(yè)面都設(shè)置密碼強(qiáng)度這項(xiàng),用javascript如何實(shí)現(xiàn)密碼強(qiáng)度校驗(yàn)代碼呢?下面小編給大家整理了兩種方法使用javascript密碼強(qiáng)度校驗(yàn)代碼,有需要的朋友可以參考下2015-08-08動(dòng)態(tài)生成的IFRAME,設(shè)置SRC時(shí)的,不同位置帶來的影響
動(dòng)態(tài)生成的IFRAME,設(shè)置SRC時(shí)的,不同位置帶來的影響。 以下所說的是在IE7下運(yùn)行的。IE6下也是同樣。 在這個(gè)blog中,直接點(diǎn)擊運(yùn)行代碼,和把下面代碼保存到為網(wǎng)頁(yè)在運(yùn)行(以本地文件或域名訪問),效果不一樣。2008-03-03詳解Webpack + ES6 最新環(huán)境搭建與配置
這篇文章主要介紹了詳解Webpack + ES6 最新環(huán)境搭建與配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06javascript函數(shù)的四種調(diào)用模式
本文詳細(xì)介紹了javascript函數(shù)的四種調(diào)用模式。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01微信小程序動(dòng)畫(Animation)的實(shí)現(xiàn)及執(zhí)行步驟
這篇文章主要介紹了微信小程序動(dòng)畫(Animation) 的實(shí)現(xiàn)及執(zhí)行步驟,需要的朋友可以參考下2018-10-10學(xué)習(xí)javascript面向?qū)ο?理解javascript原型和原型鏈
這篇文章主要介紹了javascript原型和原型鏈,學(xué)習(xí)javascript面向?qū)ο?,感興趣的小伙伴們可以參考一下2016-01-01setTimeout與setInterval的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于setTimeout與setInterval區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03