JS网页图片按比例自适应缩放实现方法


Posted in Javascript onJanuary 15, 2014

用户上传照片,照片的尺寸未知;需要生成一个预览,这个预览图要根据提供给用户预览的区域自应用,并且居中;如果图片太大,需要按比例缩放。如下图。

JS网页图片按比例自适应缩放实现方法

瞄了一下,居中可以用 text-align:center; 来实现。而按比例缩放,利用预设 <img /> 的 width 、height 属性解决不了。因为用户图片可能是很长的,也可能是很宽的。在线上想了一下他们的关系,按条件来判断是这样的:

if(实际宽度 > 预览最大宽度) {
    缩放宽度 = 预览最大宽度
}

if(实际高度 > 预览最大高度) {
    缩放高度 = 预览最大高度
}
但是这样会有问题,比如当宽度和高度都被缩放,如果缩放比较不同,图片就不是按比例缩放,会变得非常丑。为了让它按比例缩放,就需要做各种判断了。那这样就违背了我们希望程序自动化的原则了。再想想,虽然不喜欢数学,但数学还是很好用的,应该有其他办法。而既然是按比例缩放,何不用实际图像和预览区域宽度作的比例来计算他们关系?hmmmm… 果然 OK。实际上我们永远都只需要缩放宽度或高度中的其中一个。因为比例只有大和小种情况。具体的,写一个函数来实现它吧:

/**
 * 图片按比例自适应缩放
 * @param img {Element} 用户上传的图片
 * @param maxWidth {Number} 预览区域的最大宽度
 * @param maxHeight {Number} 预览区域的最大高度
 */
var resizeImg = function(img, maxWidth, maxHeight){
        var w = img.width,
               h = img.height;
        // 当图片比预览区域小时不做任何改变
        if(w < maxWidth && h < maxHeight) return;
        // 当实际图片比例大于预览区域宽高比例时
        // 缩放图片宽度,反之缩放图片宽度
        w/h > maxWidth/maxHeight  ? img.width = maxWidth : img.height = maxHeight;
Javascript 相关文章推荐
XRegExp 0.2: Now With Named Capture
Nov 30 Javascript
JavaScript中的事件处理
Jan 16 Javascript
JS之小练习代码
Oct 12 Javascript
validator验证控件使用代码
Nov 23 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
Aug 01 Javascript
Node调试工具JSHint的安装及配置教程
May 27 Javascript
用window.onerror捕获并上报Js错误的方法
Jan 27 Javascript
vue监听键盘事件的快捷方法【推荐】
Jul 11 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
Apr 17 Javascript
小程序如何获取多个formId实现详解
Sep 20 Javascript
react使用CSS实现react动画功能示例
May 18 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
Oct 09 jQuery
javascript删除字符串最后一个字符
Jan 14 #Javascript
javascript制作loading动画效果 loading效果
Jan 14 #Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
Jan 14 #Javascript
如何动态的导入js文件具体该怎么实现
Jan 14 #Javascript
将查询条件的input、select清空
Jan 14 #Javascript
js导出txt示例代码
Jan 14 #Javascript
javascript 通用loading动画效果实例代码
Jan 14 #Javascript
You might like
用php将任何格式视频转为flv的代码
2009/09/03 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
css图片自适应大小
2007/11/28 Javascript
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
使用cropper.js裁剪头像的实例代码
2017/09/29 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
js实现导航跟随效果
2018/11/17 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
公司道歉信范文
2014/01/09 职场文书
健康家庭事迹材料
2014/05/02 职场文书
普通话宣传标语
2014/06/26 职场文书
经费申请报告
2015/05/15 职场文书
JS setTimeout与setInterval的区别
2022/04/20 Javascript
CSS浮动引起的高度塌陷问题
2022/08/05 HTML / CSS