原生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一些不错的函数脚本代码
Sep 10 Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 Javascript
jquery实现简单实用的弹出层效果代码
Oct 15 Javascript
js编写简单的计时器功能
Jul 15 Javascript
微信小程序页面滑动屏幕加载数据效果
Nov 16 Javascript
在Vue中使用highCharts绘制3d饼图的方法
Feb 08 Javascript
使用异步组件优化Vue应用程序的性能
Apr 28 Javascript
react PropTypes校验传递的值操作示例
Apr 28 Javascript
浅谈Vue 自动化部署打包上线
Jun 14 Javascript
jQuery实现回到顶部效果
Oct 19 jQuery
vue实现可移动的悬浮按钮
Mar 04 Vue.js
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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
PHP swfupload图片上传的实例代码
2013/09/30 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
vue.js计算属性computed用法实例分析
2018/07/06 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
详解Python中for循环的使用
2015/04/14 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
Python中遍历列表的方法总结
2019/06/27 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
python多进程重复加载的解决方式
2019/12/13 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Python新手学习函数默认参数设置
2020/06/03 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
大学生村官承诺书
2014/03/28 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
文明演讲稿范文
2014/05/12 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP
解决MySQL报“too many connections“错误
2022/04/19 MySQL