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 相关文章推荐
JavaScript Event学习第三章 早期的事件处理程序
Feb 07 Javascript
dwz 如何去掉ajaxloading具体代码
May 22 Javascript
javascript ajax 仿百度分页函数
Oct 29 Javascript
用js判断是否为360浏览器的实现代码
Jan 15 Javascript
JavaScript知识点总结之如何提高性能
Jan 15 Javascript
javascript之IE版本检测超简单方法
Aug 20 Javascript
jQuery遍历节点树方法分析
Sep 08 Javascript
Angular下H5上传图片的方法(可多张上传)
Jan 09 Javascript
基于JavaScript实现活动倒计时效果
Apr 20 Javascript
详解webpack编译多页面vue项目的配置问题
Dec 11 Javascript
10个最受欢迎的 JavaScript框架(推荐)
Apr 24 Javascript
JavaScript常用内置对象用法分析
Jul 09 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跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
jQuery代码优化 事件委托篇
2011/11/01 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
详解Bootstrap插件
2016/04/25 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python解析xml文件实例分析
2015/05/27 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
浅析Python函数式编程
2018/10/06 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
Python运行异常管理解决方案
2020/03/09 Python
丑小鸭教学反思
2014/02/03 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
就业证明函
2015/06/17 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis