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 相关文章推荐
JavaScrip实现PHP print_r的数功能(三种方法)
Nov 12 Javascript
浅谈js常用内置方法和对象
Sep 24 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
vue中实现滚动加载更多的示例
Nov 08 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
Dec 24 Javascript
Webpack的dll功能使用
Jun 28 Javascript
详解Angular6 热加载配置方案
Aug 18 Javascript
小程序实现选择题选择效果
Nov 04 Javascript
javascript中floor使用方法总结
Feb 02 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
Jul 05 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
Sep 27 Javascript
在vue-cli3中使用axios获取本地json操作
Jul 30 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
浅析PHP中Collection 类的设计
2013/06/21 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python根据距离和时长计算配速示例
2014/02/16 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
django从后台返回html代码的实例
2020/03/11 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
解除劳动合同协议书
2014/09/17 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
施工员岗位职责
2015/02/10 职场文书
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python