基于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 相关文章推荐
多广告投放代码 推荐
Nov 13 Javascript
通过JS判断联网类型和连接状态的实现代码
Apr 01 Javascript
详解javascript中的事件处理
Nov 06 Javascript
Vue列表页渲染优化详解
Jul 24 Javascript
详解如何去除vue项目中的#——History模式
Oct 13 Javascript
jQuery实现的回车触发按钮事件功能示例
Mar 25 jQuery
bootstrap table合并行数据并居中对齐效果
Oct 17 Javascript
jQuery Migrate 插件用法实例详解
May 22 jQuery
解决Vue动态加载本地图片问题
Oct 09 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
Oct 23 Javascript
VUE实时监听元素距离顶部高度的操作
Jul 29 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
Aug 07 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简单实现冒泡排序的方法
2016/12/26 PHP
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
AngularJS快速入门
2015/04/02 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
python回调函数的使用方法
2014/01/23 Python
用Python输出一个杨辉三角的例子
2014/06/13 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Python实现图像几何变换
2015/07/06 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
如何通过命令行进入python
2020/07/06 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
专业毕业生个性的自我评价
2013/10/03 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
灰雀教学反思
2014/04/28 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
第二课堂活动总结
2014/05/07 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
Redis实现分布式锁的五种方法详解
2022/06/14 Redis