博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再谈javascript图片预加载技术
阅读量:5246 次
发布时间:2019-06-14

本文共 2412 字,大约阅读时间需要 8 分钟。

图片预加载技术的典型应用

如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展示出来,所以lightbox显示的图片的速度体验要比直接输出的差很多,而本文说提到的预加载技术主要针对获取图片尺寸。

一段典型的使用预加载获取图片大小的例子:

 

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;        };    };};

 

web应用程序区别于桌面应用程序,响应速度才是最好的用户体验。如果想要速度与优雅兼得,那就必须提前获得图片尺寸,如何在图片没有加载完毕就能获取图片尺寸?

一、结合flash加载图片,获取图片头部数据的尺寸

flash虽然很强大,但它与生俱来的缺点让人爱恨交织,加上很多移动设备不支持falsh无疑更是致命的伤,还是放弃吧。

二、在服务端保存图片尺寸数

这里不得不提到腾讯Qzone的lightbox相册,它就是这样做的。它能在图片没有加载完全的时候就居中放大图片,速度与优雅基本兼得。不过它仍然难以避免blog插入的外链图片的问题,也只能按传统的方式加载完毕才能展示。

三、javascript通过占位方式获取图片头部数据的尺

十多年的上网经验告诉我:浏览器在加载图片的时候你会看到图片会先占用一块地然后才慢慢加载完毕,并且这里大部分的图片都是没有预设width与height属性的,因为浏览器能够获取图片的头部数据。基于此,只需要使用javascript定时侦测图片的尺寸状态便可得知图片尺寸就绪的状态。

实现代码:

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);    };};

 

好了,请观赏令人愉悦的 DEMO :

(通过测试的浏览器:Chrome、Firefox、Safari、Opera、IE6、IE7、IE8)

经典论坛交流

本文链接:

转载于:https://www.cnblogs.com/leejersey/p/3683457.html

你可能感兴趣的文章
二叉树hdu1710
查看>>
失去英格兰,欧洲杯会失色?
查看>>
Javascript Dom编程艺术(第2版)读书笔记
查看>>
点击图片更换背景图案
查看>>
无刷新分页代码,jQuery分页完整示例
查看>>
鼠标悬停,会变亮的CSS按钮
查看>>
云计算之路-阿里云-分享:通过RDS备份文件恢复SQL Server数据库
查看>>
AutoHotKey实现软件授权
查看>>
MySQL 多表查询
查看>>
【Kafka源码】日志处理
查看>>
USACO Section1.1 Friday the Thirteenth 解题报告
查看>>
HDU5908 Abelian Period 暴力
查看>>
Spring Security教程(三)
查看>>
第七周作业
查看>>
iOS开发数据库篇—SQLite简单介绍
查看>>
斜率优化DP
查看>>
windows在python基础上安装pip
查看>>
Street Number (UVA 138)
查看>>
尝试读取或写入受保护的内存。这通常指示其他内存已损坏
查看>>
tensorflow学习
查看>>