JavaScript 放大镜 移动镜片效果代码

时间:2023-08-13 08:24:08 

放大镜并不是一个难以实现的效果, 只是因为牵涉到一些精确的数值计算, 显得比较繁琐. 在未来的一段日子, 我会不定期地写关于 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 获取鼠标位置了吧?)

留个课后思考题, 当镜片带边框时, 如何保证边框不影响镜片移动时的精确度?

标签:放大镜,移动镜片
0
投稿

猜你喜欢

  • python读取有密码的zip压缩文件实例

    2021-03-31 20:58:53
  • python 查看cpu的核数实现

    2023-01-02 21:09:31
  • IOS中safari下的select下拉菜单文字过长不换行的解决方法

    2024-04-25 13:07:58
  • MySQL limit分页大偏移量慢的原因及优化方案

    2024-01-25 14:28:30
  • Python wxPython库Core组件BoxSizer用法示例

    2023-01-17 23:08:32
  • Django框架静态文件处理、中间件、上传文件操作实例详解

    2021-03-07 14:31:04
  • 在pytorch中实现只让指定变量向后传播梯度

    2022-03-27 15:35:30
  • Python Matplotlib库安装与基本作图示例

    2021-09-01 04:22:51
  • Golang嵌入资源文件实现步骤详解

    2023-06-21 08:52:36
  • python实现K最近邻算法

    2021-06-18 04:05:46
  • java EJB 加密与解密原理的一个例子

    2023-10-02 06:41:16
  • php5.3 不支持 session_register() 此函数已启用的解决方法

    2023-11-16 01:59:39
  • python3 与python2 异常处理的区别与联系

    2022-11-06 22:39:30
  • 用Python写漏洞验证脚本的代码

    2023-09-04 05:38:36
  • pandas如何删除没有列名的列浅析

    2021-05-17 11:08:47
  • Python OpenCV对本地视频文件进行分帧保存的实例

    2021-09-15 23:03:18
  • Python数据分析之使用matplotlib绘制折线图、柱状图和柱线混合图

    2023-09-16 23:18:09
  • css样式表滤镜全接触

    2007-10-26 12:48:00
  • golang 检查网络状态是否正常的方法

    2024-05-08 10:45:03
  • 使用Termux在手机上运行Python的详细过程

    2021-10-26 10:23:52
  • asp之家 网络编程 m.aspxhome.com