JavaScript实现图片放大镜效果


Posted in Javascript onJune 27, 2019

本文实例为大家分享了js实现图片放大镜效果的具体代码,供大家参考,具体内容如下

1、结构布局HTML代码

<div class="leftcon" id="left">
 <img src="~/Content/images/风景-1.jpg" />
 <div class="slide_box" id="box"></div>
</div>
<div class="rightcon" id="right">
 <img src="~/Content/images/风景-1.jpg" />
</div>

2、修饰结构css样式代码

img {
display: block;
}.leftcon {
width: 350px;height: 350px;
margin: 100px 20px 0px 312px;
float: left;position: relative;
box-shadow: 3px 3px 10px 0 #111111; /*给图片施加阴影效果 */
-webkit-box-shadow: 3px 3px 10px 0 #111111; /*兼容性处理*/
-moz-box-shadow: 3px 3px 10px 0 #111111;
}.leftcon img {
width: 100%;height: 100%;
}.leftcon .slide_box {
display: none; /*将小方块盒子隐藏*/
position: absolute;top: 0;left: 0;
width: 175px;height: 175px;
background: #000;opacity: 0.3;
cursor: move; /*改变鼠标的形状*/
}.rightcon {
display: none; /*将右边div隐藏*/
width: 350px;height: 350px;
margin-top: 100px;float: left;
overflow: hidden;position: relative;
}.rightcon img {
width: 200%;height: 200%;
position: absolute;left: 0px;top: 0px;
}

3、js获取事件对象

1)、Event是获取事件对象,对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、
鼠标的位置、鼠标按钮的状态,envet是windows的一个属性。 放大镜实现方法(获取右边图片定位)
2)、e.clientY:返回事件触发时鼠标相对于元素视口的Y坐标。
e.clientX:返回事件触发时鼠标相对于元素视口的X坐标。
这里的元素视口实际上代指就是浏览器,clientX是鼠标距离浏览器左边框的距离,
clientY是鼠标距离浏览器上边框的距离。
offsetTop获取对象相对于版面或由offsetTop属性指定的父坐标的计算顶端位置。
这里就是左边的div相对于body即浏览器窗口的纵向距离
offsetLeft获取对象相对于版面或由offsetLeft属性指定的父坐标的计算顶端位置。
这里就是左边的div相对于body即浏览器窗口的纵横向距离
offsetHeight是对象的可见高度。这里是指小滑块的高度
offsetHeight是对象的可见宽度。这里是指小滑块的宽度

var leftone = document.getElementById('left');
var rightone = document.getElementById('right');
var box = document.getElementById('box');
var rimg = rightone.getElementsByTagName("img")[0];
function getPosition(e){ //这里的参数e就是代表event
 //首先我们要去判断事件源,获取事件源,也就是e
 var e=e||window.event; //实现兼容
 //理解:
 //这个表达式写全是这样:var e=event?event||window.event;
 //如果存在event,那么var e=event;而如果不存在event,
 //那么var e=window.event.那么可以看出确实能实现兼容
 var top = e.clientY-leftone.offsetTop-box.offsetHeight/2; 
 //计算小图容器里的鼠标坐标(要减去最外层的偏移)
 var left = e.clientX-leftone.offsetLeft-box.offsetWidth/2;
 //这里为什么除以2?是因为我们不除以2的话,事件源也就是鼠标就在这个小滑块的的右下角,并不美观
 //我们要让鼠标位于滑块的中心,所以宽高各减去一半

  //边界判断
  //获取小滑块最大纵向移动距离
  var maxtop = leftone.offsetHeight - box.offsetHeight; 
  //获取小滑块最大横向移动距离
  var maxleft = leftone.offsetWidth - box.offsetWidth; 
  var mintop = 0; //获取小滑块最小纵向移动距离
  var minleft = 0; //获取小滑块最大纵向移动距离
  var mvtop; //定义小滑块的纵向移动距离
  var mvleft; //定义小滑块的横向移动距离
  // 判断
  if (top<mintop) {
  box.style.top = mintop + "px";
   mvtop = mintop;
   //理解:
 //top是鼠标到浏览器的垂直距离-左边div顶部到浏览器的垂直距离-小滑块的高度的一半。
 //那么现在鼠标在小滑块的中心,也就是说,top就等于小滑块的顶部到左边div的垂直距离
 //如果top<0,就是说小滑块和左边div顶部重合,就让小滑块的top值为0,即鼠标继续向上移动,
 //小滑块不在移动,从而让小滑块的移动范围不能超过左边div的宽高范围
 //下方同理
  }else if(top>maxtop){
   box.style.top = maxtop + "px";
   mvtop = maxtop;
 //如果top>maxtop,就是说小滑块和左边div底部重合,就让小滑块的top值为maxtop,
 //即鼠标继续向下移动,小滑块不在移动,从而让小滑块的移动范围不能超过左边div的宽高范围
  }else{
   box.style.top = top + "px";
   mvtop = top;
   //不超过边界,则小滑块的垂直移动距离就等于top,即小滑块的顶部到左边div的垂直距离
  }
  if(left<minleft){
   box.style.left = minleft + "px";
   mvleft = minleft
  }else if(left>maxleft){
   box.style.left = maxleft + "px";
   mvleft = maxleft
  }else{
   box.style.left = left + "px";
   mvleft = left;
  }
 //因为右边div的图片是左边div的图片的两倍,而左边div和右边div都是小滑块的宽高的两倍,
 //而要让右边div放大左边的小滑块的包围图片,所以右边大图的定位坐标是小滑块的两倍,这样才能进行映射
 //右侧图片跟着运动:左侧小滑块移动多少,右侧跟着移动他的2倍即可
  rimg.style.top = -mvtop*2 + "px";
  rimg.style.left = -mvleft*2 + "px";
 }

4、鼠标移入、移出事件

左侧盒子鼠标移入,小滑块和右侧图片显示,衔接鼠标移动效果
onmouseenter 事件类似于 onmouseover 事件。 唯一的区别是 onmouseenter 事件不支持冒泡。

//鼠标移动效果
leftone.onmousemove = function(e){
 var e=e||window.event; //判断事件源
 box.style.display = "block";
  getPosition(e);
 rightone.style.display = "block";
}
//鼠标移出效果
leftone.onmouseleave = function(e){
 var e=e||window.event; //判断事件源
  box.style.display = "none";
  rightone.style.display = "none";
}

5、效果图

JavaScript实现图片放大镜效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
JavaScript获取表单内所有元素值的方法
Apr 02 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
jQuery实现的Div窗口震动效果实例
Aug 07 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
Feb 15 Javascript
javascript cookie的简单应用
Feb 24 Javascript
JS功能代码集锦
May 04 Javascript
angular directive的简单使用总结
May 24 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
Sep 05 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
Nov 01 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 #Javascript
微信小程序自定义组件实现环形进度条
Nov 17 #Javascript
vue + typescript + 极验登录验证的实现方法
Jun 27 #Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
Jun 27 #Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
Jun 27 #Javascript
ES6 let和const定义变量与常量的应用实例分析
Jun 27 #Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 #Javascript
You might like
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
jQuery 自定义函数写法分享
2012/03/30 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
美德好少年事迹材料
2014/01/19 职场文书
体育口号大全
2014/06/18 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
综合实践活动报告
2015/02/05 职场文书
英文慰问信
2015/02/14 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript