图片懒加载插件实例分享(含解析)


Posted in Javascript onJanuary 09, 2017

在面试的时候有面试官问我,懒加载这个插件你有没有想到如何去优化?又间接问我函数节流的问题,嘿嘿,今天就更新下这个插件,顺便应用下函数节流(throttle),先直接上下代码,含解析

/*
 * 函数功能:函数节流
 * fn 需要调用的函数
 * delay 函数需要延迟处理的时间
 * mustRunDelay 超过该时间,函数一定会执行
 * */
 var throttle = function (fn, delay, mustRunDelay) {
 var timer; //使用闭包存储timer
 var t_start;
 //闭包返回的函数
 return function (val) {
 var args = arguments, t_curr = +new Date(); //使用+new Date() 将字符串转换成数字
 clearTimeout(timer);
 if (!t_start) { // 使用!t_start 如果t_start=undefined或者null 则为true
 t_start = t_curr;
 }
 if (t_curr - t_start >= mustRunDelay) {
 fn.apply(null, args);
 t_start = t_curr;
 } else {
 timer = setTimeout(function () {
  fn.apply(null, args);
 }, delay);
 }
 }
 };
 /*使用方法*/
 var throttle1 = throttle(fn, 500, 4000);
 //在该需要调用的函数内部调用此函数
 throttle1(val); //此处传人的参数为以上fn需要传人的参数

至于函数节流具体的好处,常用的场景,以下文章说得非常清楚,我就不再说啦~

很多网站都会用到‘图片懒加载'这种方式对网站进行优化,即延迟加载图片或符合某些条件才开始加载图片。于是心血来潮,决定自己手动写一下'图片懒加载‘插件。

使用这个技术有什么显著的优点?

比如一个页面中有很多图片,如淘宝首页等等,一个页面有100多的图片,如果一上来就发送这么多请求,页面加载就会很漫长,如果js文件都放在了文档的底部,恰巧页面的头部又依赖这个js文件,那就不好办了。用户感觉这个页面就会很卡。

懒加载原理:浏览器会自动对页面中的img标签的src属性发送请求并下载图片。通过动态改变img的src属性实现。

当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成loading图片地址(这样就只需请求一次)

等到一定条件(这里是页面滚动到一定区域),用实际存放img地址的laze-load属性的值去替换src属性,即可实现'懒加载'。

//即使img的src值为空,浏览器也会对服务器发送请求。所以平时做项目的时候,如果img没有用到src,就不要出现src这个属性

先上三个重要的知识点

1.获取屏幕可视窗口大小:

document.documentElement.clientHeight 标准浏览器及低版本IE标准模式

document.body.clientHeight 低版本混杂模式

2.元素相对于文档document顶部

element.offsetTop

3.滚动条滚动的距离

document.documentElement.scrollTop   兼容ie低版本的标准模式

document.body.scrollTop 兼容混杂模式;

滚动加载:当图片出现在可视区域时,动态加载该图片。

原理:当图片元素顶部是否在可视区域内,(图片相对于文档document顶部-滚动条滚动的距离)< 可视窗口大小,改变该img的src属性 

实现原理:

1.首先从所有相关元素中找出需要延时加载的元素,放在element_obj数组中。

function initElementMap() {
 var el = document.getElementsByTagName('img');
 for (var j = 0, len2 = el.length; j < len2; j++) {
 //判断当前的img是否加载过了,或者有lazy_src标志 [未完成]
 if (typeof (el[j].getAttribute("lazy_src"))) {
 element_obj.push(el[j]);
 download_count++;
 }
 }
 }

2.判断数组中的img对象,若满足条件,则改变src属性

function lazy() {
 if (!download_count) return;
 var innerHeight = getViewport();
 for (var i = 0, len = element_obj.length; i < len; i++) {
//得到图片相对document的距上距离
 var t_index = getElementViewTop(element_obj[i]); 
 if (t_index - getScrollTop() < innerHeight) {
 element_obj[i].src = element_obj[i].getAttribute("lazy-src");
 delete element_obj[i];
 download_count--;
 }
 }
}

3.滚动的时候触发事件,1000毫秒后执行lazy()方法。

window.onscroll = window.onload = function () {
 setTimeout(function () {
 lazy();
 }, 1000)
 }

整部分代码位于闭包自执行函数中。相应的方法放在init中。

var lazyLoad = (function () { 
 function init() {
 initElementMap();
 lazy();
 };
 return {
 init: init 
 }
})();

使用格式 :src填默认loading图片地址,真实的图片地址填在lazy-src属性里,切记需指定宽高。在外部调用  lazyLoad.init();

全部的代码以及例子已经上传到github上了,地址是:https://github.com/beidan/lazeLoadImg,欢迎star

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Javascript-Mozilla和IE中的一个函数直接量的问题
Jan 09 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 Javascript
Jquery实现视频播放页面的关灯开灯效果
May 27 Javascript
jquery等待效果示例
May 01 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 Javascript
javascript跑马灯抽奖实例讲解
Apr 17 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
Jun 09 Javascript
easyui-datagrid开发实践(总结)
Aug 02 Javascript
Vue计算属性的使用
Aug 04 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
Dec 18 jQuery
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
微信小程序 数据封装,参数传值等经验分享
Jan 09 #Javascript
简单实现jQuery多选框功能
Jan 09 #Javascript
微信小程序开发之Tabbar实例详解
Jan 09 #Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 #Javascript
JS获得多个同name 的input输入框的值的实现方法
Jan 09 #Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
Jan 09 #Javascript
原生Javascript插件开发实践
Jan 09 #Javascript
You might like
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
VueJS全面解析
2016/11/10 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
django缓存配置的几种方法详解
2018/07/16 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
甜品店的创业计划书范文
2014/01/02 职场文书
cf战队收人广告词
2014/03/14 职场文书
求职意向书范文
2014/04/01 职场文书
公司捐款倡议书
2014/05/14 职场文书
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android