原生js实现放大镜特效


Posted in Javascript onMarch 08, 2017

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

掌握页面元素定位和移动

放大镜关键原理:鼠标在小图片上移动时,通过捕捉鼠标在小图片上的位置定位大图片的相应位置

技术点:事件捕获、定位

offsetLeft与style.left的对比:
1)offsetLeft是与父级元素的距离,不包过滚动条的距离
2)style.left返回的是字符串,如30px,offsetLeft返回的是数值30
3)style.lft是可读写的,offsetLeft是只读的,所以要改变div的位置只能修改style.left
4)style.left的值需要事先定义,否则取到的值为空
难点:计算:如何让小图片的放大镜和大图片同步移动

距离定位图解:

原生js实现放大镜特效

具体代码:

<!DOCTYPE html>
<html>
<head lang="en">
 <meta charset="UTF-8">
 <title></title>
</head>
<style type="text/css">
 *{
 margin: 0;
 padding: 0;
 }
 #demo{
 display: block;
 width: 400px;
 height: 255px;
 margin: 50px;
 position: relative;
 border: 1px solid #ccc;
 }
 #small-box{
 position: relative;
 z-index: 1;
 }
 #float-box{
 display: none;
 width: 160px;
 height: 120px;
 position: absolute;
 background: #ffffcc;
 border: 1px solid #ccc;
 filter: alpha(opacity=50);
 opacity: 0.5;
 }
 #mark{
 position: absolute;
 display: block;
 width: 400px;
 height: 255px;
 background-color: #fff;
 filter: alpha(opacity=0);
 opacity: 0;
 z-index: 10;
 }
 #big-box{
 display: none;
 position: absolute;
 top: 0;
 left: 460px;
 width: 400px;
 height: 300px;
 overflow: hidden;
 border: 1px solid #ccc;
 z-index: 1;
 }
 #big-box img{
 position: absolute;
 z-index: 5;
 }
</style>
<script>
 window.onload=function(){
 var $=function(id){
  return document.getElementById(id);
 }
 var Demo = $("demo");
 var SmallBox = $("small-box");
 var Mark = $("mark");
 var FloatBox = $("float-box");
 var BigBox = $("big-box");
 var BigBoxImage = BigBox.getElementsByTagName("img")[0];
 Mark.onmouseover = function(){
  FloatBox.style.display = "block";
  BigBox.style.display = "block";
 }
 Mark.onmouseout = function(){
  FloatBox.style.display = "none";
  BigBox.style.display = "none";
 }
 Mark.onmousemove = function(e){
  var _event = e||window.event//兼容多个浏览器的参数模式
  var left = _event.clientX - Demo.offsetLeft - SmallBox.offsetLeft - FloatBox.offsetWidth/2;
  var top = _event.clientY - Demo.offsetTop - SmallBox.offsetTop - FloatBox.offsetHeight/2;
  if(left < 0){
  left = 0;
  }else if(left > Mark.offsetWidth - FloatBox.offsetWidth){
  left = Mark.offsetWidth - FloatBox.offsetWidth;
  }
  if(top < 0){
  top = 0;
  }else if(top > Mark.offsetHeight - FloatBox.offsetHeight){
  top = Mark.offsetHeight - FloatBox.offsetHeight;
  }
  FloatBox.style.left = left + 'px';
  FloatBox.style.top = top + 'px';
  var percentX = left / (Mark.offsetWidth - FloatBox.offsetWidth);
  var percentY = top / (Mark.offsetHeight - FloatBox.offsetHeight);
  BigBoxImage.style.left = -percentX * (BigBoxImage.offsetWidth - BigBox.offsetWidth)+'px';
  BigBoxImage.style.top = -percentY * (BigBoxImage.offsetHeight - BigBox.offsetHeight)+'px';
 }
 }
</script>
<body>
<div id="demo">
 <div id="small-box">
 <div id="mark"></div>
 <div id="float-box"></div>
 <img src="img/macbook-small.jpg" />
 </div>
 <div id="big-box">
 <img src="img/macbook-big.jpg" />
 </div>
</div>
</body>
</html>

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

Javascript 相关文章推荐
javascript学习笔记(三)显示当时时间的代码
Apr 08 Javascript
用js判断是否为360浏览器的实现代码
Jan 15 Javascript
jQuery操作JSON的CRUD用法实例
Feb 25 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
Nov 08 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
WebPack配置vue多页面的技巧
May 15 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 Javascript
Vue实现类似Spring官网图片滑动效果方法
Mar 01 Javascript
详解基于Wepy开发小程序插件(推荐)
Aug 01 Javascript
原生js实现二级联动菜单
Nov 27 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
Nov 12 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
Mar 02 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
Mar 08 #Javascript
正则 js分转元带千分符号详解
Mar 08 #Javascript
@ResponseBody 和 @RequestBody 注解的区别
Mar 08 #Javascript
js/jq仿window文件夹框选操作插件
Mar 08 #Javascript
js实现上下左右弹框划出效果
Mar 08 #Javascript
浅谈JavaScript正则表达式-非捕获性分组
Mar 08 #Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
Mar 08 #Javascript
You might like
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
javascript indexOf函数使用说明
2008/07/03 Javascript
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
详解js闭包
2014/09/02 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
2018/12/20 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
tensorflow如何批量读取图片
2019/08/29 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
司机职责范本
2014/03/08 职场文书
作风建设年度心得体会
2014/10/29 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
Python Django模型详解
2021/10/05 Python
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js