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的direction图片渐变动画效果
May 24 Javascript
返回对象在当前级别中是第几个元素的实现代码
Jan 20 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
May 14 Javascript
jquery 无限级下拉菜单的简单实现代码
Feb 21 Javascript
Bootstarp基本模版学习教程
Feb 01 Javascript
Angular+Node生成随机数的方法
Jun 16 Javascript
php 解压zip压缩包内容到指定目录的实例
Jan 23 Javascript
vue 权限认证token的实现方法
Jul 17 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
Mar 09 Javascript
微信小程序实现点击效果
Jun 21 Javascript
微信小程序分包加载代码实现方法详解
Sep 23 Javascript
详解vue-flickity的fullScreen功能实现
Apr 07 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图片库imagemagick安装方法
2014/09/23 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
Python 类的特殊成员解析
2018/06/20 Python
python使用插值法画出平滑曲线
2018/12/15 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
Python colormap库的安装和使用详情
2020/10/06 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
自荐信如何制作?
2014/02/21 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
辅导员学期工作总结
2015/08/14 职场文书
Python Django ORM连表正反操作技巧
2021/06/13 Python
对象析构函数__del__在Python中何时使用
2022/03/22 Python
Python  lambda匿名函数和三元运算符
2022/04/19 Python