基于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 相关文章推荐
jQuery 使用手册(三)
Sep 23 Javascript
javascript GUID生成器实现代码
Oct 31 Javascript
JSON+JavaScript处理JSON的简单例子
Mar 20 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
Jul 01 Javascript
读取input:file的路径并显示本地图片的方法
Sep 23 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
浅谈javascript 函数属性和方法
Jan 21 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
May 26 jQuery
vue做移动端适配最佳解决方案(亲测有效)
Sep 04 Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 Javascript
react 移动端实现列表左滑删除的示例代码
Jul 04 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
smarty内置函数section的用法
2015/01/22 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
Less 安装及基本用法
2018/05/05 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
python定时器使用示例分享
2014/02/16 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
python的re正则表达式实例代码
2018/01/24 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
Python的垃圾回收机制详解
2019/08/28 Python
Django视图扩展类知识点详解
2019/10/25 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
python 实现dict转json并保存文件
2019/12/05 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
红领巾广播站广播稿
2014/02/01 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
Python实现简繁体转换
2021/06/07 Python
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技