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 相关文章推荐
自适应图片大小的弹出窗口
Jul 27 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
JavaScript 闭包在封装函数时的简单分析
Nov 28 Javascript
深入探讨前端框架react
Dec 09 Javascript
Node.js返回JSONP详解
May 18 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
May 23 Javascript
jQuery EasyUI菜单与按钮详解
Jul 13 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
Dec 21 Javascript
Bootstrap列表组学习使用
Feb 09 Javascript
Angular2中select用法之设置默认值与事件详解
May 07 Javascript
js制作简单的音乐播放器的示例代码
Aug 28 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 Javascript
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工厂模式的好处
2013/06/18 PHP
PHP进程同步代码实例
2015/02/12 PHP
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
探究python中open函数的使用
2016/03/01 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
Python continue继续循环用法总结
2018/06/10 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
Python之列表的插入&替换修改方法
2018/06/28 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
英国女士家居服网站:hush
2017/08/09 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
C#的几个面试问题
2016/05/22 面试题
打架检讨书400字
2014/01/17 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书