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 DOM的学习笔记
Dec 22 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
Aug 20 Javascript
详解Angular2组件之间如何通信
Jun 22 Javascript
JavaScript操作文件_动力节点Java学院整理
Jun 30 Javascript
protractor的安装与基本使用教程
Jul 07 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
JS面试题大坑之隐式类型转换实例代码
Oct 14 Javascript
JS闭包经典实例详解
Dec 20 Javascript
图文讲解vue的v-if使用方法
Feb 11 Javascript
webpack中如何加载静态文件的方法步骤
May 18 Javascript
vuejs中父子组件之间通信方法实例详解
Jan 17 Javascript
vue 组件基础知识总结
Jan 26 Vue.js
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中加密解密函数与DES加密解密实例
2014/10/17 PHP
php实现微信支付之企业付款
2018/05/30 PHP
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
Vue自定义事件(详解)
2017/08/19 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
python随机数分布random测试
2018/08/27 Python
python3.x实现base64加密和解密
2019/03/28 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
python实现三壶谜题的示例详解
2020/11/02 Python
python自动化办公操作PPT的实现
2021/02/05 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
解除劳动合同协议书
2014/04/14 职场文书
取保候审保证书
2014/04/30 职场文书
市场营销策划方案
2014/06/11 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书