基于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 相关文章推荐
js三种排序算法分享
Aug 16 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 Javascript
火狐下input焦点无法重复获取问题的解决方法
Jun 16 Javascript
移动设备web开发首选框架:zeptojs介绍
Jan 29 Javascript
javascript定时器取消定时器及优化方法
Jul 08 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
Aug 06 Javascript
Ionic3实现图片瀑布流布局
Aug 09 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
Sep 20 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
Oct 18 Javascript
详解小程序开发经验:多页面数据同步
May 18 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 Javascript
vue完美实现el-table列宽自适应
May 08 Vue.js
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
PHP中的Memcache详解
2014/04/05 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
vue中的scope使用详解
2017/10/29 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
python实现对一个完整url进行分割的方法
2015/04/29 Python
Python实现处理管道的方法
2015/06/04 Python
python中list列表的高级函数
2016/05/17 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
python应用文件读取与登录注册功能
2019/09/23 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
物业电工岗位职责
2013/11/20 职场文书
护理专业自荐信
2013/12/03 职场文书
北体毕业生求职信
2014/02/28 职场文书
酒鬼酒广告词
2014/03/21 职场文书
车间核算员岗位职责
2014/07/01 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android