JavaScript 放大镜 移动镜片效果代码


Posted in Javascript onMay 09, 2011

放大镜并不是一个难以实现的效果, 只是因为牵涉到一些精确的数值计算, 显得比较繁琐. 在未来的一段日子, 我会不定期地写关于 JavaScript 放大镜系列的文章, 每次讲一个点, 由点及面, 最后完成整个效果.
本次我们先了解如何在缩略图上移动镜片. (这是 DEMO)

缩略图和镜片组成的 DOM 结构如下.

<a id="thumb" href="#"> 
<img src="http://img.alibaba.com/photo/291909368/Free-Shipping-Popular-ladies-shoes-Tote-shoes-paypal-accept-201001.jpg" alt="Thumbnail" /> 
<span id="glass"></span> 
</a>

我在缩略图容器中放置图片和镜片节点, 以缩略图容器作为相对位置参考, 在触发 mousemove 事件时修改镜片的位置. 换个说法, 我们要解决的问题是, 算出镜片左上角的在缩略图容器中的位置. 计算镜片位移的 JavaScript 代码如下.
/** 
* 获取镜片在放大目标元素上的位置 
* @param ev 触发的事件 
* @param thumb 缩略图对象 
* @param glass 镜片对象 
* @return x:镜片在放大目标元素上的横向位置, y:镜片在放大目标元素上的纵向位置 
*/ 
function getGlassOffset(ev, thumb, glass) { 
var offset = { 
left:0, 
top:0 
}; // 偏移量 
var thumbOffset = getCumulativeOffset(thumb); 
// 鼠标在页面上的位置 
var mousePoint = getMousePoint(ev); 
// 镜片实际尺寸 
var glassSize = getSize(glass); 
// 简缩图实际尺寸 
var thumbSize = getSize(thumb); 
// 光标横向位置 
var cursorX = mousePoint.x - thumbOffset.left; 
// 镜片横向偏移量 
offset.left = cursorX - glassSize.width / 2; 
if(offset.left < 0) { 
offset.left = 0; 
} else if(offset.left > thumbSize.width - glassSize.width) { 
offset.left = thumbSize.width - glassSize.width; 
} 
// 光标纵向位置 
var cursorY = mousePoint.y - thumbOffset.top; 
// 镜片纵向偏移量 
offset.top = cursorY - glassSize.height / 2; 
if(offset.top < 0) { 
offset.top = 0; 
} else if(offset.top > thumbSize.height - glassSize.height) { 
offset.top = thumbSize.height - glassSize.height; 
} 
return offset; 
}

镜片左上角在缩略图容器中的位置 = 鼠标位置 - 缩略图左上角位置 - 镜片尺寸的一半
当镜片在容器外, 将镜片靠边. 全部代码请窥视 DEMO. (知道我为何上一篇写通过 JS 获取鼠标位置了吧?)

留个课后思考题, 当镜片带边框时, 如何保证边框不影响镜片移动时的精确度?

Javascript 相关文章推荐
得到文本框选中的文字,动态插入文字的js代码
Mar 07 Javascript
js 验证密码强弱的小例子
Mar 21 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
jquery ajaxfileupload异步上传插件使用详解
Feb 08 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
May 03 Javascript
AngularJS 异步解决实现方法
Jun 12 Javascript
gulp安装以及打包合并的方法教程
Nov 19 Javascript
微信小程序日历组件使用方法详解
Dec 29 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
May 10 Javascript
JS实现吸顶特效
Jan 08 Javascript
vue实现div单选多选功能
Jul 16 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 #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
You might like
php二维数组转成字符串示例
2014/02/17 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
Mongoose中document与object的区别示例详解
2017/09/18 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
从零学Python之入门(二)基本数据类型
2014/05/25 Python
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Python、Javascript中的闭包比较
2015/02/04 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
python Tkinter版学生管理系统
2019/02/20 Python
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
COS美国官网:知名服装品牌
2019/04/08 全球购物
应届大学生的推荐信
2013/11/20 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
丧事主持词
2015/07/02 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
解析原生JS getComputedStyle
2021/05/25 Javascript
opencv检测动态物体的实现
2021/07/21 Python
python实现局部图像放大
2021/11/17 Python
python turtle绘图命令及案例
2021/11/23 Python