放大镜效果在很多网站都在使用,尤其在图片类型网站或者购物网站。
代码实例如下:
<!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),事件处理函数的绑定。