目录

1. 使用jQuery图片预加载(延迟加载)插件Lazy Load

Lazy Load也叫惰性加载,延迟加载,顾名思义,就是在图片未到达可视区域时,不加载图片,我们常常在很多的优秀网站上看到类似的例子,例如迅雷、土豆、优酷等,由于一个网页的图片非常多,一次性加载增加服务器压力,而且用户未必会拉到底部,浪费用户流量,Lazy Load采用按需加载,更快的加载速度从而达到优化网页的目的。

使用方法:

加载jQuery, 并在html代码的底部包含进来

设置图片的占位符为data-original, 给图片一个特别的标签, 像这样设置图片

1

2

3$(function(){

$("img.lazy").lazyload();

});

注意:你必须给图片设置一个height和width,或者在CSS中定义,否则可能会影响到图片的显示。

插件选项

图片预先加载距离:threshold,通过设置这个值,在图片未出现在可视区域的顶部距离这个值时加载。默认为0,下面为设置threshold为200表示在图片距离可视区域还有200像素时加载。

$("img.lazy").lazyload({

threshold :200

});

事件绑定加载的方式:event,你可以使用jQuery的事件,例如“click”、“mouseover”,或者你也可以自定义事件,默认等待用户滚动,图片出现在可视区域。下面是使用click:

1$("img.lazy").lazyload({event:"click"});

显示效果:effect,默认使用show(),你可以使用fadeIn(逐渐出现)方式,代码如下:

1

2

3$("img.lazy").lazyload({

effect :"fadeIn"

});

对于禁用javascript的浏览器则要加上noscript内容:

图片限定在某个容器内:container,你可以通过限定某个容器内容的图片才会生效,代码如下:

#container {

height:600px;

overflow: scroll;

}

$("img.lazy").lazyload({

container: $("#container")

});

2. JS实现图片预加载

在浏览器渲染图片的时候, 它获得图片的一片区域的时候, 就已经为这张图片预留了一片空白的区域来填充图片, 这就是预加载获得图片尺寸最原始的使用方法.

有时候会加载一些在当前页面没有用到的图片,是为了提前加载到缓存里,这样后面的页面就可以直接从缓存读取了。

加载大图的时候,我们可以先显示模糊的缩略图,等到大图加载完了,再把缩略图替换掉,这样填补了图片加载期间的空白时间。

image也有onload和onerror事件,分别是加载完后和加载失败时执行。

Image对象是专门用于处理图片加载的,就相当于内存中的img标签。

图片预加载案例:鼠标移入一张图片时,换成另一张图片,移出时换回原来的图片。正常做法是,鼠标移入的时候,改变图片的src,但这时就要去加载图片了,会等待一段时间,这样体验不好。预加载的做法是,在页面加载完,鼠标移入之前就通过Image对象把图片加载进缓存了,这样鼠标移入的时候直接从缓存里读取了,速度很快。

图片预加载:

1

2

3

4if(document.images){

var img =new Image();

img.src ="img/example.jpg";

}

封装成一个预加载图片的函数

1

2

3

4

5

6

7

8

9

10

11

12//实现图片的预加载

function preloadImg(srcArr){

if(srcArrinstanceof Array){

for(var i=0; i

var oImg =new Image();

oImg.src = srcArr[i];

}

}

}

//预加载图片

preloadImg(['image/example.jpg']);//参数是一个url数组

使用一个回调函数来获得图片的属性

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16function getPreloadImgAttr(url,callback){

var oImg =new Image();//创建一个Image对象,实现图片的预加载

oImg.src = url;// 看下一节,其实应当先进行onload的绑定,再赋值给src

if(oImg.complete){

//如果图片已经存在于浏览器缓存,直接调用回调函数

callback.call(oImg);

return;//直接返回,不再处理onload事件

}

oImg.onload =function(){

//图片下载完毕时异步调用callback函数

callback.call(oImg);

};

}

getPreloadImgAttr('image/example.jpg',function(){

console.log(this.width,this.height);

});

关于预加载图片的改进

网上看到一篇博客关于图片的预加载,你所不知道的, 其中指出以上通用的方法存在一些问题:

创建了一个临时匿名函数来作为图片的onload事件处理函数,形成了闭包。

相信大家都看到过ie下的内存泄漏模式的文章,其中有一个模式就是循环引用,而闭包就有保存外部运行环境的能力(依赖于作用域链的实现),所以img.onload这个函数内部又保存了对img的引用,这样就形成了循环引用,导致内存泄漏。(这种模式的内存泄漏只存在低版本的ie6中,打过补丁的ie6以及高版本的ie都解决了循环引用导致的内存泄漏问题)。

只考虑了静态图片的加载,忽略了gif等动态图片,这些动态图片可能会多次触发onload。

改进方法:

1

2

3

4

5

6

7

8function loadImage(url, callback) {

var img =new Image();//创建一个Image对象,实现图片的预下载

img.onload =function(){

img.onload =null;

callback(img);

}

img.src = url;

}

这样内存泄漏,动态图片的加载问题都得到了解决,而且也以统一的方式,实现了callback的调用。

关于这个方法, 有个疑问是缓存的问题, 在原文里也给出了一些解释

经过对多个浏览器版本的测试,发现ie、opera下,当图片加载过一次以后,如果再有对该图片的请求时,由于浏览器已经缓存住这张图

片了,不会再发起一次新的请求,而是直接从缓存中加载过来。对于 firefox和safari,它们试图使这两种加载方式对用户透明,同样

会引起图片的onload事件,而ie和opera则忽略了这种同一性,不会引起图片的onload事件,因此上边的代码在它们里边不能得以实

现效果。

但整体来讲,仍然应该先进行onload事件的绑定, 再赋值src

3. 用CSS实现图片的预加载

这个概念就是写一个CSS样式设置一批背景图片,然后将其隐藏,这样你就看不到那些图片了。那些背景图片就是你想预载的图片。

1

2

3#preload-01 {background:url(http://domain.tld/image-01.png)no-repeat -9999px -9999px; }

#preload-02 {background:url(http://domain.tld/image-02.png)no-repeat -9999px -9999px; }

#preload-03 {background:url(http://domain.tld/image-03.png)no-repeat -9999px -9999px; }

这里为了隐藏这些图片, 使用了位置设置为极大的负值的方法. 还可以直接设置 { width: 0; height: 0; display: none};

该方法虽然高效,但仍有改进余地。使用该法加载的图片会同页面的其他内容一起加载,增加了页面的整体加载时间。为了解决这个问题,我们增加了一些JavaScript代码,来推迟预加载的时间,直到页面加载完毕。代码如下:

//better image preloading @ http://perishablepress.com/press/2009/12/28/3-ways-preload-images-css-javascript-ajax/

function preloader() {

if (document.getElementById) {

document.getElementById("preload-01").style.background = "url(http://domain.tld/image-01.png) no-repeat -9999px -9999px";

document.getElementById("preload-02").style.background = "url(http://domain.tld/image-02.png) no-repeat -9999px -9999px";

document.getElementById("preload-03").style.background = "url(http://domain.tld/image-03.png) no-repeat -9999px -9999px";

}

}

function addLoadEvent(func) {

var oldonload = window.onload;

if (typeof window.onload != 'function') {

window.onload = func;

} else {

window.onload = function() {

if (oldonload) {

oldonload();

}

func();

}

}

}

addLoadEvent(preloader);

在该脚本的第一部分,我们获取使用类选择器的元素,并为其设置了background属性,以预加载不同的图片。

该脚本的第二部分,我们使用addLoadEvent()函数来延迟preloader()函数的加载时间,直到页面加载完毕。

如果JavaScript无法在用户的浏览器中正常运行,会发生什么?很简单,图片不会被预加载,当页面调用图片时,正常显示即可。

4. 使用Ajax实现预加载

该方法利用DOM,不仅仅预加载图片,还会预加载CSS、JavaScript等相关的东西。使用Ajax,比直接使用JavaScript,优越之处在于JavaScript和CSS的加载不会影响到当前页面。该方法简洁、高效。

window.onload = function() {

setTimeout(function() {

//XHR to request a JS and a CSS

var xhr = new XMLHttpRequest();

xhr.open('GET', 'http://domain.tld/preload.js');

xhr.send('');

xhr = new XMLHttpRequest();

xhr.open('GET', 'http://domain.tld/preload.css');

xhr.send('');

//preload image

new Image().src = "http://domain.tld/preload.png";

}, 1000);

};

上面代码预加载了“preload.js”、“preload.css”和“preload.png”。1000毫秒的超时是为了防止脚本挂起,而导致正常页面出现功能问题。

与之相比, 如果用js的话, 要实现以上加载过程则会应用到页面上. 实现如下

window.onload = function() {

setTimeout(function() {

//reference to

var head = document.getElementsByTagName('head')[0];

//a new CSS

var css = document.createElement('link');

css.type = "text/css";

css.rel = "stylesheet";

css.href = "http://domain.tld/preload.css";

//a new JS

var js = document.createElement("script");

js.type = "text/javascript";

js.src = "http://domain.tld/preload.js";

//preload JS and CSS

head.appendChild(css);

head.appendChild(js);

//preload image

new Image().src = "http://domain.tld/preload.png";

}, 1000);

};

这里,我们通过DOM创建三个元素来实现三个文件的预加载。正如上面提到的那样,使用Ajax,加载文件不会应用到加载页面上。从这点上看,Ajax方法优越于JavaScript。

html加载图片有超时时间吗,[前端]图片预加载方法相关推荐

  1. 前端资源预加载并展示进度条

    我们经常会看到,一些站点在首次进入的时候会先显示一个进度条,等资源加载完毕后再呈现页面,大概像这样: 然后整个页面的操作就会非常流畅,因为之后没必要再等待加载资源了.尤其是在移动端,或者是页游中,这样 ...

  2. Note | 前端资源预加载

    目录 - dns-prefetch - preconnect - subresource - prerender - prefetch - preload dns-prefetch 通过 DNS 预解 ...

  3. 前端优化——预加载篇

    #预加载 1.什么是预加载 资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到.预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就 ...

  4. jsp预加载转圈_30种CSS3炫酷页面预加载loading动画特效(推荐)

    这是一组效果非常炫酷的CSS3页面预加载loading动画特效.该特效共有30种不同的loading效果.所有的加载动画都是使用CSS3来完成,jQuery代码只是用于隐藏加载动画.当你点击页面的任何 ...

  5. css3控制html中图片,如何使用CSS控制前端图片HTTP请求

    Web前端图片加载的方式多种多样,其所产生的HTTP请求也各异,这里我们就来列举CSS控制前端图片HTTP请求的各种情况示例,需要的朋友可以参考下 图片的http请求,有很多种情况,那么究竟什么情况下 ...

  6. 前端js获取图片大小 扩展名_前端获取图片存储大小的方法

    1利用input元素获取 如果是input元素 var file=document.getElementById('myinput'); var fileData = file.files[0]; v ...

  7. html图片怎么预加载,如何利用CSS和Javascript实现图片预加载

    说到图片预加载,想必大家已经很熟悉了,在平时的项目中,我们常用插件实现预加载,比如:懒加载lazyload插件等等.如果你想了解下lazyload,可以看下这两篇文章: 今天主要想介绍不用插件实现图片 ...

  8. 前端项目分析:我是如何做图片优化的(预加载、懒加载和延迟加载)

    众所周知:前端页面上的图片是优化时最重要也是最令人头疼的部分,花费了几个月的时间才优化到令自己满意的一半程度,,,唉,一言难尽啊! 在此将几种方法总结一下,希望能帮到不少人吧- 图片的优化有两种方式: ...

  9. 用javascript预加载图片、css、js的方法研究

    预加载的好处可以让网页更快的呈现给用户,缺点就是可能会增加无用的请求(但图片.css.js这些静态文件可以被缓存),如果用户访问的页面里面的css.js.图片被预加载了,用户打开页面的速度会快很多,提 ...

最新文章

  1. Linux那些事儿之我是Sysfs(7)dentry与inode
  2. 某程序员吐槽:组里新来一位美女同事,男同事们冲上去大献殷勤,过几天又一哄而散!...
  3. Laravel 任务调度(Console)
  4. 移动端1px像素的设置?
  5. 关于spring mybateis 定义resultType=java.util.HashMap
  6. BOOST_VMD_ASSERT_IS_TUPLE宏相关的测试程序
  7. boost::ratio_less_equal相关的测试程序
  8. 操作系统(四)文件管理
  9. 利用Python爬取网易上证所有股票数据(代码
  10. matlab2018安装摄像头驱动以及如何调用摄像头
  11. 设计模式(二)--单例模式
  12. Ubuntu学习 history
  13. 解决学校断网,突破天翼校园,实现共享wifi以及linux下无天翼校园客户端
  14. pt和px区别 pt是逻辑像素,px是物理像素
  15. 牛客 送分啦-QAQ
  16. matlab 安装出来封面就没了,基于Matlab的计算报告书封面生成方法及计算机存储介质与流程...
  17. vue使用vue-video-player播放视频及遇到的问题
  18. 平头哥玄铁CPU调试系统介绍
  19. 解决ORA-O4O89:无法对sys拥有的对象创建触发器
  20. 【计算机网络 王道】P2-1 字节与比特

热门文章

  1. 获取滚动条宽度(Element-UI之三)
  2. 游戏夜读 | 不受欢迎的那个人
  3. html clear属性值,【Web前端基础知识】clear使用方法
  4. linux如何修改文件权限
  5. Hutool 工具类优雅非空验证
  6. 导致股票回测接口回测效果差的原因有哪些?
  7. 了解集群、集群的分类、常用的集群软硬件及选型介绍(内附详细图解)
  8. 神经网络用于日内股票预测
  9. oracle的select into
  10. 初识面向对象二(继承/抽象/C3)