博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
淘宝放大镜的两种实现方法JS
阅读量:7041 次
发布时间:2019-06-28

本文共 1899 字,大约阅读时间需要 6 分钟。

啥是淘宝放大镜

clipboard.png

这个,当你的鼠标移动到左边的主图上时,右边会出现一个放大的图,暂且就把这个叫做放大镜吧。

大概的做法

  • 第一种,左边一个小图,右边一个原图,当鼠标在小图上移动的时候,通过更改left和top的值来实现同步移动(原图的position属性设置为absolute)
  • 第二种,鼠标在小图上移动的时候,通过改变原图的background-position的值来同步移动。

关键操作

  • 第一步,获取鼠标在小图上的位置,并且定位好跟随鼠标的方块(你应该知道是哪个方块吧。。)的位置。
//e.offsetX ,offsetY是鼠标的位置//方块的left top在你的鼠标的左上方(网页左上角是原点),因此是减去一个方块的一半。      var x = e.offsetX - 方块.offsetWidth / 2;      var y = e.offsetY - 方块.offsetHeight / 2;      方块.style.left = x + 'px';      方块.style.top = y + 'px';

这明显是不足够的!

还需要考虑极端位置/情况

如果只用上面的设置,那么当你的鼠标移动到图片边缘的时候,方块有一半会出现在图片外。

clipboard.png

正确的应该是 当你的方块触碰到边缘的时候,你的方块就不能在移动了,尽管你的鼠标还在往下图中“鼠标的有效活动区域”外移动。

clipboard.png

那么得加点代码

if (x < 0) {        x = 0;      }      if (y < 0) {        y = 0;      }      if (x > 小图.offsetWidth - 方块.offsetWidth) {        x = 小图.offsetWidth - 方块.offsetWidth;      }      if (y > 小图.offsetHeight - 方块.offsetHeight) {        y = 小图.offsetHeight - 方块.offsetHeight;      }
  • 第二步,控制大图里的left - top或者background-position
//第一种方法:需要注意的是这里的left 和 top得反过来,你鼠标在小图上往下移的时候,对应的大图其实是往上移的。      //所以:大图上的left = -小图上的left * 他们的缩放倍率      大图.style.display = "block";      大图.style.left = -x * 大图.offsetWidth / 小图.offsetWidth  + 'px';      大图.style.top = -y * 大图.offsetHeight / 小图.offsetHeight + 'px';          //第二种方法,这里需要注意 backgroundPosition的值是从0 - 100%的(得用百分比表示);     //需要注意的是何时为百分百,从上面的极端情况判定我们可以知道     //x 是从0 到 mask.offsetWidth - rect.offsetWidth;     //因此这就是0 - 100%;y同理      大图.style.display = "block";      大图.style.backgroundPosition =`${x/(mask.offsetWidth - rect.offsetWidth)*100}% ${y/(mask.offsetHeight- rect.offsetHeight)*100}%`;

注意事项

  • 我们上面说在小图img上绑定mousemove事件来定位方块,其实实际操作上,我们不能直接用img来绑定,而是得用一个和img一样大小遮罩层来绑定,不然在你鼠标移动的时候,图片会疯狂闪烁疯狂!crazy!
  • 还有 就是函数节流,这个想节流就节流吧。
  • 还有个很重要的,就是右边那个显示大图的div的大小,一定得是小图上的方块大小 * 缩放倍率 的大小,如果过大,则会多出空白,过小,显示不完全。下面有代码,你可以带回家疯狂测试

再详细一点

我知道我可能说的不是很详细,所以。。

  
tb放大镜

后语

有错误的地方请指出,谢谢啦

转载地址:http://wthal.baihongyu.com/

你可能感兴趣的文章
6月第5周业务风控关注 | 《网络安全等级保护条例(征求意见稿)》本周正式发布...
查看>>
云端Linux成为两大挖矿黑客集团的战场
查看>>
JavaScript之内存机制
查看>>
SRX 硬件相关
查看>>
vue-cli搭建之[环境变量][path]真解
查看>>
弄懂Android 源码中那些巧妙位运算
查看>>
SQLServer之锁简介
查看>>
个性化推荐哪个好,个性化推荐平台怎么样?
查看>>
微信小程序实现两边小中间大的轮播效果的示例代码
查看>>
webpack 模块热更新 Hot Module Replacement
查看>>
Linux 内核、Shell 简述
查看>>
人脸实时签到(three.js+tracking.js)基于浏览器
查看>>
JavaScript正则表达式
查看>>
面试题 LazyMan 的 Rxjs 实现方式
查看>>
Android Webview打开网页空白
查看>>
记一次tortoisegit access denied错误
查看>>
前端使用 gulp 解决多项目缓存问题
查看>>
Bootstrap基础学习笔记(仅个人学习使用)
查看>>
Android项目实战之高仿网易云音乐项目介绍
查看>>
头条面试题
查看>>