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 相关文章推荐
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
Jun 18 Javascript
AngularJS转换响应内容
Jan 27 Javascript
ReactNative实现图片上传功能的示例代码
Jul 11 Javascript
JS实现带动画的回到顶部效果
Dec 28 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
May 11 Javascript
JS实现获取自定义属性data值的方法示例
Dec 19 Javascript
详解vue-cli 2.0配置文件(小结)
Jan 14 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
Vue.set 全局操作简单示例
Sep 19 Javascript
vue+elementui 对话框取消 表单验证重置示例
Oct 29 Javascript
前端性能优化建议
Sep 17 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
为你总结一些php系统类函数
2015/10/21 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
Vue组件化开发思考
2018/02/02 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
python中str内置函数用法总结
2020/12/27 Python
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
有关爱国演讲稿
2014/05/07 职场文书
七一建党日演讲稿
2014/09/05 职场文书
运动会开幕词
2015/01/28 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python