js、jquery实现放大镜效果

时间:2022-12-11 06:27:34

在一些电商网站的商品详情页面,都会有放大镜效果,实现起来并不是很困难,今天用了两个小时,写了一个放大镜效果的实例,来分享给大家!

实现的效果大概是这个样子的

js、jquery实现放大镜效果

预览

先来看一下效果吧,点击下面的链接预览动态的效果!

http://sandbox.runjs.cn/show/vbu6ebq2

 

代码实现过程:

1. html部分

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>商品详情放大镜效果</title>
<script type="text/javascript" src="js/jquery/jquery-3.2.1.js"></script>
</head>
<body>
<div class="container">
<h2>商品详情放大镜效果</h2>
<div class="magnifierContainer">
<div class="imgLeft">
<!-- 中号图片 -->
<div class="imgMedium" id="imgMedium">
<!-- 放大镜 -->
<div class="magnifier" id="magnifier">
<img src="http://product.dangdang.com/images/zoom_pup.png">
</div>
<!-- 图片 -->
<div class="mediumContainer" id="mediumContainer">
<img src="http://img3m3.ddimg.cn/2/21/22628333-1_w_2.jpg">
</div>
<div id="zhezhao"></div>
</div>

<!-- 缩略图 -->
<ul class="img_x" id="img_x">
<li><img src="http://img3m3.ddimg.cn/2/21/22628333-1_x_2.jpg"></li>
<li><img src="http://img3m3.ddimg.cn/2/21/22628333-2_x_2.jpg"></li>
<li><img src="http://img3m3.ddimg.cn/2/21/22628333-3_x_2.jpg"></li>
<li><img src="http://img3m3.ddimg.cn/2/21/22628333-4_x_2.jpg"></li>
<li><img src="http://img3m3.ddimg.cn/2/21/22628333-5_x_2.jpg"></li>
</ul>
</div>
<div class="imgRight">
<!-- 大图 -->
<div class="img_u" id="img_u">
<img src="http://img3m3.ddimg.cn/2/21/22628333-1_u_2.jpg">
</div>
</div>
</div>
</div>
</body>
</html>

 

2. css部分

 

<style type="text/css">
*
{
margin
: 0;
padding
: 0;
}
ul
{
list-style
: none;
}
.container
{
width
: 850px;
margin
: 50px auto;
text-align
: center;
}
.magnifierContainer
{
display
: flex;
margin-top
: 30px;
}
.imgMedium
{
position
: relative;
}
.imgLeft .magnifier
{
position
: absolute;
display
: none;
width
: 200px;
height
: 200px;
}
.mediumContainer
{
width
: 350px;
height
: 350px;
border
: 1px solid #eee;
overflow
: hidden;
}
#zhezhao
{
width
: 350px;
height
: 350px;
background
: transparent;
position
: absolute;
top
: 0;
border
: 1px solid transparent;
}
#zhezhao:hover
{
cursor
: move;
}
.img_x
{
width
: 350px;
height
: 77px;
border
: 1px solid #eee;
margin-top
: 20px;
display
: flex;
}
.img_x li
{
width
: 54px;
height
: 54px;
border
: 2px solid transparent;
margin
: 8px 4px;
padding
: 2px;
}
.img_u
{
width
: 500px;
height
: 450px;
border
: 1px solid #eee;
float
: left;
margin-left
: 15px;
overflow
: hidden;
display
: none;
}
</style>

 

3. js部分

<script type="text/javascript">
$(
'#img_x li').eq(0).css('border', '2px solid coral');
$(
'#zhezhao').mousemove(function(e){
$(
'#img_u').show();
$(
'#magnifier').show();
var left = e.offsetX - parseInt($('#magnifier').width()) / 2;
var top = e.offsetY - parseInt($('#magnifier').height()) / 2;
left
= left < 0 ? 0 : left;
left
= left > (parseInt($('#zhezhao').outerWidth()) - parseInt($('#magnifier').outerWidth())) ? (parseInt($('#zhezhao').outerWidth()) - parseInt($('#magnifier').outerWidth())) : left;
top
= top < 0 ? 0 : top;
top
= top > (parseInt($('#zhezhao').outerHeight()) - parseInt($('#magnifier').outerHeight())) ? (parseInt($('#zhezhao').outerHeight()) - parseInt($('#magnifier').outerHeight())) : top;

$(
'#magnifier').css('left', left + 'px');
$(
'#magnifier').css('top', top + 'px');

var leftRate = left / parseInt($('#zhezhao').outerWidth());
var bigLeft = leftRate * parseInt($('#img_u img').outerWidth());
$(
'#img_u img').css('margin-left', -bigLeft + 'px');

var topRate = top / parseInt($('#zhezhao').outerHeight());
var bigTop = topRate * parseInt($('#img_u img').outerHeight());
$(
'#img_u img').css('margin-top', -bigTop + 'px');
})
$(
'#zhezhao').mouseleave(function(){
$(
'#img_u').hide();
$(
'#magnifier').hide();
})

$(
'#img_x li').mouseover(function(){
$(
this).css('border', '2px solid coral').siblings().css('border', '2px solid transparent');
$(
'#mediumContainer img').eq(0).attr('src', 'http://img3m3.ddimg.cn/2/21/22628333-' + ($(this).index()+1) + '_w_2.jpg');
$(
'#img_u img').eq(0).attr('src', 'http://img3m3.ddimg.cn/2/21/22628333-' + ($(this).index()+1) + '_u_2.jpg');
})
</script>

 

实现过程中需要注意的地方:

在实现放大镜在图片上移动时,我给商品图片绑定了mousemove鼠标移动事件,当鼠标移动的同时,也移动放大镜,但是效果却不是想象的样子,会有一些卡顿、闪烁的现象

当鼠标在商品图片上移动时,放大镜也随之移动,当鼠标在放大镜图片上时,则不会移动,这是因为绑定mousemove事件的是商品图片,而不是放大镜图片,而放大镜图片所在的图层在商品图片之上,所以当鼠标移动到放大镜图片上时,就不会触发mousemove事件,从而就出现了卡顿的现象。

那么,怎样解决呢?

我又加了一个div,这个div的大小和商品图片的div的大小一样,背景色为透明色,图层在最上面,然后给这个透明的div绑定mousemove事件,放大镜图片就会流畅的移动了。

  

在线调试

如需在线调试请点击下面的链接!

http://runjs.cn/code/vbu6ebq2

  

如果对您有帮助,记得点赞哦!需要您的支持与鼓励,同时也欢迎您留下宝贵意见!