插件窝 干货文章 jQuery 放大镜效果详解

jQuery 放大镜效果详解

jquery 放大镜 811    来源:插件窝    2019-09-09

放大镜效果在很多网站都在使用,尤其在图片类型网站或者购物网站。


代码实例如下:

<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="http://www.chajianwo.com/" />
<title>插件窝</title>
<style type="text/css">
*{margin:0px;padding:0px;}
.box{
  position:relative;
  margin:10px auto;
  padding:10px;
  border:1px solid #666;
  background:#CCC;
  width:250px;
}
.box .small{
  position:relative;
  text-align:center;
  background:#FFF;
  height:167px;
}
.box .small .mark{
  position:absolute;
  top:0;
  left:0;
  z-index:2;
  width:80px;
  height:80px;
  background:#FFFFFF;
  filter:alpha(opacity:50); 
  opacity:0.5;
  border:1px solid #333;
  display:none;
}
.box .big{
  position:absolute;
  left:0;
  top:0;
  display:none;
} 
.boxbig{
  position:absolute;
  left:275px;
  top:0;
  width:160px;
  height:160px;
  overflow:hidden;
}
</style>
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script type="text/javascript">
$(function(){
  var mouseX = 0; 
  var mouseY = 0;  
  var maxLeft = 0; 
  var maxTop = 0; 
  var markLeft = 0; 
  var markTop = 0; 
  var perX = 0; 
  var perY = 0; 
  var bigLeft = 0; 
  var bigTop = 0; 
    
  function updataMark($mark){
    if(markLeft<0){
      markLeft = 0;
    }
    else if(markLeft>maxLeft){
      markLeft=maxLeft;
    }
    if(markTop<0){
      markTop=0;
    }
    else if(markTop>maxTop){
      markTop=maxTop;
    }
    
   perX=markLeft/$(".small").outerWidth();
   perY=markTop/$(".small").outerHeight();
    
   bigLeft=-perX*$(".big").outerWidth();
   bigTop=-perY*$(".big").outerHeight();
    
    //设定小框的位置
    $mark.css({"left":markLeft,"top":markTop,"display":"block"});
  }
  
  //改变大图的位置
  function updataBig(){
    $(".big").css({"display":"block","left":bigLeft,"top":bigTop});
  }
  
  //鼠标移出时
  function cancle(){
    $(".big").css({"display":"none"}); 
    $(".mark").css({"display":"none"});
  }
  
  //鼠标小图上移动时
  function imgMouseMove(event){  
   var $this = $(this);
   var $mark = $(this).children(".mark");
      
   //鼠标在小图的位置
   mouseX=event.pageX-$this.offset().left - $mark.outerWidth()/2;
   mouseY=event.pageY-$this.offset().top - $mark.outerHeight()/2;
    
    //最大值
    maxLeft=$this.width()-$mark.outerWidth();
    maxTop=$this.height()-$mark.outerHeight();
    markLeft=mouseX;
    markTop=mouseY;
    
    updataMark($mark);
    updataBig();
  }
  $(".small").bind("mousemove",imgMouseMove).bind("mouseleave",cancle);
})
</script>
</head>
<body>
<div class="box">
  <div class="small">
   <span class="mark"></span>
   <img src="mytest/jQuery/1_s.jpg" alt="" />
  </div>
  <div class="boxbig">
   <div class="big"><img src="mytest/jQuery/1_b.jpg" alt="" /></div>
  </div>
</div>
</body>
</html>

一.实现原理:

原理特别的简单,两张等比例的图片,一张是小图,一张是大图,当鼠标在小图中移动的时候会出现一个半透明的遮罩图片,用来标识要放大的区域,这个时候就根据相应的比例,在另一个区域调整大图的left和top属性值,来显示相应的位置,原理大致如此,具体可以参阅代码注释,再加以思考,应该很容易弄明白。

二.代码注释:

(1).$(function(){}),当文档结构完全加载完毕之后再去执行函数中的代码。

(2).var mouseX=0,声明一个变量用来存放半透明遮罩框的左边缘距离small元素的距离。

(3).var mouseY=0,声明一个变量用来存放半透明遮罩框的上边缘距离small元素的距离。

(4).var maxLeft=0,声明一个变量用来存放半透明遮罩框左边缘距离samll元素的最大距离。

(5).var maxTop=0,声明一个变量用来存放半透明遮罩框的上边缘距离small元素的最大距离。

(6).var markLeft=0,用来存放mouseX值。

(7).var markTop=0,用来存放mouseY值。

(8).var perX=0,用来存放mouseX与samll元素宽度的比例。

(9).var perY=0,用来存放mouseY与samll元素高度的比例。

(10).var bigLeft=0,用来存放big元素left属性值。

(11).var bigTop=0,用来存放big元素的top属性值。

(12).function updataMark($mark){},此函数可以控制办透明遮罩层的位置,参数为半透明对象。

(13).if(markLeft<0){markLeft = 0;},如果半透明遮罩框左边缘超出small元素的左边缘,则将markLeft值设置为0,也就是让半透明遮罩层贴在samll元素内壁上。

(14).else if(markLeft>maxLeft){markLeft=maxLeft;},如果半透明遮罩层右边缘超出small元素的右边缘,则将markLeft设置为maxLeft,也就是让半透明遮罩层贴在small元素的右侧内壁。

(15).perX=markLeft/$(".small").outerWidth(),可以计算出半透明遮罩层在small元素中向左移动的尺寸占small元素宽度的比例,使用这个值再乘以大图的尺寸就可以计算出大图相应的移动尺寸,这样可以确保放大位置和右侧出现的放大位置对应。

(16).perY=markTop/$(".small").outerHeight(),和上面同样的道理。

(17).bigLeft=-perX*$(".big").outerWidth(),计算出big元素左移的尺寸,其实也就是图片左移的尺寸。

(18).bigTop=-perY*$(".big").outerHeight(),和上面同样的道理。

(19).$mark.css({"left":markLeft,"top":markTop,"display":"block"}),设置半透明遮罩框的位置,并将其设为可见。

(20).function updataBig(){},设置big元素的定位坐标。

(21).$(".big").css({"display":"block","left":bigLeft,"top":bigTop}),设置big元素的left和top属性值,并将其设置为可见。

(22).function cancle(){},规定当鼠标移出时的操作。

(23).$(".big").css({"display":"none"}),将big设置为隐藏。

(24).$(".mark").css({"display":"none"}),将半透明遮罩层设置为隐藏。

(25).function imgMouseMove(event){},当鼠标移动时,用来设定遮罩层的坐标。

(26).var $this=$(this),鼠标移动所在的对象。

(27).var $mark=$(this).children(".mark"),获取半透明遮罩框对象。

(28).mouseX=event.pageX-$this.offset().left-$mark.outerWidth()/2,设置半透明遮罩框的左边缘距离samll元素的距离,使用这种方式也可以将鼠标指针位于遮罩框水平中心位置。

(29).mouseY=event.pageY-$this.offset().top-$mark.outerHeight()/2,和上面同样的道理。

(30).maxLeft=$this.width()-$mark.outerWidth(),获取半透明遮罩框左边缘距离samll元素的最大距离。

(31).maxTop=$this.height()-$mark.outerHeight(),半透明遮罩框的上边缘距离small元素的最大距离。

(32).$(".small").bind("mousemove",imgMouseMove).bind("mouseleave",cancle),事件处理函数的绑定。