纯js仿淘宝京东商品放大镜功能


Posted in Javascript onMarch 02, 2017

效果图:

纯js仿淘宝京东商品放大镜功能

代码如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
 <title>无标题</title>
 <style>
 *{
  margin: 0px;
  padding: 0px;
 }
 .imgContent{
  width: 420px;
  height: 300px;
  position: relative;
  margin-left: 50px;
  margin-top: 50px;
 }
 .imgContent>img{
  width: 420px;
  height: 300px;
 }
 </style>
</head>
<body>
 <div class="imgcontent" id="imgContent1">
 <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488436622116&di=e3c2b2a5c847d6051d8daaec9a9a2131&imgtype=0&src=http%3A%2F%2F2a.zol-img.com.cn%2Fproduct%2F174_1200x900%2F888%2FceeY9tJ1QRFLk.jpg" alt="iphone7">
 </div>
</body>
<script>
 /*大致功能的思路:(完全按照自己的想法去实现的功能,肯定有很多地方优化,希望大家一起讨论)
 1、有一个放原始图片的盒子
 2、当鼠标移入这个盒子,在右侧创建一个相同大小的镜像盒子,镜像盒子里创建一个放大4倍的镜像图片,同时也在原始盒子里创建一个放大镜(若存在就display:block,若不存在就创建,镜像盒子同理)
 3、当鼠标移动时,原始盒子里的放大镜跟随鼠标移动(类似拖拽功能),镜像盒子里的图片的top和left值是原始盒子里放大镜的top和left值的-4倍
 4、当鼠标移出原始盒子时,隐藏镜像盒子和放大镜*/
 function Scaler(id){
 var me = this
 var originalDiv = document.querySelector("#"+id)
 var mirrorDiv = null
 var mirrorImg = null
 var scaler = null
 var real_left = originalDiv.offsetLeft
 var real_right = originalDiv.offsetWidth+originalDiv.offsetLeft
 var real_top = originalDiv.offsetTop
 var real_bottom = originalDiv.offsetHeight+originalDiv.offsetTop
 //创建镜像盒子
 this.createMirror = function(){
  var originalStyle = getComputedStyle(originalDiv)
  mirrorDiv = document.createElement("div")
  mirrorDiv.style.cssText = 'width:'+originalStyle.width+
      ';height:'+originalStyle.height+
      ';position:absolute;left:'+originalStyle.width+
      ';top:0px;margin-left:10px;overflow:hidden;';
  //创建镜像图片
  mirrorImg = document.createElement("img")
  mirrorImg.style.cssText = 'width:'+(originalDiv.offsetWidth*4)+
      'px;height:'+originalDiv.offsetHeight*4+'px;position:absolute;top:0px;left:0px;'
  mirrorImg.src = document.querySelector("#"+id+" img").src
  mirrorDiv.appendChild(mirrorImg)
  originalDiv.appendChild(mirrorDiv)
 }
 //创建放大镜
 this.createScaler = function(left,top){
  scaler = document.createElement("div")
  scaler.style.cssText = 'width:100px;height:100px;background-color:yellow;opacity:0.4;position:absolute;'
  scaler.style.top = top;
  scaler.style.left = left; 
  originalDiv.appendChild(scaler)
 }
 //设置镜像图片位置
 this.setImgPosition = function(left,top){
  mirrorImg.style.left = '-'+left+'px'
  mirrorImg.style.top = '-'+top+'px'
 }
 //鼠标移入事件
 this.e_mouseover = function(){
  originalDiv.style.cursor = "move"
  if (!mirrorDiv) {
  me.createMirror()
  }else{
  mirrorDiv.style.display = "block"
  };
  if (!scaler) {
  me.createScaler(0,0)
  }else{
  scaler.style.display = "block"
  };
 }
 //鼠标移出事件
 this.e_mouseleave = function(){
  mirrorDiv.style.display = "none"
  scaler.style.display = "none"
 }
 //鼠标移动事件(关键代码)
 this.e_mousemove = function(e){
  // 判断鼠标是否移出原始盒子
  if (e.clientX > real_right || e.clientX < real_left || e.clientY > real_bottom || e.clientY < real_top ) {
  me.e_mouseleave()
  return false
  };
  // 鼠标到原始盒子顶部的距离
  var padTop = e.clientY-real_top
  // 鼠标到原始盒子左侧的距离
  var padLeft = e.clientX-real_left
  //放大镜跟随鼠标移动(-50是因为让鼠标在放大镜的中心)
  scaler.style.top = padTop-50;
  scaler.style.left = padLeft-50;
  //因为镜像图片放大了4倍,所以跟随移动的时候是4倍
  me.setImgPosition((padLeft-50)*4,(padTop-50)*4)
 }
 //注册事件监听
 originalDiv.onmouseover = me.e_mouseover
 originalDiv.onmouseleave = me.e_mouseleave
 originalDiv.onmousemove = function(e){
  me.e_mousemove(e)
 }
 }
 // 创建图片放大功能对象,参数为原始盒子id即可(放大镜大小,镜像图片放大倍数都可设为参数传递)
 new Scaler("imgContent1")
</script>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
JSQL  一个 web DB 的封装
May 05 Javascript
js实现双向链表互联网机顶盒实战应用实现
Oct 28 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
Mar 05 Javascript
javascript中Math.random()使用详解
Apr 15 Javascript
关于JS变量和作用域详解
Jul 28 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
Nov 25 Javascript
vue elementUI使用tabs与导航栏联动
Jun 21 Javascript
微信小程序使用车牌号输入法的示例代码
Aug 20 Javascript
JavaScript实现省份城市的三级联动
Feb 11 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
Apr 17 Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 08 Javascript
JSONP跨域请求
Mar 02 #Javascript
jquery easyui dataGrid动态改变排序字段名的方法
Mar 02 #Javascript
JavaScript正则替换HTML标签功能示例
Mar 02 #Javascript
如何正确理解javascript的模块化
Mar 02 #Javascript
jquery实现左右滑动式轮播图
Mar 02 #Javascript
如何写好你的JavaScript【推荐】
Mar 02 #Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 #Javascript
You might like
php扩展ZF――Validate扩展
2008/01/10 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
2015/12/29 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python中模块string.py详解
2017/03/12 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
实例讲解Python3中abs()函数
2019/02/19 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
财务方面个人工作的自我评价
2013/12/28 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书