基于jquery的防止大图片撑破页面的实现代码(立即缩放)


Posted in Javascript onOctober 24, 2011

为了防止图片撑破布局,最常见的仍然是通过onload后获取图片尺寸再进行调整,所以加载过程中仍然会撑破。而Qzone日志的图片在此进行了改进,onload完毕后才显示原图。我以前用onload写过一个小例子:http://www.planeart.cn/?p=1022

通过imgReady可以跨浏览器在dom ready就可以实现图片自适应,无需等待img加载,代码如下:
(3-17修复网友crossyou 指出的一处错误,并且新版本去掉了替换图片)

// jquery.autoIMG.js - 2010-04-02 - Tang Bin - http://planeArt.cn/ - MIT Licensed 
(function ($) { 
// 检测是否支持css2.1 max-width属性 
var isMaxWidth = 'maxWidth' in document.documentElement.style, 
// 检测是否IE7浏览器 
isIE7 = !-[1,] && !('prototype' in Image) && isMaxWidth; $.fn.autoIMG = function () { 
var maxWidth = this.width(); 
return this.find('img').each(function (i, img) { 
// 如果支持max-width属性则使用此,否则使用下面方式 
if (isMaxWidth) return img.style.maxWidth = maxWidth + 'px'; 
var src = img.src; 
// 隐藏原图 
img.style.display = 'none'; 
img.removeAttribute('src'); 
// 获取图片头尺寸数据后立即调整图片 
imgReady(src, function (width, height) { 
// 等比例缩小 
if (width > maxWidth) { 
height = maxWidth / width * height, 
width = maxWidth; 
img.style.width = width + 'px'; 
img.style.height = height + 'px'; 
}; 
// 显示原图 
img.style.display = ''; 
img.setAttribute('src', src); 
}); 
}); 
}; 
// IE7缩放图片会失真,采用私有属性通过三次插值解决 
isIE7 && (function (c,d,s) {s=d.createElement('style');d.getElementsByTagName('head')[0].appendChild(s);s.styleSheet&&(s.styleSheet.cssText+=c)||s.appendChild(d.createTextNode(c))})('img {-ms-interpolation-mode:bicubic}',document); 
/** 
* 图片头数据加载就绪事件 
* @see http://www.planeart.cn/?p=1121 
* @param {String} 图片路径 
* @param {Function} 尺寸就绪 (参数1接收width; 参数2接收height) 
* @param {Function} 加载完毕 (可选. 参数1接收width; 参数2接收height) 
* @param {Function} 加载错误 (可选) 
*/ 
var imgReady = (function () { 
var list = [], intervalId = null, 
// 用来执行队列 
tick = function () { 
var i = 0; 
for (; i < list.length; i++) { 
list[i].end ? list.splice(i--, 1) : list[i](); 
}; 
!list.length && stop(); 
}, 
// 停止所有定时器队列 
stop = function () { 
clearInterval(intervalId); 
intervalId = null; 
}; 
return function (url, ready, load, error) { 
var check, width, height, newWidth, newHeight, 
img = new Image(); 
img.src = url; 
// 如果图片被缓存,则直接返回缓存数据 
if (img.complete) { 
ready(img.width, img.height); 
load && load(img.width, img.height); 
return; 
}; 
// 检测图片大小的改变 
width = img.width; 
height = img.height; 
check = function () { 
newWidth = img.width; 
newHeight = img.height; 
if (newWidth !== width || newHeight !== height || 
// 如果图片已经在其他地方加载可使用面积检测 
newWidth * newHeight > 1024 
) { 
ready(newWidth, newHeight); 
check.end = true; 
}; 
}; 
check(); 
// 加载错误后的事件 
img.onerror = function () { 
error && error(); 
check.end = true; 
img = img.onload = img.onerror = null; 
}; 
// 完全加载完毕的事件 
img.onload = function () { 
load && load(img.width, img.height); 
!check.end && check(); 
// IE gif动画会循环执行onload,置空onload即可 
img = img.onload = img.onerror = null; 
}; 
// 加入队列中定期执行 
if (!check.end) { 
list.push(check); 
// 无论何时只允许出现一个定时器,减少浏览器性能损耗 
if (intervalId === null) intervalId = setInterval(tick, 40); 
}; 
}; 
})(); 
})(jQuery);

autoIMG压缩后:1.74kb,兼容:Chrome | Firefox | Sifari | Opera | IE6 | IE7 | IE8 | …

调用演示:$(‘#demo p').autoIMG()

同样,令人愉悦的DEMO地址在这里:http://demo.3water.com/js/2011/autoimg/

后记:虽然有了上一篇文章imgReady技术的铺垫,我以为会很简单的实现这个图片自适应插件,可是过程中却在webkit内核的浏览器碰了一鼻子灰,后来才得知webkit有BUG未修复,webkit无法无法中断img下载。我折腾许久后更新了imgReady函数与这个例子。

打包下载地址

Javascript 相关文章推荐
Javascript Jquery 遍历Json的实现代码
Mar 31 Javascript
精选的10款用于构建良好易用性网站的jQuery插件
Jan 23 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
Oct 01 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
Nov 14 Javascript
javascript制作坦克大战全纪录(2)
Nov 27 Javascript
jquery插件bxslider用法实例分析
Apr 16 Javascript
详解JavaScript中的属性和特性
Dec 08 Javascript
详解VueJS 数据驱动和依赖追踪分析
Jul 26 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
Jun 11 Javascript
css值转换成数值请抛弃parseInt
Oct 24 #Javascript
更优雅的事件触发兼容
Oct 24 #Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 #Javascript
最佳的addEvent事件绑定是怎样诞生的
Oct 24 #Javascript
关于javascript function对象那些迷惑分析
Oct 24 #Javascript
文本框根据输入内容自适应高度的代码
Oct 24 #Javascript
js创建数据共享接口——简化框架之间相互传值
Oct 23 #Javascript
You might like
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
php&amp;mysql 日期操作小记
2012/02/27 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
javascript计时器事件使用详解
2014/01/07 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
一个简单的python程序实例(通讯录)
2013/11/29 Python
Python中的tuple元组详细介绍
2015/02/02 Python
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
python中的格式化输出用法总结
2016/07/28 Python
Python检测数据类型的方法总结
2019/05/20 Python
Django stark组件使用及原理详解
2019/08/22 Python
500行python代码实现飞机大战
2020/04/24 Python
python中线程和进程有何区别
2020/06/17 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
给老婆的保证书
2015/01/16 职场文书
投资申请报告
2015/05/19 职场文书
班级管理经验交流材料
2015/11/02 职场文书
Python3 类型标注支持操作
2021/06/02 Python
JS代码编译器Monaco使用方法
2021/06/11 Javascript
Nginx反向代理、重定向
2022/04/13 Servers