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不同页面传值的改进版
Sep 30 Javascript
自制基于jQuery的智能提示插件一枚
Feb 18 Javascript
使用JavaScript和C#中获得referer
Nov 14 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
Feb 28 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 Javascript
jQuery右下角悬浮广告实例
Oct 17 Javascript
BootStrap表单控件之文本域textarea
May 23 Javascript
微信小程序上传图片到服务器实例代码
Nov 07 Javascript
Angular异步变同步处理方法
Aug 13 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 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脚本的10个技巧(4)
2006/10/09 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
jQuery ajax cache缓存问题
2010/07/01 Javascript
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
2013/05/08 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
2018/05/23 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
[51:06]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第二场 1月26日
2021/03/11 DOTA
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python 提取文件指定列的方法示例
2019/08/07 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
python求前n个阶乘的和实例
2020/04/02 Python
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
2014年小学元旦活动方案
2014/02/12 职场文书
人力资源职位说明书
2014/07/29 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
教师节主持词开场白
2015/05/29 职场文书
杨善洲观后感
2015/06/04 职场文书
工作收入证明范本
2015/06/12 职场文书
工作感想范文
2015/08/07 职场文书
七年级生物教学反思
2016/02/20 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis
Ajax实现三级联动效果
2021/10/05 Javascript
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技