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 相关文章推荐
响应鼠标变换表格背景或者颜色的代码
Mar 30 Javascript
Prototype Selector对象学习
Jul 23 Javascript
javascript 表单验证常见正则
Sep 28 Javascript
jQuery中多个元素的Hover事件解决方案
Jun 12 Javascript
js限制checkbox选中个数以限制六个为例
Jul 15 Javascript
js生成的验证码的实现与技术分析
Sep 17 Javascript
BootStrap3学习笔记(一)之网格系统
May 20 Javascript
JavaScript新增样式规则(推荐)
Jul 19 Javascript
Node.js 进程平滑离场剖析小结
Jan 24 Javascript
JavaScript的级联函数用法简单示例【链式调用】
Mar 26 Javascript
localstorage实现带过期时间的缓存功能
Jun 28 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
May 22 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+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
PHP读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
干货!教大家如何选择Vue和React
2017/03/13 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
python中的代码编码格式转换问题
2015/06/10 Python
python多进程控制学习小结
2018/10/31 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
劳动实践课感言
2014/02/01 职场文书
公司离职证明标准样本
2014/10/05 职场文书
民主生活会汇报材料
2014/12/15 职场文书
志愿者个人总结
2015/03/03 职场文书
汶川大地震感悟
2015/08/10 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers