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 相关文章推荐
JQUERY 对象与DOM对象之两者相互间的转换
Apr 27 Javascript
使用javascript获取flash加载的百分比的实现代码
May 25 Javascript
jquery自动切换tabs选项卡的具体实现
Dec 24 Javascript
jQuery响应enter键的实现思路
Apr 18 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
Feb 25 Javascript
详解jQuery的Cookie插件
Nov 23 Javascript
vue 挂载路由到头部导航的方法
Nov 13 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
Jan 08 jQuery
element ui 表格动态列显示空白bug 修复方法
Sep 04 Javascript
如何通过vscode运行调试javascript代码
Jul 24 Javascript
原生js实现表格翻页和跳转
Sep 29 Javascript
详解JavaScript中Arguments对象用途
Aug 30 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
8个出色的WordPress SEO插件收集
2011/02/26 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
php报错502badgateway解决方法
2019/10/11 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
React父子组件间的传值的方法
2018/11/13 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
解决vue init webpack 下载依赖卡住不动的问题
2020/11/09 Javascript
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
对python字典过滤条件的实例详解
2019/01/22 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
python怎么自定义捕获错误
2020/06/29 Python
python处理写入数据代码讲解
2020/10/22 Python
python 实现aes256加密
2020/11/27 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
一年级学生评语
2014/04/23 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
工作作风建设心得体会
2014/10/22 职场文书
超市店长竞聘书
2015/09/15 职场文书
2016党员入党决心书
2015/09/22 职场文书
导游词之唐山景点
2019/12/18 职场文书
python tkinter实现定时关机
2021/04/21 Python