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 相关文章推荐
Open and Print a Word Document
Jun 15 Javascript
CSS常用网站布局实例
Apr 03 Javascript
一个js写的日历(代码部分网摘)
Sep 20 Javascript
js 获取计算后的样式写法及注意事项
Feb 25 Javascript
extjs4 treepanel动态改变行高度示例
Dec 17 Javascript
给js文件传参数(详解)
Jul 13 Javascript
jQuery中click事件用法实例
Dec 26 Javascript
jquery判断单选按钮radio是否选中的方法
May 05 Javascript
ajax级联菜单实现方法实例分析
Nov 28 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
Mar 12 Javascript
JS高级技巧(简洁版)
Jul 29 Javascript
vue实现导航菜单和编辑文本的示例代码
Jul 04 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网站的几个实用要点
2014/12/30 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
php跨服务器访问方法小结
2015/05/12 PHP
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
JavaScript判断数字是否为质数的方法汇总
2016/06/02 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
js正则相关知识点专题
2018/05/10 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
python设置随机种子实例讲解
2019/09/12 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
英国家用电器购物网站:Hughes
2018/02/23 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
热能动力工程毕业生自荐信
2013/11/07 职场文书
学习方法演讲稿
2014/05/10 职场文书
旅游节目策划方案
2014/05/26 职场文书
高三毕业评语
2014/12/31 职场文书
离婚纠纷代理词
2015/05/23 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python