基于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 和 CSS 实现脚注(Footnote)效果
Sep 09 Javascript
JavaScript四种调用模式和this示例介绍
Jan 02 Javascript
javascript遍历控件实例详细解析
Jan 10 Javascript
使用jsonp完美解决跨域问题
Nov 27 Javascript
被遗忘的javascript的slice() 方法
Apr 20 Javascript
jquery ui dialog替代confirm实例分析
Jan 25 Javascript
jQuery动态添加与删除tr行实例代码
Oct 18 Javascript
Ionic 2 实现列表滑动删除按钮的方法
Jan 22 Javascript
JavaScript轻松创建级联函数的方法示例
Feb 10 Javascript
Javascript 链式作用域详细介绍
Feb 23 Javascript
详解vue 命名视图
Aug 14 Javascript
微信小程序 数据缓存实现方法详解
Aug 26 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实现采集程序原理和简单示例代码
2007/03/18 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
php验证码实现代码(3种)
2015/09/07 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
使用JavaScript switch case 另类写法
2010/03/14 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
JavaScript计算出两个数的差值
2020/03/19 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
python实现获取序列中最小的几个元素
2014/09/25 Python
python中 logging的使用详解
2017/10/25 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
越南综合购物网站:Lazada越南
2019/06/10 全球购物
.net工程师笔试题
2012/06/09 面试题
乐观大学生的自我评价
2014/01/10 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
财务会计岗位职责
2015/02/03 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技
vue组件vue-esign实现电子签名
2022/04/21 Vue.js