js编写一个简单的产品放大效果代码


Posted in Javascript onJune 27, 2016

购物网站的产品页经常会放有一个产品展示图区。该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图。实现该功能的方法也非常简单。

 js编写一个简单的产品放大效果代码

实验:制作产品焦点放大图。

所需技能:

1、基本的获取页面元素的方法;
2、几个简单的事件;
3、会使用dom设置元素的属性;
案例原理:

1、焦点框的跟随鼠标事件;
2、焦点框的移动区域规定;
3、大盒子内容的显示;
适合对象:js初学者

-------------------------------------------------------------------开始!-------------------------------------------------------------
一、首先我们准备CSS样式,CSS样式中需要注意的几个点是:
(1)焦点图相对定位,默认display:none; 
(2)右侧显示大图的盒子(以下简称大图框)默认display:none;大图框中的内容在溢出盒子后要隐藏overflow:hidden; 

js编写一个简单的产品放大效果代码

二、开始书写script代码:
(1)首先获取页面元素:

//首先或许要操作的元素
 function getId(tag){
 //定义一个用id获取元素的方法,减少很多工作量!
  return document.getElementById(tag)
 }
 var box=getId("box");
 var small=getId("small");
 var mask=getId("mask");
 var big=getId("big");
 var pic=big.children[0];

 //这里是通过节点的方法获取元素

(2)明确鼠标移动到小图上会出现两个事件:1)焦点框要出来;2)大图框要显示出来。同理鼠标移除后这两个事假要取消 

//鼠标移动到图片上出现两个效果
 small.onmouseover=function(){
  mask.style.display="block";
  big.style.display="block";
 }
 small.onmouseout=function(){
  mask.style.display="none";
  big.style.display="none"
 }
 

(3)设置焦点框的跟随:
1)当设置焦点框的跟随时,我们的跟随时间是事实发生的,所以此处的事件类型不在是onmouseover;而是onmousemove;
2)这段代码中涉及到的问题主要是一个mask(焦点框)的定位计算问题,容易忽略的问题是mask是相对谁的位置移动的?我的css样式中mask是放在small这个盒子中的,所以相对移动的位置一定是其已经定位的父元素small的位置。所以我用clientX,clientY获取的相对于浏览器当前窗口的位置坐标不能直接使用,必须减去其父盒子的margin值的影响。

//设置小图的焦点框,跟随鼠标;
 small.onmousemove=function(e){
  var marginL=box.offsetLeft; //使用offsetLeft方法获得box的margin-left
  var marginT=box.offsetTop; //使用offsetTop方法获得box的margin-top
  var currentX= e.clientX;







  var currentY= e.clientY;
//使用e.clientX和e.clinetY相对于浏览器的左上角的位置

 
  var x=currentX-marginL-mask.offsetWidth/2;




  var y=currentY-marginT-mask.offsetHeight/2; //要想使焦点框的中心对齐鼠标,还需要减去焦点框的宽高的一半
/----------------------此处一会儿还要插入其他代码/---------------------------/
  mask.style.left=x+"px";
  mask.style.top=y+"px"; 
//改变焦点框的位置 

(4)闲置焦点框的位置的移动 
1)上一步执行完成后焦点框的移动是不受任何闲置的,在我们浏览购物网站的过程中,明显可以感受到焦点框不容许移动的小图的外面,造成不好的用户体验; 
2)要限制焦点框的移动,主要是x,y变化超过容许值时,给他一个固定的值; 

//设置小图的焦点框,跟随鼠标;
 small.onmousemove=function(e){
  var marginL=box.offsetLeft;
  var marginT=box.offsetTop;
  var currentX= e.clientX;
  var currentY= e.clientY;
  var x=currentX-marginL-mask.offsetWidth/2;
  var y=currentY-marginT-mask.offsetHeight/2;

  //给焦点框设置移动区域
  if(x<0){x=0;}
  if(x>small.offsetWidth-mask.offsetWidth)


{x=small.offsetWidth-mask.offsetWidth};

 // 用于定位的x的最小值是0,最大值是small的长度-mask的长度 y轴线同理
  if(y<0){y=0;}
  if(y>small.offsetHeight-mask.offsetHeight)




{y=small.offsetHeight-mask.offsetHeight};
  mask.style.left=x+"px";




//注意在规定移动区域后再写mask的移动区域,注意代码的执行顺序
  mask.style.top=y+"px";

(5)设置大图的显示 
1)在big盒子中实现图片的移动,应该想到-margin值; 
2)移动多少距离可以利用一个固定比例乘以mask的left和top值,想一下焦点区的左上角和大图框的左上角显示的位置是相同的!!!这一点就不是很难理解了 

//设置大盒子中显示的内容
  var relativeX=mask.offsetLeft;
  var relativeY=mask.offsetTop;
  var proporationX=pic.offsetWidth/small.offsetWidth;

//设置比例
  var proporationY=pic.offsetHeight/small.offsetWidth;
  pic.style.marginLeft=-relativeX*proporationX+"px";


//注意!margin的值必须是负值,“px不要丢掉
  pic.style.marginTop=-relativeY*proporationY+"px";

到这一步我们的这个demo也就做完了!是不是很简单
下面我将整个代码粘贴出来,希望能和大家讨论交流。

这里是css代码 

<style>
  * {
   margin: 0;
   padding: 0;
  }

  #box {
   margin: 50px;

  }

  #small {
   width: 229px;
   height: 250px;
   border: 1px solid black;
   text-align: center;
   position: relative;
   float: left;
  }

  #mask {
   width: 100px;
   height: 100px;
   background-color: rgba(214, 111, 193, 0.3);
   position: absolute;
   top: 0;
   left: 0;
   /*display: none;*/
  }
  #big {
   width: 350px;
   height: 350px;
   border: 1px solid black;
   float: left;
   overflow: hidden;
   /*display: none;*/
  }
 </style>

这里是HTML 

<body>
<div id="box">
 <div id="small">
  <img src="small_img.jpg" width="229" height="249" alt=""/>

  <div id="mask"></div>
 </div>
 <div id="big">
  <img src="big_img.JPG" width="549" height="600" alt=""/>
 </div>
</div>

这里是js代码 

<script>
 //首先或许要操作的元素
 function getId(tag){
  return document.getElementById(tag)
 }
 var box=getId("box");
 var small=getId("small");
 var mask=getId("mask");
 var big=getId("big");
 var pic=big.children[0];
 console.log(pic);
 //鼠标移动到图片上出现两个效果
 small.onmouseover=function(){
  mask.style.display="block";
  big.style.display="block";
 }
 small.onmouseout=function(){
  mask.style.display="none";
  big.style.display="none"
 }
  //设置小图的焦点框,跟随鼠标;
 small.onmousemove=function(e){
  var marginL=box.offsetLeft;
  var marginT=box.offsetTop;
  var currentX= e.clientX;
  var currentY= e.clientY;
  var x=currentX-marginL-mask.offsetWidth/2;
  var y=currentY-marginT-mask.offsetHeight/2;

  //给焦点框设置移动区域
  if(x<0){x=0;}
  if(x>small.offsetWidth-mask.offsetWidth){x=small.offsetWidth-mask.offsetWidth};
  if(y<0){y=0;}
  if(y>small.offsetHeight-mask.offsetHeight){y=small.offsetHeight-mask.offsetHeight};
  mask.style.left=x+"px";
  mask.style.top=y+"px";
  //设置大盒子中显示的内容
  var relativeX=mask.offsetLeft;
  var relativeY=mask.offsetTop;
  var proporationX=pic.offsetWidth/small.offsetWidth;
  var proporationY=pic.offsetHeight/small.offsetWidth;
  pic.style.marginLeft=-relativeX*proporationX+"px";
  pic.style.marginTop=-relativeY*proporationY+"px";
 }
</script>

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

Javascript 相关文章推荐
jQuery 表格插件整理
Apr 27 Javascript
js算法中的排序、数组去重详细概述
Oct 14 Javascript
js动态添加事件并可传参数示例代码
Oct 21 Javascript
javascript确认框的三种使用方法
Dec 17 Javascript
javascript快速排序算法详解
Sep 17 Javascript
dreamweaver 8实现Jquery自动提示
Dec 04 Javascript
js图片切换具体实现代码
Oct 13 Javascript
详解基于angular路由的requireJs按需加载js
Jan 20 Javascript
详谈Node.js之操作文件系统
Aug 29 Javascript
vue.js input框之间赋值方法
Aug 24 Javascript
javascript实现自由编辑图片代码详解
Jun 21 Javascript
js设计模式之代理模式及订阅发布模式实例详解
Aug 15 Javascript
用JS实现轮播图效果(二)
Jun 26 #Javascript
用JS实现图片轮播效果代码(一)
Jun 26 #Javascript
JavaScript中Form表单技术汇总(推荐)
Jun 26 #Javascript
jQuery滚动新闻实现代码
Jun 26 #Javascript
js css实现垂直方向自适应的三角提示菜单
Jun 26 #Javascript
JS中的进制转换以及作用
Jun 26 #Javascript
JavaScript类型系统之布尔Boolean类型详解
Jun 26 #Javascript
You might like
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
飞机制造技术专业求职信
2014/07/27 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
先进典型发言材料
2014/12/30 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL