快捷搜索:  汽车  科技

js懒加载和懒执行(你还不知道javascript懒加载实现的原理吗)

js懒加载和懒执行(你还不知道javascript懒加载实现的原理吗)<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>懒加载</title> <style type="text/css"> img { display: block; width: 400px; height: 300px; margin-bottom: 30px; } </style> </head> <body> <img src="" data-src="https://himg.pddugc.com/open-gw/2021-07-09/ad94153447520f19fa53d369

懒加载技术在网页中的作用很大,如果不用懒加载,一个网页需要加载数十上百或者更多张照片,会导致服务器压力很大,大大影响网页的加载速度,给用户的体验也很不好,像电商网站需要加载很多商品的图片信息。这个时候我们就需要懒加载来提高用户体验,并且减轻服务器压力,从而提高性能。同时,懒加载作为前端优化网页能行的知识点,在面试中也经常会被问到。因此,掌握懒加载的原理和实现过程很有必要!

它的实现机制是优先加载可视区域的内容,其他部分等进入了可视区域再加载。

具体思路就是:
1、创建一个自定义属性data-src存放真正需要显示的图片路径,而img自带的src为空;
2、当页面滚动直至此图片出现在可视区域时,用js取到该图片的data-src的值赋给src即可。

js懒加载和懒执行(你还不知道javascript懒加载实现的原理吗)(1)

具体实现代码:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>懒加载</title> <style type="text/css"> img { display: block; width: 400px; height: 300px; margin-bottom: 30px; } </style> </head> <body> <img src="" data-src="https://himg.pddugc.com/open-gw/2021-07-09/ad94153447520f19fa53d3693607e370.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/215725/39/10297/161418/61d84a39Ed919e387/26790f672d7153f2.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/179260/37/14089/1045955/60ee74b0E064c07b3/49bab496e7221c1a.png"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/163454/9/14462/440022/605ad7a7E2fb984fd/4536d99cf1749aff.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/112407/33/13952/129414/5f2a5840Eb1af6fcb/f7104413bccecb64.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/162512/25/26108/117179/61e91d0eE4fcdbd67/084b02f67180cdc6.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/183289/23/10367/182100/60cff9d1E34451b76/fb9d09fcaa0fcbb2.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/152977/10/7800/184971/5fc4fdefE2d4b9ac9/94c30aef873cba8e.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/178845/16/4587/154529/60a1fb0bEff14b958/472de444576a57b5.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/217555/13/12151/146354/62022136E0920f145/27df416541db231c.jpg"> <img src="" data-src="https://img14.360buyimg.com/pop/jfs/t1/140600/22/27302/185116/6202213bE7a00ab35/50403aa35a834308.jpg"> <script type="text/javascript"> var img = document.getElementsByTagName('img'); var num = document.getElementsByTagName('img').length; // 存储图片加载到的位置,避免每次都从第一张图片开始遍历 var n = 0; // 是否当前容器/页面里的图片加载完成 var isLoadImg = false; // 可见区域高度 var _clientHeight = document.documentElement.clientHeight; // 滚动条距离顶部高度 var _scrollTop = document.documentElement.scrollTop || document.body.scrollTop; // 监听窗口变化重新计算可视区域 function computedClientHeight() { // 可视区域高度 _clientHeight = document.documentElement.clientHeight; } // 页面加载完毕加载可视区域内的图片 lazyLoad() function lazyLoad() { // 获取滚动条距离顶部的高度 isLoadImg = n >= num; _scrollTop = document.documentElement.scrollTop || document.body.scrollTop; for (var i = n; i < num; i ) { if (img[i].offsetTop < _clientHeight _scrollTop) { if (img[i].getAttribute('src') == '') { img[i].src = img[i].getAttribute('data-src'); } n = i 1 } } } // 节流 function throttle(func wait flag) { let timerOut = null; return function () { if (flag) { return; } if (!timerOut) { timerOut = setTimeout(function () { timerOut = null; func() } wait) } } } // 防抖 function debounce(callback delay) { let timer = null; return function (arg) { clearTimeout(timer); timer = setTimeout(function () { callback(arg) } delay) } } // 使用了节流函数,实现了性能较好的懒加载 window.addEventListener('scroll' throttle(lazyLoad 100 isLoadImg) ) // 使用防抖优化不断触发的窗口变化 window.addEventListener('resize' debounce(computedClientHeight 800) ) </script> </body> </html>

效果图:

js懒加载和懒执行(你还不知道javascript懒加载实现的原理吗)(2)

猜您喜欢: