图片预加载与懒加载

预加载与懒加载,我们经常经常用到,这些技术不仅仅限于图片加载,我们今天讨论的是图片加载:

一、什么是图片预加载与懒加载:

图片预加载:顾名思义,图片预加载就是在网页全部加载之前,提前加载图片。当用户需要查看时可直接从本地缓存中渲染,以提供给用户更好的体验,减少等待的时间。否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,这样浏览者可能以为图片预览慢而没兴趣浏览,把网页关掉,这时,就需要图片预加载。当然这种做法实际上牺牲了服务器的性能换取了更好的用户体验。

图片懒加载(缓载):延迟加载图片或符合某些条件时才加载某些图片。这样做的好处是减少不必要的访问数据库或延迟访问数据库的次数,因为每次访问数据库都是比较耗时的即只有真正使用该对象的数据时才会创建。懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。

二、图片预加载与懒加载的区别:

两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器前端有一定的缓解压力作用,预载则会增加服务器前端压力。

三、图片预加载与懒加载实现:

1、实现图片预加载:

实现预载的方法非常多,可以用CSS(background)、JS(Image)、HTML(<img />)都可以。常用的是new Image();,设置其src来实现预载,再使用onload方法回调预载完成事件。只要浏览器把图片下载到本地,同样的src就会使用缓存,这是最基本也是最实用的预载方法。当Image下载完图片头后,会得到宽和高,因此可以在预载前得到图片的大小(我所知的方法是用记时器轮循宽高变化)。一般实现预载的工具类,都实现一个Array来存需要预载的URL,然后实现Finish、Error、SizeChange等常用事件,可以由用户选择是顺序预载或假并发预载。Jquery的PreLoad可以用于预载。

model:

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>img ready</title> </head> <body> <div> <p> <button id="testReadyBtn">开始加载图片</button> <button id="clsCacheBtn">清空缓存</button> <p>(如果图片加载过后,浏览器会缓存)</p> </p> <div id="status" style="display:none"> <p><strong>imgReady:</strong><p> <p id="statusReady"></p> <p><strong>imgLoad:</strong></p> <p id="statusLoad"><p> </div> <div id="imgWrap"></div> <div style="display:none"></div> </div> </body> <script> var imgReady = function (url, callback, error) { var width, height, intervalId, check, div,img = new Image(), body = document.body; img.src = url; // 从缓存中读取 if (img.complete) { return callback(img.width, img.height); }; // 通过占位提前获取图片头部数据 if (body) { div = document.createElement(‘div‘); div.style.cssText = ‘visibility:hidden;position:absolute;left:0;top:0;width:1px;height:1px;overflow:hidden‘; div.appendChild(img) body.appendChild(div); width = img.offsetWidth; height = img.offsetHeight; check = function () { if (img.offsetWidth !== width || img.offsetHeight !== height) { clearInterval(intervalId); callback(img.offsetWidth, img.clientHeight); img.onload = null; div.innerHTML = ‘‘; div.parentNode.removeChild(div); }; }; intervalId = setInterval(check, 150); }; // 加载完毕后方式获取 img.onload = function () { callback(img.width, img.height); img.onload = img.onerror = null; clearInterval(intervalId); body && img.parentNode.removeChild(img); }; // 图片加载错误 img.onerror = function () { error && error(); clearInterval(intervalId); body && img.parentNode.removeChild(img); }; }; </script> <script> /* demo script */ window.onload = function () { var imgUrl = ‘http://www.planeart.cn/demo/imgReady/vistas24.jpg?‘, testReadyBtn = document.getElementById(‘testReadyBtn‘), clsCacheBtn = document.getElementById(‘clsCacheBtn‘), status = document.getElementById(‘status‘), statusReady = document.getElementById(‘statusReady‘), statusLoad = document.getElementById(‘statusLoad‘), imgWrap = document.getElementById(‘imgWrap‘); var imgLoad = function (url, callback) { var img = new Image(); img.src = url; if (img.complete) { callback(img.width, img.height); } else { img.onload = function () { callback(img.width, img.height); img.onload = null; }; }; }; testReadyBtn.onclick = function () { var that = this; that.disabled = true; status.style.display = ‘block‘; statusLoad.innerHTML = statusReady.innerHTML = ‘Loading...‘; imgWrap.innerHTML = ‘<img src="‘ + imgUrl + ‘" />‘; // 使用占位方式快速获取大小 imgReady(imgUrl, function (width, height) { statusReady.innerHTML = ‘width:‘ + width + ‘; height:‘ + height; }, function () { statusReady.innerHTML = ‘Img Error!‘; }); // 使用传统方式获取大小 imgLoad(imgUrl, function (width, height) { statusLoad.innerHTML = ‘width:‘ + width + ‘; height:‘ + height; that.disabled = false; }, function () { statusLoad.innerHTML = ‘Img Error!‘; that.disabled = false; }); }; clsCacheBtn.onclick = function () { imgUrl += new Date().getTime(); status.style.display = ‘none‘; imgWrap.innerHTML = ‘‘; }; }; </script> </html>

2、懒加载实现:

第一种是纯粹的延迟加载,使用setTimeOut或setInterval进行加载延迟,如果用户在加载前就离开了页面,那么就不会加载。

第二种是条件加载,符合某些条件,或触发了某些事件才开始异步下载。

第三种是可视区加载,即仅加载用户可以看到的区域,这个主要由监控滚动条来实现,一般会在距用户看到某图片前一定距离遍开始加载,这样能保证用户拉下时正好能看到图片。

Jquery的Lazy Load用于图片缓载

model:

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>原生Js图片延迟加载</title> <style type="text/css"> *{margin: 0;padding: 0} img.scrollLoading{border: 1px solid #ccc;display:block;margin-top: 10px;} </style> </head> <body> <div id="content"> </div> </body> </html> <script type="text/javascript"> var _CalF = { zsl: function(object) { //选择器 if (object === undefined) return; var getArr = function(name, tagName, attr) { var tagName = tagName || ‘*‘, eles = document.getElementsByTagName(tagName), clas = (typeof document.body.style.maxHeight === "undefined") ? "className": "class"; //ie6 attr = attr || clas, Arr = []; for (var i = 0; i < eles.length; i++) { if (eles[i].getAttribute(attr) == name) { Arr.push(eles[i]); } } return Arr; }; if (object.indexOf(‘#‘) === 0) { //#id return document.getElementById(object.substring(1)); } else if (object.indexOf(‘.‘) === 0) { //.class return getArr(object.substring(1)); } else if (object.match(/=/g)) { //attr=name return getArr(object.substring(object.search(/=/g) + 1), null, object.substring(0, object.search(/=/g))); } else if (object.match(/./g)) { //tagName.className return getArr(object.split(‘.‘)[1], object.split(‘.‘)[0]); } }, getPosition: function(obj) { //获取元素在页面里的位置和宽高 var top = 0, left = 0, width = obj.offsetWidth, height = obj.offsetHeight; while (obj.offsetParent) { top += obj.offsetTop; left += obj.offsetLeft; obj = obj.offsetParent; } return { "top": top, "left": left, "width": width, "height": height }; } }; //添加图片list var _temp = []; for (var i = 1; i < 21; i++) { _temp.push(‘<img class="scrollLoading" data-src="http://images.cnblogs.com/cnblogs_com/Darren_code/311197/o_‘ + i + ‘.jpg" src="http://images.cnitblog.com/blog/150659/201306/23160223-c81dd9aa9a2a4071a47b0ced2c9118bc.gif" /><br />图片‘ + i); } _CalF.zsl("#content").innerHTML = _temp.join(""); function scrollLoad() { this.init.apply(this, arguments); } scrollLoad.prototype = { init: function(className) { var className = "img." + className, imgs = _CalF.zsl(className), that = this; this.imgs = imgs; that.loadImg(); window.onscroll = function() { that.time = setTimeout(function() { that.loadImg(); }, 400); } }, loadImg: function() { var imgs = this.imgs.reverse(), //获取数组翻转 len = imgs.length; if (imgs.length === 0) { clearTimeout(this.time); return; } for (var j = len - 1; j >= 0; j--) { //递减 var img = imgs[j], imgTop = _CalF.getPosition(img).top, imgSrc = img.getAttribute("data-src"), offsetPage = window.pageYOffset ? window.pageYOffset: window.document.documentElement.scrollTop, //滚动条的top值 bodyHeight = document.documentElement.clientHeight; //body的高度 if ((offsetPage + bodyHeight / 2) > (imgTop - bodyHeight / 2)) { img.src = imgSrc; this.imgs.splice(j, 1); } } } } var img1 = new scrollLoad("scrollLoading"); </script> 获取屏幕的分辨率 <script type="text/javascript"> document.write(‘您的显示器分辨率为:\n‘ + screen.width + ‘*‘ + screen.height + ‘</br>‘); var ww = document.getElementById("con").offsetWidth, w = screen.width/ww, h = screen.height/ww, r = Math.round(Math.sqrt(w*w + h*h) / 2.54); document.write(‘您的显示器尺寸为:\n‘ + (screen.width/ww).toFixed(1) + ‘*‘ + (screen.height/ww).toFixed(1) + ‘ cm, ‘+ r +‘寸<br/>‘); </script>

源引:http://bianhua1314.blog.163.com/blog/static/23894303020147139581721/

时间: 2024-10-07 15:58:09

图片预加载与懒加载的相关文章

网站优化--图片的预加载与懒加载(上)

1.延迟加载即懒加载,主要目的是作为服务器前端的优化,减少请求数或延迟请求数,在一些图片非常多的网站中非常有用,当图片位置进入到可视区的时候才会被加载,这样对于含有很多 图片的比较长的网页来说,可以加载的更快,并且还能节省服务器带宽 最常用的方式是:监控滚动条的高度,当滚动条高度和可视区高度之和小于图片位置距离页面的高度时会被加载 2.预加载:在查看前面张图片的时候加载后面的图片,在提升用户体验的同时会增加服务器的压力 常用方式:创建image对象,通过src属性加载url资源,当资源加载完成后

mybatis_12延时加载_懒加载

延时加载:也叫懒加载 2.1 延迟加载 延迟加载又叫懒加载,也叫按需加载.也就是说先加载主信息,在需要的时候,再去加载从信息. 在mybatis中,resultMap标签 的association标签和collection标签具有延迟加载的功能. 默认是即时加载,在配置完上面的一系列信息之后,只要打开总开关就是懒加载 总开关: 2.2 案例: Mapper.java     Mapper.xml UserMappler.xml   OrdersMapper.xml   测试 配置懒加载   原文

vue项目实现路由按需加载(路由懒加载)的3种方式

为什么需要懒加载? 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出啊先长时间的白屏,即使做了loading也是不利于用户体验,而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载用时 vue异步组件es提案的import()webpack的require,ensure()1 . vue异步组件技术 ==== 异步加载 vue-router配置路由 , 使用

图片预加载和懒加载

1.什么是预加载? 提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 2:什么是懒加载? 延迟加载图片,当用户需要的时候再去加载图片 当我们访问一些类似电商网站,遇到图片很多情况下,需要浏览器去下载这些图片,遇到网速比较慢的时候,用户等待的时间特别长,造成很不好的用户体验.这样的话,就有可能导致一部分的用户没有耐心,而丢失这部分用户. 图片的预加载是提升用户体验而损失性能的一种做法,而懒加载的性能就比较好,所以将两个结合起来放到web程序中是一种不错的选择. 预加载 Image 对象在客户

实现图片的预加载和懒加载

延迟加载也称为惰性加载,即在长网页中延迟加载图像.用户滚动到它们之前,视口外的图像不会加载.这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快.在某些情况下,它还可以帮助减少服务器负载. 那么延迟加载有什么好处:1.提升用户的体验,避免出现卡顿现象.2.有选择性地请求图片,减少服务器的压力和流量,减小浏览器的负担. 实现方式:1.首先将页面上的图片的 src 属性设为 loading.gif,而图片的真实路径则设置在 data-src 属性中,页面滚动的时候计算图片的位置与滚动的位置,当

页面图片预加载与懒加载

预加载 方法一:CSS实现预加载 1 #preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; } 2 #preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; } 3 #preload-03 { background: url(http://domain.t

关于Hibernate中立即加载和懒加载的区别

当1表与2表之间有OneToMany(类似)关系时候, 对于1表的实体类,设置FetchType=EAGER时(也就是立即加载),取1表数据,对应2表的数据都会跟着一起加载,优点不用进行二次查询. 缺点是严重影响数据查询时间,查询速度慢. FetchType=LAZY(也就是懒加载),此时查询时间大大缩短,缺点是查询表1的数据时,查询不到2表的数据. 不会主动取查询2表的数据.

[Asp.NET MVC+EasyUI] TreeGrid全部加载及懒加载示例

本篇文主要对EasyUI中TreeGrid组件的使用进行演示.对于正在学此组件的童鞋,不防花个几分钟看一下.本文主要演示:TreeGrid的简单应用.懒加载方法.控件数据格式. TreeGrid组件是由DataGrid集成而来,可以使行与行之间存在父子关系,是一种树形网格组件. 1. 创建简单示例 通过post方式调用后端数据,将数据展示到前端,具体代码如下: 1.1 前端代码 <html xmlns="http://www.w3.org/1999/xhtml"> <

网站优化--图片的预加载与懒加载(下)

预加载:通过创建image对象 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="../css/public.css"/> <script type="