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 相关文章推荐
javascript页面动态显示时间变化示例代码
Dec 18 Javascript
纯JS实现动态时间显示代码
Feb 08 Javascript
javascript修改图片src的方法
Jan 27 Javascript
js实现仿Windows风格选项卡和按钮效果实例
May 13 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
JavaScript实现表格快速变色效果代码
Aug 19 Javascript
深入理解jQuery3.0的domManip函数
Sep 01 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
Oct 27 Javascript
vue实现密码显示隐藏切换功能
Feb 23 Javascript
微信小程序实现循环动画效果
Jul 16 Javascript
小程序实现展开/收起的效果示例
Sep 22 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
Oct 26 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中利用XML技术构造远程服务(下)
2006/10/09 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
PHP实现数组递归转义的方法
2014/08/28 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
学习ExtJS accordion布局
2009/10/08 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
python中循环语句while用法实例
2015/05/16 Python
python 换位密码算法的实例详解
2017/07/19 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python socket模块方法实现详解
2019/11/05 Python
Python属性和内建属性实例解析
2020/01/14 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
nohup的用法
2012/11/26 面试题
信息系统专业个人求职信范文
2013/12/07 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
签约仪式致辞
2015/07/30 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
试了下Golang实现try catch的方法
2021/07/01 Golang