http://blog.phpdr.net/js-get-image-size.html
lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如filick相册的全屏效果)。javascript无法获取img文件头数据,真的是这样吗?本文通过一个巧妙的方法让javascript获取它。
这是大部分人使用预加载获取图片大小的例子:
01 |
var imgLoad = function (url, callback) { |
02 |
var img = new Image(); |
06 |
callback(img.width, img.height); |
08 |
img.onload = function () { |
09 |
callback(img.width, img.height); |
可以看到上面必须等待图片加载完毕才能获取尺寸,其速度不敢恭维,我们需要改进。
web应用程序区别于桌面应用程序,响应速度才是最好的用户体验。如果想要速度与优雅兼得,那就必须提前获得图片尺寸,如何在图片没有加载完毕就能获取图片尺寸?
十多年的上网经验告诉我:浏览器在加载图片的时候你会看到图片会先占用一块地然后才慢慢加载完毕,并且不需要预设width与height属性,因为浏览器能够获取图片的头部数据。基于此,只需要使用javascript定时侦测图片的尺寸状态便可得知图片尺寸就绪的状态。
当然实际中会有一些兼容陷阱,如width与height检测各个浏览器的不一致,还有webkit new Image()建立的图片会受以处在加载进程中同url图片影响,经过反复测试后的最佳处理方式:
02 |
// 05.27: 1、保证回调执行顺序:error > ready > load;2、回调函数this指向img本身 |
03 |
// 04-02: 1、增加图片完全加载后的回调 2、提高性能 |
06 |
* 图片头数据加载就绪事件 - 更快获取图片尺寸 |
09 |
* @param {String} 图片路径 |
10 |
* @param {Function} 尺寸就绪 |
11 |
* @param {Function} 加载完毕 (可选) |
12 |
* @param {Function} 加载错误 (可选) |
14 |
alert('size ready: width=' + this.width + '; height=' + this.height); |
17 |
var imgReady = (function () { |
18 |
var list = [], intervalId = null, |
23 |
for (; i < list.length; i++) { |
24 |
list[i].end ? list.splice(i--, 1) : list[i](); |
26 |
!list.length && stop(); |
31 |
clearInterval(intervalId); |
35 |
return function (url, ready, load, error) { |
36 |
var onready, width, height, newWidth, newHeight, |
44 |
load && load.call(img); |
52 |
img.onerror = function () { |
53 |
error && error.call(img); |
55 |
img = img.onload = img.onerror = null; |
59 |
onready = function () { |
61 |
newHeight = img.height; |
62 |
if (newWidth !== width || newHeight !== height || |
63 |
// 如果图片已经在其他地方加载可使用面积检测 |
64 |
newWidth * newHeight > 1024 |
73 |
img.onload = function () { |
74 |
// onload在定时器时间差范围内可能比onready快 |
75 |
// 这里进行检查并保证onready优先执行 |
76 |
!onready.end && onready(); |
78 |
load && load.call(img); |
80 |
// IE gif动画会循环执行onload,置空onload即可 |
81 |
img = img.onload = img.onerror = null; |
87 |
// 无论何时只允许出现一个定时器,减少浏览器性能损耗 |
88 |
if (intervalId === null) intervalId = setInterval(tick, 40); |
调用例子:
2 |
alert('size ready: width=' + this.width + '; height=' + this.height); |
Demo
(通过测试的浏览器:Chrome、Firefox、Safari、Opera、IE6、IE7、IE8)
转自 http://www.planeart.cn/?p=1121
- 转载:js动态获取图片长宽尺寸(兼容所有浏览器,速度极快)
转自:http://blog.phpdr.net/js-get-image-size.html lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如fili ...
- JQuery图片延迟加载插件,动态获取图片长宽尺寸
以前的网站带宽小,没有特别多的大图,现在不同了,各种图片网站如同雨后春笋层出不穷.服务器是抗住了,但是客户端就有意见了,太多的图片必然导致页面加载缓慢,特别是有些table结构的站点更是如此.能否让图 ...
- js获取图片的原始尺寸
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- js获取图片信息(一)-----获取图片的原始尺寸
如何获取图片的原始尺寸大小? 如下,当给 img 设置一个固定的大小时,要怎样获取图片的原始尺寸呢? #oImg{ width: 100px; height: 100px; } <img src ...
- JS快速获取图片宽高的方法
快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...
- js判断图片加载完成后获取图片实际宽高
通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置 ...
- 转载:JS快速获取图片宽高的方法
快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...
- JS获取图片实际宽高及根据图片大小进行自适应
JS获取图片实际宽高,以及根据图片大小进行自适应 <img src="http://xxx.jpg" id="imgs" onload="ad ...
- JS获取图片实际宽高
JS获取图片实际宽高,以及根据图片大小进行自适应 <img src="http://xxx.jpg" id="imgs" onload="ada ...
随机推荐
- 『GreenPlum系列』GreenPlum 4节点集群安装(图文教程)
目标架构如上图 一.硬件评估 cpu主频,核数推荐CPU核数与磁盘数的比例在12:12以上Instance上执行时只能利用一个CPU核资源进行计算,推荐高主频 内存容量 网络带宽重分布操作 R ...
- 30、shiro框架入门2,关于Realm
1.Jdbc的Realm链接,并且获取权限 首先创建shiro-jdbc.ini的配置文件,主要配置链接数据库的信息 配置文件中的内容如下所示 1.变量名=全限定类名会自动创建一个类实例 2.变量名. ...
- Oracle 数据整理
/* 大数据这块用到了 Oracle ... 记录一下. */ SELECT ssn,password FROM (Select ROWNUM AS ROWNO, T.* from ACCOUNT T ...
- keyup keydown keypress 区别
测试的浏览器环境: chrome 版本 43.0.2357.134 mfirefox 版本 24.0IE6(绿色版 IE.exe)IE7IE8IE9 搜狗拼音输入法3.5(3.5.0.1089)网吧专 ...
- Kindeditor为什么提交后获取不到值
LinkButton不是表单提交方式所以获取不到.如果用button submit提交方式就是form提交方式后台就能获取到值 取得编辑器的HTML内容.KindEditor的可视化操作在新创建的if ...
- 基于weka的文本分类实现
weka介绍 参见 1)百度百科:http://baike.baidu.com/link?url=V9GKiFxiAoFkaUvPULJ7gK_xoEDnSfUNR1woed0YTmo20Wjo0wY ...
- iOS工作笔记(十四)
1.scrollview的frame指的是其可视范围,contentSize指的是其滚动范围,分别是在水平方向和竖直方向上的 所以要让scrollview在水平方向不能滚动,那么需要如下设置 _scr ...
- Cobar-Client 实现策略总结
1. 数据源 DataSource CobarClient 的 DataSource 分为三层 ICobarDataSourceService: 封装了多个 DataSourceDescriptor, ...
- 解决 label 多行间距
使用. 一个是间距,一个是行高,但是鉴于多行,都写的话,就相当于双倍行高了.我就用行高代替间距. self.textLabel.attributedText = [self getAttributed ...
- Verilog之SOS信号-仿顺序操作
SOS信号:. . . _ _ _ . . . 1. module sos_module ( CLK, RSTn, Pin_Out, SOS_En_Sig ); input CLK; input RS ...