我们可以发现,当我们在往下方滚动的时候,下方商品的图片在你看不到之前是没有加载的,而是当你滚到到它的时候,这个图片才加载,这就是懒加载的一个应用!
<body> <img class='img-item' src="https://img.zcool.cn/community/011e0e5c231dcaa80121df9063b03f.jpg@1280w_1l_2o_100sh.jpg" alt=""> <img class='img-item' src="https://img.zcool.cn/community/01427a5c63c7dba801213f26fa8f1f.jpg@1280w_1l_2o_100sh.jpg" alt=""> <img class='img-item' src="https://img.zcool.cn/community/0132fb60a7171011013f472074ee82.jpg@1280w_1l_2o_100sh.jpg" alt=""> <img class='img-item' src="https://pic2.zhimg.com/v2-ac79ec66a08cdbbfd36c3f9e4f307077_1440w.jpg" alt=""> <img class='img-item' src="https://img.zcool.cn/community/01702360a7171511013e3b7d2249ef.jpg@1280w_1l_2o_100sh.jpg" alt=""> <img class='img-item' src="https://img.zcool.cn/community/01c9e05da91bcea8012163bae9a7ea.jpg@2o.jpg" alt=""> <img class='img-item' src="https://img.zcool.cn/community/010c155dcec2b0a8012053c0802a12.jpg@3000w_1l_0o_100sh.jpg" alt=""> <img class='img-item' src="https://pic2.zhimg.com/v2-b2ab50d677e6f8a9101dae446dd99acd_r.jpg" alt=""> <img class='img-item' src="https://img.3dmgame.com/uploads/images/thumbpicfirst/20180824/1535099402_352803.jpg" alt=""> <img class='img-item' src="https://img.zcool.cn/community/0193a55b9df41ba8012099c8aedcd0.jpg@3000w_1l_0o_100sh.jpg" alt=""> </body>由于图片尺寸问题,我们为了看得更加舒服,我们加点样式:
<style> .img-item{ display: block; height: 300px; margin-top: 50px; } </style>将其变为块级元素,从上往下显示,设置图片高度为300px,上外边距为50px
<body> <img class='img-item' src="" data-original="https://img.zcool.cn/community/011e0e5c231dcaa80121df9063b03f.jpg@1280w_1l_2o_100sh.jpg" alt=""> <img class='img-item' src="" data-original="https://img.zcool.cn/community/01427a5c63c7dba801213f26fa8f1f.jpg@1280w_1l_2o_100sh.jpg" alt=""> <img class='img-item' src="" data-original="https://img.zcool.cn/community/0132fb60a7171011013f472074ee82.jpg@1280w_1l_2o_100sh.jpg" alt=""> <img class='img-item' src="" data-original="https://pic2.zhimg.com/v2-ac79ec66a08cdbbfd36c3f9e4f307077_1440w.jpg" alt=""> <img class='img-item' src="" data-original="https://img.zcool.cn/community/01702360a7171511013e3b7d2249ef.jpg@1280w_1l_2o_100sh.jpg" alt=""> <img class='img-item' src="" data-original="https://img.zcool.cn/community/01c9e05da91bcea8012163bae9a7ea.jpg@2o.jpg" alt=""> <img class='img-item' src="" data-original="https://img.zcool.cn/community/010c155dcec2b0a8012053c0802a12.jpg@3000w_1l_0o_100sh.jpg" alt=""> <img class='img-item' src="" data-original="https://pic2.zhimg.com/v2-b2ab50d677e6f8a9101dae446dd99acd_r.jpg" alt=""> <img class='img-item' src="" data-original="https://img.3dmgame.com/uploads/images/thumbpicfirst/20180824/1535099402_352803.jpg" alt=""> <img class='img-item' src="" data-original="https://img.zcool.cn/community/0193a55b9df41ba8012099c8aedcd0.jpg@3000w_1l_0o_100sh.jpg" alt=""> </body>我们将src属性先置为空!然后我们自己定义一个data-original属性存我们图片的地址!
<script> // 拿到可视区域的高度 innerHeight是window上独有的方法 别的用outerHeight或者innerHeight let viewHeight = window.innerHeight; // 拿到所有的img元素 img[data-original]只要具有data-original属性的img元素 let imgs = document.querySelectorAll('img[data-original]'); imgs.forEach(el=>{ // getBoundingClientRect()专门获取容器的几何信息 let rect = el.getBoundingClientRect() }) </script>我们可以通过window.innerHeight;拿到用户可视区域的高度
<script> // 拿到可视觉区域的高度 let viewHeight = window.innerHeight; function lazyLoad(){ // 拿到所有的img元素 img[data-original]只要具有data-original属性的img元素 let imgs = document.querySelectorAll('img[data-original]'); imgs.forEach(el=>{ // getBoundingClientRect()专门获取容器的几何信息 let rect = el.getBoundingClientRect() if(rect.top<viewHeight){ //进行赋值操作 } } }) } </script>我们可以想象一下,只要到图片顶部的距离小于可视区域的高度,我们就应该加载图片了!
if(rect.top<viewHeight){ //进行赋值操作 let image = new Image() image.src = el.dataset.original; }值得注意的是:data-original在js中有专有写法,写成dataset.original 。
el.src = image.src但是我们不会这样写,而是写成
if(rect.top<viewHeight){ let image = new Image() image.src = el.dataset.original; image.onload = function(){ el.src = image.src } }为什么这样写呢?这样写我们就通过onload函数的执行,当我们创造的image标签加载完毕的时候,我们才去把el.src赋值为image.src。
if(rect.top<viewHeight){ let image = new Image() image.src = el.dataset.original; image.onload = function(){ el.src = image.src } // 图片加载完毕就移除属性 el.removeAttribute('data-original') }写到这里,功能我们就实现了,我们调用一遍这个函数,同时添加一个事件监听器监听滚动事件,随着页面的滚动来加载图片,最终我们js部分就写成了这样!
<script> // 拿到可视觉区域的高度 let viewHeight = window.innerHeight; function lazyLoad(){ // 拿到所有的img元素 let imgs = document.querySelectorAll('img[data-original]'); imgs.forEach(el=>{ // getBoundingClientRect()专门获取容器的几何信息 let rect = el.getBoundingClientRect() if(rect.top<viewHeight){ // img元素自带一个构造函数,可以创建一个图片对象 let image = new Image() // js专有写法dataset.original; = data-original image.src = el.dataset.original; image.onload = function(){ el.src = image.src } // 图片加载完毕就移除属性 el.removeAttribute('data-original') } }) } lazyLoad() // 添加滚动事件监听器 document.addEventListener('scroll',lazyLoad) </script>我们来看看现在页面的效果!