懒加载?什么是懒加载?・ࡇ・ ?
很多萌新刚见到这个词时一定一头雾水,懒加载也叫做延迟加载、按需加载,指的是在长网页中延迟加载图片数据,是一种较好的网页性能优化的方式。在比较长的网页或应用中,如果内容很多,所有的内容都被加载出来,而用户只能看到可视窗口的那一部分图片数据,这样就浪费了性能。
通俗来讲就是优化网页,使其更高效 (♡ര‿ര)
所以今天就教大家如何使用JS代码来实现懒加载的效果
| ू•ૅω•́)ᵎᵎᵎ 开始演示:
创建html文件(我用的HbuildX演示)
然后创建html结构:
<div id="box"> <div id="content"></div> </div> <p class="hint">正在加载中。。。</p>
然后是CSS样式:
<style> *{ margin: 0; padding: 0; } #content{ width: 100%; height: 200px; background-color: #1ACFFC; margin: 10px 0; } #hint{ width: 100%; height: 30px; text-align: center; background-color: #F9CFCD; } </style>
当前效果(这里加了移动端适配):
下面就开始JS部分了ԅ(≖‿≖ԅ)
假设data为数据总数,num为每次显示条数,那么我们一步一步来,先获取元素,将基础的5条渲染出来
<script> // 数据总数 let data = 23 // 一次显示的数量 let num = 5 // 获取页面父元素 let box = document.getElementById("box") renders() // 页面渲染函数 function renders(){ let str = '' for(let i = 0 ; i < num ; i++){ str += `<div id="content"></div>` } box.innerHTML = str } </script>
效果:
接下来就是如何渲染剩余的数据,和如何限制数据渲染,实现懒加载效果
一步一步来:首先添加scroll事件
// 给window添加事件监听,监听scroll事件 window.addEventListener("scroll",lazyLoad)
窗口可视区域的高+滚动条滚动的高度 是否大于或等于网页整体内容的高度,如果大于,num数量增加,也就是划到底渲染剩余的内容,每次数量增加都要清除事件监听,以防止滚动事件重复触发
// 事件内容 function lazyLoad() { // 窗口可视区域的高+滚动条滚动的高度 是否大于或等于网页整体内容的高度 if (window.scrollY + window.innerHeight > document.body.scrollHeight) { num += 5 if (num >= data) { num = data; } window.removeEventListener("scroll", ;lazyload); } }
清除后,设置定时器,一秒后再将新的div数量渲染出来,并且判断渲染的数量是否等于总和的数量,如果不等于,说明还有没渲染出来的div,所以重新给wiindow绑定事件监听的scroll事件。
若相等,说明全部渲染完毕,将尾部提示信息改为“暂无更多商品”
// 事件内容 function lazyLoad() { // 窗口可视区域的高+滚动条滚动的高度 是否大于或等于网页整体内容的高度 if (window.scrollY + window.innerHeight > document.body.scrollHeight) { num += 5 if (num >= data) { num = data; } window.removeEventListener("scroll", lazyLoad); // 添加定时器 setTimeout(function() { renders(); if (num != data) { window.addEventListener("scroll", lazyLoad); } else { document.getElementById("hint").innerHTML = "暂无更多商品" } }, 1000) } }
效果如下:
完整代码:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0,user-scalable=no"> <title></title> <style> * { margin: 0; padding: 0; } #content { width: 100%; height: 200px; background-color: #1ACFFC; margin: 10px 0; } #hint { width: 100%; height: 30px; text-align: center; background-color: #F9CFCD; } </style> </head> <body> <div id="box"> <div id="content"></div> </div> <p id="hint">正在加载中。。。</p> <script> // 数据总数 let data = 23 // 一次显示的数量 let num = 5 // 获取页面父元素 let box = document.getElementById("box") renders() // 页面渲染函数 function renders() { let str = '' for (let i = 0; i < num; i++) { str += `<div id="content"></div>` } box.innerHTML = str } // 给window添加事件监听,监听scroll事件 window.addEventListener("scroll", lazyLoad) // 事件内容 function lazyLoad() { // 窗口可视区域的高+滚动条滚动的高度 是否大于或等于网页整体内容的高度 if (window.scrollY + window.innerHeight > document.body.scrollHeight) { num += 5 if (num >= data) { num = data; } window.removeEventListener("scroll", lazyLoad); // 添加定时器 setTimeout(function() { renders(); if (num != data) { window.addEventListener("scroll", lazyLoad); } else { document.getElementById("hint").innerHTML = "暂无更多商品" } }, 1000) } } </script> </body> </html>
(Ps:作者纯新人,本文仅用来分享所学知识并加以运用,若有什么错误,还恳请路过的大佬多多批评(♡ര‿ര))