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 XML操作 封装类
Jul 01 Javascript
使用jQuery轻松实现Ajax的实例代码
Aug 16 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
Apr 26 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
Nov 08 Javascript
jQuery插件制作之全局函数用法实例
Jun 01 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
Nov 23 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
Sep 09 Javascript
原生js验证简洁注册登录页面
Dec 17 Javascript
vue项目中实现的微信分享功能示例
Jan 21 Javascript
tsconfig.json配置详解
May 17 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
Nov 01 jQuery
Js逆向实现滑动验证码图片还原的示例代码
Mar 10 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中计算时间差的几种方法
2009/12/31 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
使用Python脚本操作MongoDB的教程
2015/04/16 Python
讲解Python中if语句的嵌套用法
2015/05/14 Python
python显示生日是星期几的方法
2015/05/27 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
使用python存储网页上的图片实例
2018/05/22 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
Python3中的bytes和str类型详解
2019/05/02 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
python3中确保枚举值代码分析
2020/12/02 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
法律专业自我鉴定
2013/10/03 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
2015年教师新年寄语
2014/12/08 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
python中opencv实现图片文本倾斜校正
2021/06/11 Python
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android