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 相关文章推荐
去除链接虚线全面分析总结
Aug 15 Javascript
js身份证验证超强脚本
Oct 26 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
Jun 10 Javascript
Chrome中JSON.parse的特殊实现
Jan 12 Javascript
jquery的ajax请求全面了解
Mar 20 Javascript
EasyUi combotree 实现动态加载树节点
Apr 01 Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
vue addRoutes实现动态权限路由菜单的示例
May 15 Javascript
vue生成token并保存到本地存储中
Jul 17 Javascript
js中async函数结合promise的小案例浅析
Apr 14 Javascript
vue2.x数组劫持原理的实现
Apr 19 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从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
英国综合网上购物商城:The Hut
2018/07/03 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
高一生物教学反思
2014/01/17 职场文书
创业计划书的主要内容有哪些
2014/01/29 职场文书
烹饪自我鉴定
2014/03/01 职场文书
应聘文员自荐信范文
2014/03/11 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
用JS写一个发布订阅模式
2021/11/07 Javascript
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js