基于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 相关文章推荐
扩展String功能方法
Sep 22 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
May 25 Javascript
jquery 操作DOM案例代码分享
Apr 05 Javascript
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
js预加载图片方法汇总
Jun 15 Javascript
微信小程序中单位rpx和rem的使用
Dec 06 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 jQuery
关于webpack代码拆分的解析
Jul 20 Javascript
详谈js中标准for循环与foreach(for in)的区别
Nov 02 Javascript
JavaScript闭包原理与用法实例分析
Aug 10 Javascript
微信小程序设置滚动条过程详解
Jul 25 Javascript
实例讲解React 组件
Jul 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 截取字符串专题集合
2010/08/19 PHP
php类常量的使用详解
2013/06/08 PHP
php实现微信支付之现金红包
2018/05/30 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
python的exec、eval使用分析
2017/12/11 Python
python Opencv将图片转为字符画
2021/02/19 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
详解python算法之冒泡排序
2019/03/05 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
wxPython实现列表增删改查功能
2019/11/19 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
Python实现简单的2048小游戏
2021/03/01 Python
专营店会计助理岗位职责
2013/11/29 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
装修设计师求职信
2014/02/26 职场文书
演讲主持词
2014/03/18 职场文书
爱国主义演讲稿
2014/05/07 职场文书
社会发展项目建议书
2014/08/25 职场文书
好媳妇事迹材料
2014/12/24 职场文书
MySQL基础(二)
2021/04/05 MySQL