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 validation插件表单验证的一个例子
Mar 03 Javascript
基于jquery的代码显示区域自动拉长效果
Dec 07 Javascript
让人蛋疼的JavaScript语法特性
Sep 30 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
Oct 22 Javascript
JavaScript中三种异步上传文件方式
Mar 06 Javascript
jquery自定义插件——window的实现【示例代码】
May 06 Javascript
Jquery $when done then的用法详解
May 20 Javascript
Jquery树插件zTree实现菜单树
Jan 24 Javascript
vue货币过滤器的实现方法
Apr 01 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
Sep 18 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
Sep 27 Javascript
js字符串类型String常用操作实例总结
Jul 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
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
PHP代码优化技巧小结
2015/09/29 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
2019/11/13 PHP
jQuery 渐变下拉菜单
2009/12/15 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
javascript求日期差的方法
2016/03/02 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
初中三年毕业生的自我评价分享
2014/02/14 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
捐款感谢信
2015/01/20 职场文书
学校运动会加油词
2015/07/18 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL