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 打印页面代码
Mar 24 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
php图像生成函数之间的区别分析
Dec 06 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
Oct 09 Javascript
jQuery.holdReady()方法用法实例
Dec 27 Javascript
jQuery中$.click()无效问题分析
Jan 29 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
Feb 05 Javascript
省市区三级联动下拉框菜单javascript版
Aug 11 Javascript
JS实现给对象动态添加属性的方法
Jan 05 Javascript
ztree实现权限横向显示功能
May 20 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
May 25 Javascript
详解vue中使用express+fetch获取本地json文件
Oct 10 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 isset()与empty()的使用区别详解
2010/08/29 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
js实现简单的倒计时
2021/01/28 Javascript
Python编程之多态用法实例详解
2015/05/19 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
python增加图像对比度的方法
2019/07/12 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
医学院四年学习生活的自我评价
2013/11/06 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
对教师的评语
2014/04/28 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis