JQuery/PHP

js动态获取图片尺寸(兼容所有浏览器,速度极快)

阿里云

lightbox 类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如 filick 相册的全屏效果)。javascript 无法获取 img 文件头数据,真的是这样吗?本文通过一个巧妙的方法让 javascript 获取它。

这是大部分人使用预加载获取图片大小的例子:

也想出现在这里?联系我们
创客主机
  1. var imgLoad = function (url, callback) {
  2.     var img = new Image();
  3.  
  4.     img.src = url;
  5.     if (img.complete) {
  6.         callback(img.width, img.height);
  7.     } else {
  8.         img.onload = function () {
  9.             callback(img.width, img.height);
  10.             img.onload = null;
  11.         };
  12.     };
  13.  
  14. };

可以看到上面必须等待图片加载完毕才能获取尺寸,其速度不敢恭维,我们需要改进。

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

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

当然实际中会有一些兼容陷阱,如 width 与 height 检测各个浏览器的不一致,还有 webkit new Image()建立的图片会受以处在加载进程中同 url 图片影响,经过反复测试后的最佳处理方式:

  1. /**
  2.  * 图片头数据加载就绪事件 - 更快获取图片尺寸
  3.  * @version 2011.05.27
  4.  * @see     http://blog.phpdr.net/js-get-image-size.HTML
  5.  * @param   {String}    图片路径
  6.  * @param   {Function}  尺寸就绪
  7.  * @param   {Function}  加载完毕 (可选)
  8.  * @param   {Function}  加载错误 (可选)
  9.  * @example imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {
  10.         alert('size ready: width=' + this.width + '; height=' + this.height);
  11.     });
  12.  */
  13. var imgReady = (function () {
  14.     var list = [], intervalId = null,
  15.  
  16.     // 用来执行队列
  17.     tick = function () {
  18.         var i = 0;
  19.         for (; i < list.length; i++) {
  20.             list[i].end ? list.splice(i--, 1) : list[i]();
  21.         };
  22.         !list.length && stop();
  23.     },
  24.  
  25.     // 停止所有定时器队列
  26.     stop = function () {
  27.         clearInterval(intervalId);
  28.         intervalId = null;
  29.     };
  30.  
  31.     return function (url, ready, load, error) {
  32.         var onready, width, height, newWidth, newHeight,
  33.             img = new Image();
  34.  
  35.         img.src = url;
  36.  
  37.         // 如果图片被缓存,则直接返回缓存数据
  38.         if (img.complete) {
  39.             ready.call(img);
  40.             load && load.call(img);
  41.             return;
  42.         };
  43.  
  44.         width = img.width;
  45.         height = img.height;
  46.  
  47.         // 加载错误后的事件
  48.         img.onerror = function () {
  49.             error && error.call(img);
  50.             onready.end = true;
  51.             img = img.onload = img.onerror = null;
  52.         };
  53.  
  54.         // 图片尺寸就绪
  55.         onready = function () {
  56.             newWidth = img.width;
  57.             newHeight = img.height;
  58.             if (newWidth !== width || newHeight !== height ||
  59.                 // 如果图片已经在其他地方加载可使用面积检测
  60.                 newWidth * newHeight > 1024
  61.             ) {
  62.                 ready.call(img);
  63.                 onready.end = true;
  64.             };
  65.         };
  66.         onready();
  67.  
  68.         // 完全加载完毕的事件
  69.         img.onload = function () {
  70.             // onload在定时器时间差范围内可能比onready快
  71.             // 这里进行检查并保证onready优先执行
  72.             !onready.end && onready();
  73.  
  74.             load && load.call(img);
  75.  
  76.             // IE gif动画会循环执行onload,置空onload即可
  77.             img = img.onload = img.onerror = null;
  78.         };
  79.  
  80.         // 加入队列中定期执行
  81.         if (!onready.end) {
  82.             list.push(onready);
  83.             // 无论何时只允许出现一个定时器,减少浏览器性能损耗
  84.             if (intervalId === null) intervalId = setInterval(tick, 40);
  85.         };
  86.     };
  87. })();

调用例子

  1. imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {
  2.     alert('size ready: width=' + this.width + '; height=' + this.height);
  3. });

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

js 动态获取图片尺寸(兼容所有浏览器,速度极快)

已有 157 人购买
查看演示升级 VIP立刻购买

收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!