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 相关文章推荐
文本域中换行符的替换示例
Mar 04 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
Jun 07 Javascript
使用AngularJS创建自定义的过滤器的方法
Jun 18 Javascript
jQuery表单验证简单示例
Oct 17 Javascript
Angular的自定义指令以及实例
Dec 26 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
Mar 08 Javascript
微信小程序数据存储与取值详解
Jan 30 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
Mar 01 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 Javascript
浅析Vue实例以及生命周期
Aug 14 Javascript
vant 自定义 van-dropdown-item的用法
Aug 05 Javascript
vue中三级导航的菜单权限控制
Mar 31 Vue.js
用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
php之CodeIgniter学习笔记
2013/06/17 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
thinkphp分页集成实例
2017/07/24 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
js仿360开机效果
2019/12/26 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
python散点图实例之随机漫步
2018/08/27 Python
Python对象转换为json的方法步骤
2019/04/25 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
python+requests接口自动化框架的实现
2020/08/31 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
生产班组长岗位职责
2014/01/05 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技
Python使用Web框架Flask开发项目
2022/06/01 Python