jQuery动态改变图片显示大小(修改版)的实现思路及代码


Posted in Javascript onDecember 24, 2013

当我们要显示后台传过来若干个尺寸不一的图片时,为了保证图片大小的一致性及比例的协调,需要动态改变图片显示尺寸。通过搜索,我们可以从网上找到实现此功能的jQuery代码如下。这段代码可以使图片的大小保持在一定范围内,如果图片的原始尺寸都大于max*值,则显示出来的图片宽度都相等。

原始代码:

$(document).ready(function() {
     $('.post img').each(function() {
     var maxWidth = 100; // 图片最大宽度
     var maxHeight = 100;    // 图片最大高度
     var ratio = 0;  // 缩放比例
     var width = $(this).width();    // 图片实际宽度
     var height = $(this).height();  // 图片实际高度     // 检查图片是否超宽
     if(width > maxWidth){
         ratio = maxWidth / width;   // 计算缩放比例
         $(this).css("width", maxWidth); // 设定实际显示宽度
         height = height * ratio;    // 计算等比例缩放后的高度 
         $(this).css("height", height);  // 设定等比例缩放后的高度
     }
     // 检查图片是否超高
     if(height > maxHeight){
         ratio = maxHeight / height; // 计算缩放比例
         $(this).css("height", maxHeight);   // 设定实际显示高度
         width = width * ratio;    // 计算等比例缩放后的高度
         $(this).css("width", width * ratio);    // 设定等比例缩放后的高度
     }
 });
 });

在我的js代码中,也采取了这种写法。然而在不同的浏览器测试效果时,发现此种写法不能适应chrome浏览器(chrome版本号为10.0.648.204),会产生图片以原有尺寸显示出来的bug。后来把$('.post img').each()的代码用$(window).load()方法包装起来,就解决了chrome浏览器显示不正确的问题。那么在chrome浏览器中为什么会产生bug,并且$(document).ready和$(window).load有什么区别呢?

原来document ready事件是在HTML文档载入即DOM准备好就开始执行了,即使图片资源还没有加载进来。而window load事件执行的稍晚一些,它是在整个页面包括frames, objects和images都加载完成后才开始执行的。从这种区别可以分析出chrome浏览器在对于图片不采用$(window).load()方法处理时,图片载入与动态改变图片的js代码执行顺序不确定。

关于上面的代码,放到我的页面中时获取图片高度时会报错,提示没有提供width方法

var width = $(this).width();    // 图片实际宽度
     var height = $(this).height();  // 图片实际高度

故修改代码如下:

jQuery(window).load(function () {
            jQuery("div.product_info img").each(function () {
                DrawImage(this, 680, 1000);
            });
        });
        function DrawImage(ImgD, FitWidth, FitHeight) {
            var image = new Image();
            image.src = ImgD.src;
            if (image.width > 0 && image.height > 0) {
                if (image.width / image.height >= FitWidth / FitHeight) {
                    if (image.width > FitWidth) {
                        ImgD.width = FitWidth;
                        ImgD.height = (image.height * FitWidth) / image.width;
                    } else {
                        ImgD.width = image.width;
                        ImgD.height = image.height;
                    }
                } else {
                    if (image.height > FitHeight) {
                        ImgD.height = FitHeight;
                        ImgD.width = (image.width * FitHeight) / image.height;
                    } else {
                        ImgD.width = image.width;
                        ImgD.height = image.height;
                    }
                }
            }
        }
Javascript 相关文章推荐
ExtJS 2.0实用简明教程 之Border区域布局
Apr 29 Javascript
一个可以增加和删除行的table并可编辑表格中内容
Jun 16 Javascript
jQuery实现布局高宽自适应的简单实例
May 28 Javascript
DIV+CSS+jQ实现省市联动可扩展
Jun 22 Javascript
浅谈JavaScript 数据属性和访问器属性
Sep 01 Javascript
node.js实现登录注册页面
Apr 08 Javascript
jQuery之动画ajax事件(实例讲解)
Jul 18 jQuery
angularjs 的数据绑定实现原理
Jul 02 Javascript
js实现一个页面多个倒计时的3种方法
Feb 25 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
Nov 12 Javascript
JavaScript indexOf()原理及使用方法详解
Jul 09 Javascript
vue中div禁止点击事件的实现
Apr 02 Vue.js
jquery自动切换tabs选项卡的具体实现
Dec 24 #Javascript
从数组中随机取x条不重复数据的JS代码
Dec 24 #Javascript
JS过滤url参数特殊字符的实现方法
Dec 24 #Javascript
JS控制图片等比例缩放的示例代码
Dec 24 #Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
Dec 24 #Javascript
js清除input中type等于file的值域(示例代码)
Dec 24 #Javascript
js 获取、清空input type="file"的值(示例代码)
Dec 24 #Javascript
You might like
中篇:安装及配置PHP
2006/12/13 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
Python实现基本线性数据结构
2016/08/22 Python
python访问抓取网页常用命令总结
2017/04/11 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
国际领先的学术出版商:Springer
2017/01/11 全球购物
五年级数学教学反思
2014/02/11 职场文书
电子专业自荐信
2014/07/01 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
春季运动会加油词
2015/07/18 职场文书
七年级作文之冬景
2019/11/07 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis