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 相关文章推荐
Javascript 定时器调用传递参数的方法
Nov 12 Javascript
jsp 网站引入外部css或者js失效问题解决
Oct 31 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
Feb 28 Javascript
微信小程序 flex实现导航实例详解
Apr 26 Javascript
小发现之浅谈location.search与location.hash的问题
Jun 23 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 jQuery
mock.js模拟前后台交互
Jul 25 Javascript
vue2 拖动排序 vuedraggable组件的实现
Aug 08 Javascript
微信小程序实现上传多个文件 超过10个
Mar 30 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
Apr 27 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
Sep 22 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
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的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
javascript函数库-集合框架
2007/04/27 Javascript
用jscript实现新建word文档
2007/06/15 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
用Vue.js实现监听属性的变化
2016/11/17 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
python插入数据到列表的方法
2015/04/30 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
python、Matlab求定积分的实现
2019/11/20 Python
Python sorted对list和dict排序
2020/06/09 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
python+opencv实现车道线检测
2021/02/19 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
银行给客户的感谢信
2015/01/23 职场文书
幸福来敲门观后感
2015/06/04 职场文书
童年读书笔记
2015/06/26 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL