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、前言在python2.7及以上的版本,str.format()的方式为格式化提供了非常大的便利。与之前的%型格式化字符串相比,他显得更为
- 前言最近在学习python,学习到了一个之前没接触过的--特殊方法。什么是特殊方法?当我们在设计一个类的时候,python中有一个用于初始化
- 简介在逛github时发现一个好玩的Go项目,彩色输出文本说明支持Linux彩色输出支持Windows彩色输出Golang IDE输出是不支
- execjs 使用有了selenium+Chrome Headless 加载页面为什么还要用execjs来运行js?selenium+Chr
- 1、现象a.用localhost访问,正常b.用IP地址访问,则出现403错误2、分析a.怀疑是ACL问题,设置Everyone为完全控制,
- 1、cURL请求的基本步骤:(1)初始化(2)设置选项,包括URL(3)执行并获取HTML文档内容(4)释放cURL句柄<?php&n
- 在开发WEB应用程序中,我们经常需要对文件系统中的驱动器、文件夹和文件进行处理,比如收集驱动器的相关信息;创建、添加、移动或删除文件夹和文件
- 本章节将一些Python3基础语法整理成手册,方便各位在日常使用和学习是查阅,包含了编码、标识符、保留字、注释、缩进、字符串等常用内容。编码
- 随机从列表中取出元素:import randomdataSet = [[0], [1], [2], [3], [4], [5], [6],
- 在项目中,尤其是pc端的时候,我们在用户登录后会给前端返回一个标识,来判断用户是否登录,这个标识大多数都是用户的id  
- 一、先来看看Python星空图代码绘制成品1 两个人的星空星空下,欲执子之手,相倚长青树。看皎洁月色,闻乡间气息,赏佳人芳心。2 明月相伴的
- 1. 引言在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工;这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取;单个
- 关于作者 王丹丹 , IBM 中国系统与技术中心软件工程师,自从 2006 年加入 IBM,一直从事 Web 系统设计和开发工作,有五年 P
- 将无权点文件转化成邻接矩阵目前点文件是两列Excel代码,在进行复杂网络运算时需要转化成邻接矩阵。我在网上找了一个代码,稍微修改了下,亲测可
- 原来在robotframework中使用press key方法进行键盘的操作,但是该方法需要写 * 作对象的locator,不是很方便,现在找
- 与上篇实践教程一样,在这篇文章中,我将继续从一种常见的功能——表格入手,展示Vue.js中的一些优雅特性。同时也将对filter功能与com
- 之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest、nose/nose2 与 pytest 这三个最受人欢迎的 Pyth
- 下边我就简单说一下过程和原理。第一步:实现一个匿名函数并能自己执行。(function(){ })() 这个函数在一样编的好的J
- ajax编程获取Google的PageRank3(PR值)及所在目录,想给你的站增加Google PR查询的功能吗?如果你不会就看看本文吧,
- 本篇主要讲述,如何在微信中打开自家页面后,弹窗请求用户授权,以便拿到用户的微信信息。首先说一下,完成自定义分享信息的,从无到有的流程:基础硬