js前端实现图片懒加载(lazyload)的两种方式


Posted in Javascript onApril 24, 2017

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

思路:

将页面里所有img属性src属性用data-xx代替,当页面滚动直至此图片出现在可视区域时,用js取到该图片的data-xx的值赋给src。

关于各种宽高:

  1. 页可见区域宽: document.body.clientWidth;
  2. 网页可见区域高: document.body.clientHeight;
  3. 网页可见区域宽: document.body.offsetWidth (包括边线的宽);
  4. 网页可见区域高: document.body.offsetHeight (包括边线的宽);
  5. 网页正文全文宽: document.body.scrollWidth;
  6. 网页正文全文高: document.body.scrollHeight;
  7. 网页被卷去的高: document.body.scrollTop;
  8. 网页被卷去的左: document.body.scrollLeft;
  9. 网页正文部分上: window.screenTop;
  10. 网页正文部分左: window.screenLeft;
  11. 屏幕分辨率的高: window.screen.height;
  12. 屏幕分辨率的宽: window.screen.width;
  13. 屏幕可用工作区高度: window.screen.availHeight;

示例:

jqueryLazyload方式

下载地址:https://github.com/helijun/helijun/blob/master/plugin/lazyLoad/jquery.lazyload.js

<section class="module-section" id="container">
   <img class="lazy-load" data-original="../static/img/loveLetter/teacher/teacher1.jpg" width="640" height="480" alt="测试懒加载图片"/>
</section>
require.config({
  baseUrl : "/static",
  paths: {
    jquery:'component/jquery/jquery-3.1.0.min'
    jqueryLazyload: 'component/lazyLoad/jquery.lazyload',//图片懒加载
  },
  shim: {
    jqueryLazyload: {
      deps: ['jquery'],
      exports: '$'
    }
  }
});
require(
  [
    'jquery',
    'jqueryLazyload'
  ], 
  function($){
    $(document).ready(function() {   
      $("img.lazy-load").lazyload({ 




effect : "fadeIn", //渐现,show(直接显示),fadeIn(淡入),slideDown(下拉)





threshold : 180, //预加载,在图片距离屏幕180px时提前载入





event: 'click', // 事件触发时才加载,click(点击),mouseover(鼠标划过),sporty(运动的),默认为scroll(滑动)





container: $("#container"), // 指定对某容器中的图片实现效果





failure_limit:2 //加载2张可见区域外的图片,lazyload默认在找到第一张不在可见区域里的图片时则不再继续加载,但当HTML容器混乱的时候可能出现可见区域内图片并没加载出来的情况




}); 



});

});

为了代码可读性,属性值我都写好了注释。值得注意的是预制图片属性为data-original,并且最好是给予初始高宽占位,以免影响布局,当然这里为了演示我是写死的640x480,如果是响应式页面,高宽需要动态计算。

echo.js方式

在前面“前端知识的一些总结”的博文中,介绍了一款非常简单实用轻量级的图片延时加载插件echo.js,如果你的项目中没有依赖jquery,那么这将是个不错的选择,50行代码,压缩后才1k。当然你完全可以集成到自己项目中去!

下载地址:https://github.com/helijun/helijun/tree/master/plugin/echo

<style>
.demo img { 


width: 736px; 


height: 490px; 


background: url(images/loading.gif) 50% no-repeat;}
</style>
<div class="demo">
  <img class="lazy" src="images/blank.gif" data-echo="images/big-1.jpg">
</div>
<script src="js/echo.min.js"></script>

<script>

Echo.init({
  offset: 0,//离可视区域多少像素的图片可以被加载
 throttle: 0 //图片延时多少毫秒加载
}); 

</script>

说明:blank.gif是一张背景图片,包含在插件里了。图片的宽高必须设定,当然,可以使用外部样式对多张图片统一控制大小。data-echo指向的是真正的图片地址。

 总结:

两者都非常简单,实现思路是一样的,只是jquerylazyload多几个属性。其实常用的echo就足够了,并且完全可以集成到自己项目中的公共js中,图片懒加载是相当常见且简单实用的功能,如果你的项目中还是傻瓜式的一次性全部加载,那么请花20分钟优化下~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js的with语句使用方法
Sep 21 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
Dec 16 Javascript
JS实现网页Div层Clone拖拽效果
Sep 26 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
基于javascript简单实现对身份证校验
Jan 25 Javascript
大型JavaScript应用程序架构设计模式
Jun 29 Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 Javascript
使用 Node.js 开发资讯爬虫流程
Jan 07 Javascript
node前端开发模板引擎Jade的入门
May 11 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
Dec 03 Javascript
基于layui轮播图满屏是高度自适应的解决方法
Sep 16 Javascript
Vue.js组件使用props传递数据的方法
Oct 19 Javascript
angularjs中的$eval方法详解
Apr 24 #Javascript
浅谈angularjs依赖服务注入写法的注意点
Apr 24 #Javascript
angularjs中回车键触发某一事件的方法
Apr 24 #Javascript
浅谈angularjs中响应回车事件
Apr 24 #Javascript
老生常谈angularjs中的$state.go
Apr 24 #Javascript
使用ionic播放轮询广告的实现方法(必看)
Apr 24 #Javascript
详谈angularjs中路由页面强制更新的问题
Apr 24 #Javascript
You might like
PHP whois查询类定义与用法示例
2019/04/03 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
python批量修改文件后缀示例代码分享
2013/12/24 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
Python 含参构造函数实例详解
2017/05/25 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
python 解决函数返回return的问题
2020/12/05 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
实习期自我鉴定
2013/10/11 职场文书
资料员的岗位职责
2013/11/20 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
写自荐信的注意事项
2014/03/09 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
党性分析自查总结
2014/10/14 职场文书
绵山导游词
2015/02/05 职场文书
学校教学管理制度
2015/08/06 职场文书