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 相关文章推荐
关于URL中的特殊符号使用介绍
Nov 03 Javascript
jquery阻止冒泡事件使用模拟事件
Sep 06 Javascript
javascript中通过arguments参数伪装方法重载
Oct 08 Javascript
JS折半插入排序算法实例
Dec 02 Javascript
原生js实现addClass,removeClass,hasClass方法
Apr 27 Javascript
javascript ASCII和Hex互转的实现方法
Dec 27 Javascript
vue的基本用法与常见指令
Aug 15 Javascript
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
JS实现显示当前日期的实例代码
Jul 03 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
Aug 13 Javascript
Vue安装浏览器开发工具的步骤详解
May 12 Javascript
JS高级程序设计之class继承重点详解
Jul 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
如何过滤高亮显示非法字符
2006/10/09 PHP
PHP中,文件上传
2006/12/06 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
php json转换相关知识(小结)
2018/12/21 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
javascript深入理解js闭包
2010/07/03 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
python通过ssh-powershell监控windows的方法
2015/06/02 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
2015/01/27 面试题
消防安全管理制度
2014/02/01 职场文书
个人合伙协议书范本
2014/10/14 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android