在網(wǎng)頁(yè)開(kāi)發(fā)中,經(jīng)常遇到需要加載大量圖片的情況。當(dāng)用戶(hù)訪(fǎng)問(wèn)一個(gè)包含大量圖片的頁(yè)面時(shí),如果所有圖片都同時(shí)加載,將會(huì)嚴(yán)重影響頁(yè)面的加載速度和用戶(hù)體驗(yàn)。為了解決這個(gè)問(wèn)題,可以使用Ajax實(shí)現(xiàn)延時(shí)加載圖片的效果。
延時(shí)加載圖片的原理很簡(jiǎn)單:當(dāng)頁(yè)面加載完成后,只加載可見(jiàn)區(qū)域內(nèi)的圖片,當(dāng)用戶(hù)向下滾動(dòng)頁(yè)面時(shí),再動(dòng)態(tài)加載出可見(jiàn)區(qū)域外的圖片。這樣可以實(shí)現(xiàn)頁(yè)面的快速加載,節(jié)省帶寬和減輕服務(wù)器的負(fù)擔(dān)。
下面以一個(gè)新聞網(wǎng)站為例來(lái)說(shuō)明如何使用Ajax實(shí)現(xiàn)延時(shí)加載圖片:
首先,我們需要一個(gè)包含大量新聞的頁(yè)面,每篇新聞都包含一張配圖。為了模擬大量新聞,我們可以在頁(yè)面中復(fù)制多個(gè)相同的新聞塊,并為每個(gè)新聞塊添加一個(gè)圖片鏈接。這些圖片鏈接指向真實(shí)的圖片地址,但圖片資源并不會(huì)在頁(yè)面加載時(shí)加載。
<div class="news-block"><div class="news-content"><p>這是一篇新聞的標(biāo)題</p><p>這是一篇新聞的內(nèi)容</p></div><img src="" alt="新聞配圖"></div>
接下來(lái),我們需要編寫(xiě)JavaScript代碼來(lái)實(shí)現(xiàn)延時(shí)加載功能。
function lazyLoadImages() { var images = document.getElementsByTagName('img'); var windowHeight = window.innerHeight; var scrollY = window.scrollY || window.pageYOffset; for(var i = 0; i < images.length; i++) { var img = images[i]; // 判斷圖片是否在可見(jiàn)區(qū)域內(nèi) if(img.getBoundingClientRect().top <= windowHeight + scrollY) { var src = img.getAttribute('data-src'); if(src) { img.setAttribute('src', src); img.removeAttribute('data-src'); } } } } window.addEventListener('scroll', lazyLoadImages); window.addEventListener('resize', lazyLoadImages); // 頁(yè)面加載完成時(shí)執(zhí)行一次 document.addEventListener('DOMContentLoaded', lazyLoadImages);
在上述代碼中,首先獲取所有的圖片元素,并獲取當(dāng)前窗口的高度和滾動(dòng)的距離。然后遍歷每個(gè)圖片元素,判斷其是否在可見(jiàn)區(qū)域內(nèi)。如果在可見(jiàn)區(qū)域內(nèi),將獲取其data-src屬性作為src屬性,從而觸發(fā)圖片的加載。
最后,我們需要在CSS中設(shè)置圖片元素的樣式,使其默認(rèn)不顯示。
img { display: none; }
通過(guò)以上步驟,我們成功實(shí)現(xiàn)了延時(shí)加載圖片的效果。當(dāng)用戶(hù)打開(kāi)頁(yè)面時(shí),只有可見(jiàn)區(qū)域內(nèi)的圖片會(huì)被加載,其余的圖片將在用戶(hù)滾動(dòng)頁(yè)面時(shí)才會(huì)被動(dòng)態(tài)加載。這樣可以提升頁(yè)面加載速度,優(yōu)化用戶(hù)體驗(yàn)。