原生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 相关文章推荐
JS启动应用程序的一个简单例子
May 11 Javascript
javascript两段代码,两个小技巧
Feb 04 Javascript
解析Javascript小括号“()”的多义性
Dec 03 Javascript
window.location.href中url中数据量太大时的解决方法
Dec 23 Javascript
JS函数定义方式的区别介绍
Mar 22 Javascript
Angularjs之filter过滤器(推荐)
Nov 27 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
Dec 29 Javascript
JS设置手机验证码60s等待实现代码
Jun 14 Javascript
Js面试算法详解
Apr 08 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
Jul 04 Javascript
JavaScript相等运算符的九条规则示例详解
Oct 20 Javascript
js实现随机div颜色位置 类似满天星效果
Oct 24 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
php 随机生成10位字符代码
2009/03/26 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
JavaScript 指导方针
2007/04/05 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python实现修改文件内容的方法分析
2018/03/25 Python
对python中的logger模块全面讲解
2018/04/28 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
HTML5样式控制示例代码
2013/11/27 HTML / CSS
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
文秘大学生求职信
2014/02/25 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
详细了解java监听器和过滤器
2021/07/09 Java/Android