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 相关文章推荐
javascript 极速 隐藏/显示万行表格列只需 60毫秒
Mar 28 Javascript
js获取客户端网卡的IP地址、MAC地址
Mar 26 Javascript
基于javascript实现窗口抖动效果
Jan 03 Javascript
js仿3366小游戏选字游戏
Apr 14 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
Dec 08 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
Jan 23 Javascript
javascript判断回文数详解及实现代码
Feb 03 Javascript
vue之数据交互实例代码
Jun 16 Javascript
js实现删除li标签一行内容
Apr 16 Javascript
使用 node.js 模仿 Apache 小部分功能
Jul 07 Javascript
Element MessageBox弹框的具体使用
Jul 27 Javascript
在项目vue中使用echarts的操作步骤
Sep 07 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 无线电
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
js中关于String对象的replace使用详解
2011/05/24 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
微信小程序实现拖拽功能
2019/09/26 Javascript
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
Django 内置权限扩展案例详解
2019/03/04 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
技术总监岗位职责
2013/12/05 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
医德医风学习心得体会
2016/01/25 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python