基于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验证整数加保留小数点的简单实例
Dec 02 Javascript
Jquery之Bind方法参数传递与接收的三种方法
Jun 24 Javascript
推荐一款jQuery插件模板
Jan 09 Javascript
javaScript的函数对象的声明详解
Feb 06 Javascript
JS实现5秒钟自动封锁div层的方法
Feb 20 Javascript
javascript实现抽奖程序的简单实例
Jun 07 Javascript
js中利用cookie实现记住密码功能
Aug 20 Javascript
用npm-run实现自动化任务的方法示例
Jan 14 Javascript
Vue中全局变量的定义和使用
Jun 05 Javascript
在Vue项目中使用Typescript的实现
Dec 19 Javascript
js实现随机点名器精简版
Jun 29 Javascript
JS检测浏览器开发者工具是否打开的方法详解
Oct 02 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在window iis的莫名问题的测试方法
2013/05/14 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
关于vue面试题汇总
2018/03/20 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
js的对象与函数详解
2019/01/21 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
美国知名艺术画网站:Art.com
2017/02/09 全球购物
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
简历中个人求职的自我评价模板
2013/11/29 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
公司奖励通知
2015/04/21 职场文书
卡特教练观后感
2015/06/08 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript
配置nginx负载均衡
2022/05/06 Servers