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 相关文章推荐
各情景下元素宽高的获取实现代码
Sep 13 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
Oct 14 Javascript
JS获取浏览器版本及名称实现函数
Apr 02 Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
Dec 22 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
May 23 Javascript
BootStrap无限级分类(无限极分类封装版)
Aug 26 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 Javascript
bootstrap Table服务端处理分页(后台是.net)
Oct 19 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
Dec 06 Javascript
vue路由组件按需加载的几种方法小结
Jul 12 Javascript
微信小程序实现顶部导航特效
Jan 28 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
vue实现微信分享功能
2018/11/28 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
Python连接mysql方法及常用参数
2020/09/01 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
常务副总经理任命书
2014/06/05 职场文书
民间个人借款协议书
2014/09/30 职场文书
单位作风建设自查报告
2014/10/23 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
用CSS3画一个爱心
2021/04/27 HTML / CSS
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers
Java实现二分搜索树的示例代码
2022/03/17 Java/Android