基于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 表单验证扩展(四)
Oct 20 Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 Javascript
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
用js实现trim()的解决办法
Apr 16 Javascript
js控制页面控件隐藏显示的两种方法介绍
Oct 09 Javascript
js实现在字符串中提取数字
Nov 05 Javascript
html5 canvas js(数字时钟)实例代码
Dec 23 Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 Javascript
jQuery实现下拉框功能实例代码
May 06 Javascript
vue 表单验证按钮事件交由父组件触发的方法
Dec 17 Javascript
配置一个vue3.0项目的完整步骤
Apr 26 Javascript
vue spa应用中的路由缓存问题与解决方案
May 31 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
php 过滤器实现代码
2010/08/09 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
Django实现学生管理系统
2019/02/26 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
物流专业求职信
2014/06/30 职场文书
企业员工集体活动方案
2014/08/17 职场文书
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers