首页 前端

JS实现图片懒加载

2021-11-04 14:43 知乎-代码狂魔

摘要:在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽。这也就是们通常所说的首屏加载,技术上现实其中要用的技术就是图片懒加载--到可视区域再加载。

在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽。这也就是们通常所说的首屏加载,技术上现实其中要用的技术就是图片懒加载--到可视区域再加载。

思路

用data-xxx属性替换img标签的src属性,当页面滚动到图片区域时候再将src属性替换成data-xxx属性

各种宽高

页可见区域宽: document.body.clientWidth;

网页可见区域高: document.body.clientHeight;

网页可见区域宽: document.body.offsetWidth (包括边线的宽);

网页可见区域高: document.body.offsetHeight (包括边线的宽);

网页正文全文宽: document.body.scrollWidth;

网页正文全文高: document.body.scrollHeight;

网页被卷去的高: document.body.scrollTop;

网页被卷去的左: document.body.scrollLeft;

网页正文部分上: window.screenTop;

网页正文部分左: window.screenLeft;

屏幕分辨率的高: window.screen.height;

屏幕分辨率的宽: window.screen.width;

屏幕可用工作区高度: window.screen.availHeight;

实现

echo.js,不依赖外部插件,压缩后1kb

<div class="demo">

<!--src属性为空白图片,data-echo中为图片真实路径-->

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

<img class="lazy" src="./img/blank.gif" data-echo="./img/bg.jpg">

</div>

<style>

/*固定宽高*/  

.demo img {     

    width: 1024; 

    height: 260px; 

   background: url(images/loading.gif) 50% no-repeat;

}

</style>

<script type="text/javascript" src="./echo.min.js"></script>

<script>Echo.init({

    offset: 0,//离可视区域多少像素的图片可以被加载

    throttle: 100 //图片延时多少毫秒加载

});

</script>

注意事项

如果在AJAX中获取图片数据后使用懒加载,需要在AJAX请求成功后执行初始化,因为初始化是在有数据之后进行的

$.ajax({

    type: 'GET',

    url: 'resources/js/frontmb/json/more.json',

    dataType: 'json',

    success: function(data){

    result = '<a class="item opacity" href="'+data.lists[i].link+'">'

      +'<img src="'+basePath+'resources/image/common/blank.gif" data-echo="'+data.lists[i].pic+'" alt="">'

      +'<h3>'+data.lists[i].title+'</h3>'

      +'<span class="date">'+data.lists[i].date+'</span>'

       +'</a>';

      $('.list').append(result);

      //等AJAX数据加载完成后再初始化

      Echo.init({

          offset: 0,//离可视区域多少像素的图片可以被加载

          throttle: 0 //图片延时多少毫秒加载

        });

   },

  error: function(xhr, type){

      alert('Ajax error!');

     }

 });

返回首页
返回顶部