什么是图片惰性加载呢?
顾名思义,惰性指的是我们只将用户视野范围内(浏览器窗口的可视区域)的图片加载,而用户视野范围外的图片先不加载,当用户看到这些图片时再做加载。
这样做的好处在于哪里呢?
1、用户访问速度上升了,浏览器的加载进度条很快就加载完毕。
2、节省用户流量。
那么如何实现呢?
我们需要解决两个问题:① 如何知道用户是否能看见这张图片?② 如何让看不到的图片不加载,而在需要的时候再去加载?
先解决第一个问题:如何知道用户是否能看见这张图片?
首先需要获取三个值,这些都可以通过javascript获取。
①浏览器窗口的高度 windowHeight
②页面滚动的距离 windowPageY
③图片距离页面顶部的距离 imgTop
那么:
if(imgTop >= windowPageY && imgTop <= (windowPageY+windowHeight)){ //图片可见 }
关于上面的条件判断,相信你仔细思考就能看明白。
解决第二个问题:如何让看不到的图片不加载,而在需要的时候再去加载?
所有图片元素的src值先设置为一个很小的图片或者一张“加载中”的图片,而它的真实属性放置在一个自定义属性中如:
<img dataimg="真实大图.png" src="小图.png">
这样浏览器只会去加载小图,而不会去加载大图,而当你所有图片都用同一张小图的时候,这张小图只需要加载一次,所以速度非常快。
当这张图片需要加载了,那么我们只需要将原先放置在自定义属性中的图片地址放置到img标签额src属性中就可以了,接下来浏览器就会去请求并加载这张图片:
<img dataimg="真实大图.png" src="真实大图.png">
ok,基本原理就是这样,代码细节就不赘述了,直接贴代码。
lazyload.js
1 (function(){ 2 /** 3 * 功能:图片惰性加载 4 * @author haunghm 5 * @version 1.0.0 6 * @dependencies jquery 或者 zepto 7 */ 8 var lazyLoad = { 9 10 init: function() { 11 var that = this; 12 that.onerrorImgUrl = "./images/grey.png";//图片加载失败用什么图片替换 13 that.srcStore = "dataimg"; //图片真实地址存放的自定义属性 14 that.class = "lazy"; //惰性加载的图片需要添加的class 15 that.sensitivity = 50; //该值越小,惰性越强(加载越少) 16 17 minScroll = 5, 18 slowScrollTime = 200, 19 ios = navigator.appVersion.match(/(iPhone\sOS)\s([\d_]+)/), 20 isIos = ios && !0 || !1, 21 isoVersion = isIos && ios[2].split("_"); 22 23 isoVersion = isoVersion && parseFloat(isoVersion.length > 1 ? isoVersion.splice(0, 2).join(".") : isoVersion[0], 10), 24 isIos = that.isPhone = isIos && isoVersion < 6; 25 26 if (isIos) { 27 28 var startSyAndTime, 29 setTimeOut; 30 $(window).on("touchstart",function() { 31 startSyAndTime = { 32 sy: window.scrollY, 33 time: Date.now() 34 }, 35 setTimeOut && clearTimeout(setTimeOut) 36 }).on("touchend",function(e) { 37 if (e && e.changedTouches) { 38 var subtractionY = Math.abs(window.scrollY - startSyAndTime.sy); 39 if (subtractionY > minScroll) { 40 var subtractionTime = Date.now() - startSyAndTime.time; 41 setTimeOut = setTimeout(function() { 42 that.changeimg(), 43 startSyAndTime = {}, 44 clearTimeout(setTimeOut), 45 setTimeOut = null 46 }, 47 subtractionTime > slowScrollTime ? 0: 200) 48 } 49 } else { 50 that.changeimg(); 51 } 52 }).on("touchcancel", function() { 53 setTimeOut && clearTimeout(setTimeOut), 54 startSyAndTime = {} 55 }) 56 } else { 57 $(window).on("scroll", function() { 58 that.changeimg(); 59 }); 60 } 61 setTimeout(function() { 62 that.trigger(); 63 },90); 64 65 }, 66 trigger: function() { 67 var that = this; 68 eventType = that.isPhone && "touchend" || "scroll"; 69 that.imglist = $('img.'+that.class+''); 70 $(window).trigger(eventType); 71 }, 72 changeimg: function() { 73 function loadYesOrno(img) { 74 var windowPageYOffset = window.pageYOffset, 75 windowPageYOffsetAddHeight = windowPageYOffset + window.innerHeight, 76 imgOffsetTop = img.offset().top; 77 return imgOffsetTop >= windowPageYOffset && imgOffsetTop - that.sensitivity <= windowPageYOffsetAddHeight; 78 } 79 function loadImg(img, index) { 80 81 var imgUrl = img.attr(that.srcStore); 82 img.attr("src", imgUrl); 83 img[0].onload || (img[0].onload = function() { 84 $(this).removeClass(that.class).removeAttr(that.srcStore), 85 that.imglist[index] = null, 86 this.onerror = this.onload = null 87 }, 88 img[0].onerror = function() { 89 this.src = that.onerrorImgUrl, 90 $(this).removeClass(that.class).removeAttr(that.srcStore), 91 that.imglist[index] = null, 92 this.onerror = this.onload = null 93 }) 94 } 95 var that = this; 96 that.imglist.each(function(index, val) { 97 if (!val) return; 98 var img = $(val); 99 if (!loadYesOrno(img)) return; 100 if (!img.attr(that.srcStore)) return; 101 loadImg(img, index); 102 }) 103 104 } 105 }; 106 lazyLoad.init(); 107 108 }());
如何使用这个脚本呢?
HTML
<!DOCTYPE html> <html> <head> <title>图片惰性演示例子</title> </head> <body> <img class="lazy" dataimg="images/change01.jpg" src="./grey.png"> <img class="lazy" dataimg="images/change02.jpg" src="./grey.png"> <img class="lazy" dataimg="images/change03.jpg" src="./grey.png"> <img class="lazy" dataimg="images/change04.jpg" src="./grey.png"> <img class="lazy" dataimg="images/change05.jpg" src="./grey.png"> <img class="lazy" dataimg="images/change06.jpg" src="./grey.png"> </body> <script src="http://libs.baidu.com/zepto/1.0rc/zepto.min.js"></script> <script src="./lazyload.js"></script> </html>
就像上面的代码一样,很简单。只要在页面底部载入jquery或者zepto(如果你不想依赖这两个库,也很简单,可以改造一下代码,毕竟在移动端不需要处理很多兼容性问题)。然后载入lazyload.js这个脚本。
并按照一下规则来书写你的img标签
<img class="lazy" dataimg="真实大图.png" src="小图.png">
注意事项:图片最好都用样式定义高度,否则图片的高度默认为0,就上面的例子来讲,所有img标签都挤在一起,全部在第一屏,导致程序认为它们都应该加载,就看不到效果了。
好了,高潮和结局终于同时来了。我始终认为demo也需要有赏心悦目的感觉。
相关推荐
在AngularJS应用开发中,为了提升应用程序的性能和用户体验,我们经常需要采用延迟加载(惰性加载)策略。ocLazyLoad就是这样一款强大的工具,它允许我们在需要时才加载模块和组件,从而减少初始加载时间,优化资源...
实时加载与懒加载的主要区别在于何时开始加载图片。懒加载通常会在用户滚动到图片所在位置时才开始加载,而实时加载则是在页面初始化时就开始加载,但这种加载方式并非一次性加载所有图片,而是根据图片的重要性或...
effect : "fadeIn" // 加载图片使用的效果(淡入) }); }); ``` 在这个配置中,`$("img")`选择了所有的`<img>`元素,即需要应用延迟加载的图片。`lazyload`函数接收一个对象作为参数,定义了延迟加载的行为: 1. ...
3. **惰性加载(Lazy Loading)**:为了优化性能和减少页面加载时间,Vue 图片滑动图库实现了惰性加载策略。这意味着只有当图片即将进入视口时,才会开始加载,降低了对网络带宽的需求,尤其是在图片数量庞大的情况...
这种特性使得ViewStub成为实现动态加载布局的理想选择,尤其在处理复杂或者大体积的视图时,可以有效提高应用的性能和用户体验。 一、ViewStub的基本使用 1. **声明ViewStub**:在XML布局文件中,我们可以像声明...
在IT行业中,尤其是在Android或iOS应用开发中,加载图片是一个常见的任务。本示例"加载图片的demo"旨在展示如何高效、智能地加载网络或本地存储的图片到应用程序的界面中。下面我们将深入探讨这个话题。 首先,...
图片懒加载组件作者:冬玉需求描述背景:由于移动端网速限制, 为加快页面加载速度, 避免产生不必要的流量消耗, 图片采用按需加载方式.设计懒加载组件,需要支持以下几个功能:支持自定义定义组件有效范围支持 scroll...
在IT行业中,图片延时加载(也称为懒加载或惰性加载)是一种优化网页性能的策略,它允许页面中的图片在真正需要时才被加载,而不是一次性全部加载。这种技术对于提升网页的加载速度和用户体验尤其重要,尤其是在移动...
在实际项目中,可以参考现有的开源库和插件,如lozad.js(惰性加载库)和lazysizes(一个轻量级的无依赖的懒加载解决方案),它们都支持自定义动画效果,适用于实现HTML5页面滚动图片动画加载特效。 最后,值得注意...
- **惰性加载**:只在需要时加载图片,如滚动列表时,只加载当前可视区域的图片。 5. **图片加载优化**: - **尺寸适配**:根据ImageView的大小下载合适的图片尺寸,减少流量和内存占用。 - **占位符和错误图**...
惰性加载的核心思想是只在图片进入可视区域时才加载图片。具体实现通常需要监听滚动事件,检查图片元素是否进入可视区域,如果是,则开始加载图片。 6. **实现惰性加载的JavaScript代码** 在提供的JavaScript代码...
rn-lazy, AngularJS用于图像的惰性加载器 rn懒惰:AngularJS惰性图像加载程序指令用户速度感知对于你的web应用程序来说至关重要。这个指令让你在图片加载时显示一个 Spinner ( 基于图像或者 DOM ) 。自豪地由 @...
因此,我们需要自定义虚拟化来实现惰性加载。 3. **扩展接口和委托**:为了控制何时加载子节点,我们可以定义一个接口,比如`ILazyLoadNode`,该接口包含一个委托方法,如`LoadChildren()`。这样,当用户展开一个...
今天起床,拿起手机开机第一时间当然是打开微信了,左右滑动Viewpager,发现它使用了一种叫惰性加载,或者说懒加载(lazy-loading)的方式加载Viewpager中的Fragment。效果如图: 什么是lazy-loading呢?顾名思义...
"WPF 求界面加载速度优化"的主题正聚焦于解决这个问题。描述中提到的场景是界面需要每15秒绘制并更新350个 `LinearBar` 控件,而实际的生成和数据刷新操作仅需1秒,但界面绘制却显得迟缓。这可能由于多种原因导致,...
懒加载,又称惰性加载,是一种延迟加载策略。它避免一次性加载页面所有内容,而是只在用户需要时才加载相关部分。在网页设计中,当用户滚动页面到达某一区域时,该区域的内容才会被请求并显示。这样可以显著减少初始...
懒加载,又称为延迟加载或惰性加载,是一种优化网页性能的技术。在网页中,只有当用户滚动到相应位置时,内容才会被真正加载,而不是在页面初始渲染时一次性加载所有资源。这样可以显著减少页面初次加载的时间,提高...
在IT行业中,论坛延时加载(也称为延迟加载或惰性加载)是一种优化网页性能的技术。Discuz! 是一个非常流行的开源社区论坛软件,它允许用户建立和管理自己的在线讨论平台。这款“论坛延时加载插件”显然是针对Discuz...
用于实现惰性加载图片的js文件。操作简单方便。用于实现惰性加载图片的js文件。操作简单方便。用于实现惰性加载图片的js文件。操作简单方便。