实现特效所需的技术点:

onmouseover:鼠标移动到指定的对象上发生;
onmouseout:鼠标移出指定的对象时发生;
onmouseover:鼠标在移动时发生;
offsetLeft:获取当前元素距父元素左侧的值;
offsetTop:获取当前元素距父元素顶部的值
offsetWidth:获取当前元素的宽度;
offsetHeight:获取当前元素的高度;
event.clientX:获取浏览器(窗口)水平坐标;
event.clientY:获取浏览器(窗口)垂直坐标;

style.css 文件:

* {margin: 0;padding: 0;
}#demo {width: 313px;height: 300px;border: 1px solid #ccc;margin: 60px;position: relative;display: flex;align-items: center;
}#small-box {position: relative;z-index: 1;
}#magnifier {display: none;width: 140px;height: 110px;position: absolute;background-color: #f7f7f7;border: 1px solid #cccccc;filter: alpha(opacity=60);opacity: 0.6;cursor: move;
}#big-box {display: none;position: absolute;top: 0;left: 330px;width: 315px;height: 300px;overflow: hidden;border: 1px solid #cccccc;z-index: 1;
}#big-box img {position: absolute;z-index: 5;
}

demo.html文件:

<div id="demo"><div id="small-box"><div id="magnifier"></div><img src="data:images/small.jpg"></div><div id="big-box"><img src="data:images/big.jpg"></div>
</div>

javascript文件:

<script>window.onload = function () {// 获取各个元素var demo = document.getElementById('demo');var smallBox = document.getElementById('small-box');var magnifier = document.getElementById('magnifier');var bigBox = document.getElementById('big-box');var bigImg = bigBox.getElementsByTagName('img')[0];// 鼠标移动到小图片上smallBox.onmouseover = function () {magnifier.style.display = "block";bigBox.style.display = "block";};// 鼠标移出小图片smallBox.onmouseout = function () {magnifier.style.display = 'none';bigBox.style.display = 'none';};// 鼠标在图片上移动smallBox.onmousemove = function (event) {// 获取放大镜左边离图片框的距离var left = event.clientX - demo.offsetLeft - smallBox.offsetLeft - magnifier.offsetWidth / 2;// 获取放大镜上边离图片框的距离var top = event.clientY - demo.offsetTop - smallBox.offsetTop - magnifier.offsetHeight / 2;// 设置水平方向放大镜离图片框最小距离为0,最大距离为:图片框宽度 - 放大镜宽度,这样放大镜就不会超出图片框了if (left < 0) {left = 0;} else if (left > (smallBox.offsetWidth - magnifier.offsetWidth)) {left = smallBox.offsetWidth - magnifier.offsetWidth;}// 垂直方向同理if (top < 0) {top = 0;} else if (top > (smallBox.offsetHeight - magnifier.offsetHeight)) {top = smallBox.offsetHeight - magnifier.offsetHeight;}// 设置放大镜的left\top值,让放大镜跟随鼠标移动magnifier.style.left = left + 'px';magnifier.style.top = top + 'px';// 放大镜移动距离的百分比 = 鼠标移动的距离(或放大镜移动的距离) / 放大镜可移动的最大范围var percentX = left / (smallBox.offsetWidth - magnifier.offsetWidth);var percentY = top / (smallBox.offsetHeight - magnifier.offsetHeight);// 根据放大镜移动距离的百分比 = 右边大图片移动距离的百分比,可以得到以下公式,并计算出大图片的left和top值bigImg.style.left = -percentX * (bigImg.offsetWidth - bigBox.offsetWidth) + 'px';bigImg.style.top = -percentY * (bigImg.offsetHeight - bigBox.offsetHeight) + 'px';}}
</script>

代码效果:

THE END !

JS实现放大镜特效原理解析相关推荐

  1. 案例:用JS实现放大镜特效

    案例:用JS实现放大镜特效 案例:用JS实现放大镜特效

  2. 用JS实现放大镜特效

    先来张效果图: 这个特效是跟着慕课网上的视频学的,视频链接如下:https://www.imooc.com/learn/32 源码和技术点已经上传到附件,有需要的可以查看.下载. 下面直接上代码(PS ...

  3. vue.js响应式原理解析与实现

    从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染.之后,再接触了vue.js,当时也一度很好奇vue.js是如何监测数据更新 ...

  4. php动态引入js文件路径问题,JavaScript_动态加载外部css或js文件,原理解析:第一步:使用dom创 - phpStudy...

    原理解析:第一步:使用dom创建 应用:1.提高代码的复用,减少代码量:2.添加一个javascript控制器和 session可以实现动态改变页面样式:3.由于是页面是从上到下依次加载文件的,并且边 ...

  5. php拖拽原理,JS拖拽效果及原理解析

    这篇文章主要介绍了如何实现js拖拽效果及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 元素拖拽分成3个步骤:按下鼠标,移动鼠标,松开鼠标. ...

  6. JS中的new操作符原理解析

    JS中的new操作符原理解析 new操作符做了什么 参考 推荐阅读 你越是认真生活,你的生活就会越美好--弗兰克·劳埃德·莱特 <人生果实>经典语录 new操作符做了什么 var Pers ...

  7. 仿京东淘宝放大镜特效 jqzoom.js

    效果图如下: HTML 文本源码: 1 <!DOCTYPE html> 2 <htmllang="en"> 3 <head> 4 <met ...

  8. Unity中实现溶解(Dissolve)特效及其原理解析

    Unity中实现溶解(Dissolve)特效及其原理解析 今天我们分享一个Unity中非常常见的特效: 溶解. 下面先来看看效果. 大家可能和我一样, 在不了解实现方式的时候, 会觉得这个效果很神奇, ...

  9. spring ioc di 原理解析

    spring ioc原理(看完后大家可以自己写一个spring) 控制反转/依赖注入 其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中 ...

  10. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

最新文章

  1. css搜索的文本框,一个很不错的CSS改写的大表单文本框和搜索按钮组
  2. matlab寻找函数对应的工具箱
  3. 大润发优鲜app之paramsMD5参数分析
  4. 数据库------事务
  5. php会员系统源码_b2b2c商城系统会员预存款架构及源码分享
  6. python 标准库之 glob 介绍(获取文件夹下所有同类文件)
  7. 万圣节活动BANNER设计有方案了吗?拿走精品PSD分层模板!
  8. 功能对等四个原则_功能对等四原则
  9. 搜狗输入法linux版的主程序,搜狗输入法linux安装包下载
  10. SDN,虚拟化,TSN,协议概述。
  11. 019ssm高校校园门户管理系统高校门户网站社团管理系统
  12. 敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(下)
  13. 关于cmd输入字符长度限制问题
  14. 企业价值角度:RPA 机器人是什么?
  15. 各种常用的默认端口号 总结
  16. 电脑关闭休眠模式清理 C盘内存
  17. Qt Creator 添加基于 JSON 的向导
  18. 就在昨天,朋友圈斗图关了,但我又带来了一个好消息!
  19. oracle查询视图时慢,oracle视图查询速度慢
  20. flash遍历子元件_Flash编程-详解循环语句

热门文章

  1. oracle常见异常——io异常,connection reset
  2. 类似911的代理ip,911代理的官网,yilu代理软件,911s5替代软件海外代理平台哪里有?
  3. 计算机408考研经验分享
  4. hashcat详细使用教程
  5. VMware Workstation创建Windows 8.1虚拟机
  6. dcx矩阵 - 打表 - 找规律
  7. Matlab模糊综合评价做空气质量经典例题
  8. 蚂蚁金服java年终奖,蚂蚁金服发布年终奖调查结果 超六成人无缘年终奖
  9. 一个测试反应速度的小游戏
  10. 桌面计算机图标双击打不开了,双击打不开图标怎么办 双击打不开图标解决方法【详解】...