基于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 相关文章推荐
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 Javascript
jquery中获取select选中值的代码
Jun 27 Javascript
Javascript操作cookie的函数代码
Oct 03 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
Mar 11 Javascript
js获取某月的最后一天日期的简单实例
Jun 22 Javascript
JS获取键盘上任意按键的值(实例代码)
Nov 12 Javascript
laytpl 精致巧妙的JavaScript模板引擎
Aug 29 Javascript
jQuery标签编辑插件Tagit使用指南
Apr 21 Javascript
jQuery实现textarea自动增长宽高的方法
Dec 18 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
Sep 04 Javascript
详解vue-cli中配置sass
Jun 21 Javascript
微信小程序系列之自定义顶部导航功能
May 21 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
杏林同学录(八)
2006/10/09 PHP
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
Python字符编码与函数的基本使用方法
2017/09/30 Python
Python OS模块实例详解
2019/04/15 Python
详解python pandas 分组统计的方法
2019/07/30 Python
python argparser的具体使用
2019/11/10 Python
python dict乱码如何解决
2020/06/07 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
上课打牌的检讨书
2014/02/15 职场文书
高中军训感想800字
2014/02/23 职场文书
校园元旦活动总结
2014/07/09 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
建房合同协议书
2016/03/21 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android