国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

前端性能優化之 —— 圖片延遲加載 (原理以及實現方式)

2024-04-27 15:08:49
字體:
來源:轉載
供稿:網友

前端開發的時候,有些列表頁面可能會有很多圖片需要加載。一次加載太多圖片,會占用很大的帶寬,影響網頁的加載速度。

這時候我們想到一種方式,讓用戶瀏覽到什么地方,就加載該處的圖片。

這里寫了一個簡單的例子,大家可以去體驗一下,當然這里考慮到的是最簡單的情況。 這里簡單的講解一下這個例子里面的源碼

例子查看

DOM 結構

由一個父容器div#lazy-img,里面是圖片標簽,父容器是可以滾動的,圖片有固定高度。大家可以看到,容器內的img元素沒有 src 屬性,而有一個 data-src 屬性。 這是不想讓圖片提前加載,所以把圖片的鏈接儲存到data-src 內。

div#lazy-img img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png") img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png") img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png") img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png") img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png") img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png") img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png") img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png") img(data-src="https://file.diamondfsd.com/img/9c61bc16-ae02-4f06-a8aa-0501db51eadb.png")PugCopyimg{ width:600px; height:300px; border: 2px solid #eee; background: #ccc;}#lazy-img{ height: 400px; background:#eee; overflow: auto;}CSSCopy

javascript 代碼

我們獲取容器內所有有 data-src 屬性的dom對象,遍歷獲取他們的相對高度,儲存成 { height: imgDom} 格式。然后監聽 容器的滾動事件,當滾動的時候,計算當前滾動區域顯示的圖片dom,并將改 圖片dom 的 src 的內容改成我們存儲在 data-src 的內容。

var imgContainer = document.getElementById('lazy-img')var imgs = imgContainer.querySelectorAll('[data-src]')var imgHeightDomMapping = {}imgs.forEach(function (img) { imgHeightDomMapping[img.offsetTop + img.clientHeight / 1.5] = img}) // 獲取所有 dom 對象相對容器的高度 并儲存成 key: height, value: imgDomimgContainer.addEventListener('scroll', function () { showImage()})function showImage () { var currentHeight = imgContainer.clientHeight + imgContainer.scrollTop // 滾動區域的高度 Object.keys(imgHeightDomMapping).forEach(function (imageHeight) { if (currentHeight > imageHeight) { // 判斷當前圖片是否已經顯示 //將圖片dom的 `src` 改為 `data-src` 的內容 imgHeightDomMapping[imageHeight].src = imgHeightDomMapping[imageHeight].getAttribute('data-src') } })}showImage() // 主動調用一次 加載首頁的JsCopy

這里簡單的實現了一個延遲加載,主要是告訴大家原理,可擴展的地方還很多。 例如提前加載 N 張圖片,可以包裝成一個通用的插件等等。只要大家了解到了原理,那么實現折些都很簡單。 這篇文章也算是拋磚引玉,歡迎大家進行討論。


上一篇:js時間格式化

下一篇:sass循環 each、for

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沾化县| 定日县| 清流县| 洛浦县| 龙门县| 永安市| 顺昌县| 林芝县| 武鸣县| 舞阳县| 称多县| 孙吴县| 宁德市| 北票市| 贵溪市| 临海市| 南部县| 齐河县| 萍乡市| 海伦市| 长治市| 江北区| 新邵县| 嘉荫县| 信宜市| 集安市| 淮南市| 许昌县| 隆安县| 临海市| 崇义县| 锡林浩特市| 沂南县| 贵港市| 山西省| 科尔| 弥勒县| 胶州市| 尖扎县| 汾西县| 巴南区|