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 相关文章推荐
永不消失的title提示代码
Feb 15 Javascript
csdn 论坛技术区平均给分功能
Nov 07 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
Mar 31 Javascript
Vue.js每天必学之表单控件绑定
Sep 05 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
Sep 05 Javascript
Javascript 函数的四种调用模式
Nov 05 Javascript
详解js数组的完全随机排列算法
Dec 16 Javascript
Bootstrap CSS布局之图像
Dec 17 Javascript
关于angularJs清除浏览器缓存的方法
Nov 28 Javascript
12条写出高质量JS代码的方法
Jan 07 Javascript
vue实现点击出现操作弹出框的示例
Nov 05 Javascript
vue的webcamjs集成方式
Nov 16 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获取表单textarea数据中的换行问题
2010/09/10 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
常用的js方法合集
2017/03/10 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
vue登录注册实例详解
2019/09/14 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
python中时间模块的基本使用教程
2019/05/14 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
python自动下载图片的方法示例
2020/03/25 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
线程同步的方法
2016/11/23 面试题
与UNIX有关的几个名词
2015/09/17 面试题
前台接待的工作职责
2013/11/21 职场文书
出纳员岗位职责
2014/03/13 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
小学教研工作总结2015
2015/05/13 职场文书
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL