JavaScript 放大镜 放大倍率和视窗尺寸


Posted in Javascript onMay 09, 2011

对JavaScript 放大镜来说, 计算倍率必不可少.
一个完整的放大镜结构里, 与倍率扯上关系的一共有 4 个对象, 原图, 缩略图, 镜片和视窗. 镜片在缩略图上的覆盖位置, 其实就是视窗对原图的部分展示, 所以它们之间有如下关系.
倍率 = 原图/缩略图 = 视窗/镜片

JavaScript 放大镜 放大倍率和视窗尺寸
倍率一般大于等于 1, 因为原图一般都不会小于缩略图. 一旦倍率小于 1, 则将倍率设为 1.
因为缩略图和原图的尺寸是不可变的, 所以我们通过它们来获得倍率. 

/** 
* 获取放大镜放大倍数 
* @param thumb 缩略图对象 
* @param glass 镜片对象 
* @return 放大镜放大倍数 
*/ 
function getMultiple(thumb, glass) { 
var multiple = { 
horizontal:0, 
vertical:0 
}; var thumbSize = getSize(thumb); 
var imageSize = getImageSize(image); 
multiple.horizontal = imageSize.width / thumbSize.width; 
if(multiple.horizontal <= 1) { 
multiple.horizontal = 1; 
} 
multiple.vertical = imageSize.height / thumbSize.height; 
if(multiple.vertical <= 1) { 
multiple.vertical = 1; 
} 
return multiple; 
}

 原图和缩略图是固定的. 而为了统一视觉感官和防止破页, 我们一般也会指定视窗的尺寸, 所以镜片的尺寸是根据其他几个对象计算出来的.
镜片 = 缩略图x视窗/原图 = 缩略图/倍率
/** 
* 加载镜片的样式 
* @param viewportSize 视窗尺寸 
* @param multiple 倍率 
* @param glass 镜片对象 
*/ 
function loadGlassStyle(viewportSize, multiple, glass) { 
glass.style.width = round(viewportSize.width / multiple.horizontal) + 'px'; 
glass.style.height = round(viewportSize.height / multiple.vertical) + 'px'; 
}

如果定义的视窗的宽或高比原图还要小, 那该如何显示?
需要改变视窗的尺寸. 假设原图是 240x180, 视窗原定尺寸是 200x200. 视窗尺寸随之改变为 200x180. 此时镜片的尺寸仍须与视窗成正比.

JavaScript 放大镜 放大倍率和视窗尺寸

如果倍率小于 1, 又该如何显示?
将倍率设为 1, 镜片覆盖整个缩略图, 显示整个原图为视窗内容; 或者不作操作 (禁止放大镜效果).

JavaScript 放大镜 放大倍率和视窗尺寸

下面的代码用于获取视窗的尺寸.

/** 
* 返回视窗尺寸 
* @param multiple 倍率 
* @param image 原图对象 
* @return 视窗尺寸 
*/ 
getViewportSize: function(multiple, image) { 
var dimension = { 
width:0, 
height:0 
}; // 如果倍率小于 1 或者视窗比原图还宽, 宽度设为跟原图一致, 否则去设定宽度 
if(multiple.horizontal <= 1 || config.viewportSize[0] > image.width) { 
dimension.width = image.width; 
} else { 
dimension.width = config.viewportSize[0]; 
} 
// 如果倍率小于 1 或者视窗比原图还高, 高度设为跟原图一致, 否则去设定高度 
if(multiple.vertical <= 1 || config.viewportSize[1] > image.height) { 
dimension.height = image.height; 
} else { 
dimension.height = config.viewportSize[1]; 
} 
return dimension; 
}

上节《JavaScript 放大镜- 移动镜片》我们实现了镜片在缩略图上的移动效果, 并留下习题:"当镜片带边框时, 如何保证边框不影响镜片移动时的精确度?"
为了防止镜片受边框影响偏移, 可以通过为镜片对象设定与边框宽度一样的负 margin 值来消除偏移.

本节没有 DEMO, 但对后面几讲来说十分重要, 请同学们搞清楚正常和异常情况下的比例换算.
同样留个课后思考题, 本文的代码中出现了 round 方法, 这是一个四舍五入取整方法, 如果要你自己实现这个功能, 你会如何处理? (提示: 可参考计算机图形学关于线条走样的处理方法)

Javascript 相关文章推荐
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
Dec 25 Javascript
利用javascript解决图片缩放及其优化的代码
May 23 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
Aug 11 Javascript
深入理解JavaScript编程中的原型概念
Jun 25 Javascript
zTree插件下拉树使用入门教程
Apr 11 Javascript
值得分享的bootstrap table实例
Sep 22 Javascript
解决URL地址中的中文乱码问题的办法
Feb 10 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
Mar 01 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
Sep 28 Javascript
vue+Element中table表格实现可编辑(select下拉框)
May 21 Javascript
关于JavaScript的with 语句的使用方法
May 09 #Javascript
JavaScript的parseInt 取整使用
May 09 #Javascript
实现变速回到顶部的JavaScript代码
May 09 #Javascript
Javascript 倒计时源代码.(时.分.秒) 详细注释版
May 09 #Javascript
Chrome Form多次提交表单问题的解决方法
May 09 #Javascript
JQuery将文本转化成JSON对象需要注意的问题
May 09 #Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
May 07 #Javascript
You might like
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
记录mysql性能查询过程的使用方法
2013/05/02 PHP
jQuery load方法用法集锦
2011/12/06 Javascript
JavaScript 数组详解
2013/10/10 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
python实现简单日期工具类
2019/04/24 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
使用python实现画AR模型时序图
2019/11/20 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
关于python 跨域处理方式详解
2020/03/28 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
日语专业毕业生自荐信
2013/11/11 职场文书
工程造价与管理专业应届生求职信
2013/11/23 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
员工2014年度工作总结
2014/12/09 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
Python基础之元类详解
2021/04/29 Python