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数组之存放checkbox全选值示例代码
Dec 20 Javascript
js获取字符串最后一位方法汇总
Nov 13 Javascript
JavaScript中实现继承的三种方式和实例
Jan 29 Javascript
js中javascript:void(0) 真正含义
Nov 05 Javascript
JavaScript基本数据类型及值类型和引用类型
Aug 25 Javascript
JQuery实现左右滚动菜单特效
Sep 28 Javascript
js绘制购物车抛物线动画
Nov 18 Javascript
利用AngularJs实现京东首页轮播图效果
Sep 08 Javascript
动态加载css方法实现和深入解析
Jan 18 Javascript
jQuery实现图片滑动效果
Mar 08 Javascript
发布Angular应用至生产环境的方法
Dec 10 Javascript
layui中select,radio设置不生效的解决方法
Sep 05 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
php下获取http状态的实现代码
2014/05/09 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
Prototype使用指南之form.js
2007/01/10 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
js对象基础实例分析
2015/01/13 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
Python多进程编程技术实例分析
2014/09/16 Python
python基础教程之Filter使用方法
2017/01/17 Python
Python 登录网站详解及实例
2017/04/11 Python
python验证码识别实例代码
2018/02/03 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
公司财务流程之主管工作流程
2014/03/03 职场文书
商业融资计划书
2014/04/29 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
建筑安全生产责任书
2014/07/22 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
2016春节放假通知范文
2015/08/18 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS