JavaScript | 图片放大特效

在电商网站中,经常可以看到商品详情展示页中,鼠标经过商品的图片即可看到一个放大查看区域的细节图片。那么,图片放大特效是如何实现的呢?通常情况下,会准备两张相同的图片。一张是小图显示在商品的展示区域,另一张大图用于鼠标在小图上移动时,按比例的显示大图中的对应区域。接下来将通过JavaScript的鼠标事件来完成图片放大特效,具体步骤如下所示。

(1)编写HTML 页面

<div id="box" class="box">
<div id="smallBox" class="small">
< img src="images/small.jpg"> <!-- 小图 -->
<div id="mask" class="mask"></div> <!-- 遮罩 -->
</div>
<div id-"bigBox" class-"big">
< img id="bigImg" src-"images/big-jpg"> <!-- 大图 -->
</div>
</div>

  在上述代码中,id为smallBox的<div>用于显示商品图片的小图:id 为 mask 的<div>用于鼠标经过小图时查看的图片区域(遮罩);id为bigBox的<div>用于显示商品大图的对应查看区域。接下来设置 CSS 样式,具体代码请参考本书源码。遮罩和小图的展示效果如图 8-20 所示。值得一提的是,默认情况下,遮罩是隐藏的,只有鼠标经过小图时才会显示。

(2)显示与隐藏“遮罩”和“局部放大图”

接下来,编写 JavaScript代码,添加鼠标经过与移出事件,完成遮罩和局部放大图的显示与隐藏,具体代码如下

<script>
function $(id){ // 根据id值获取元素对象
return document.getElementById(id);
}
$('smallBox').onmouseover=function(){ // 鼠标经过盒子显示遮罩和大图$('mask').style.display -'block';$('bigBox').style.display = 'block';
};
$('smallBox').onmouseout=function(){// 鼠标离开盒子隐藏遮罩和大图
$('mask').style.display = 'none'; 
$('bigBox').style.display ='none'; 
}; 
</script>

  上述2~4行代码,用于根据id值获取指定的元素对象,第5~12行代码为小图添加 mouseover 和mouseout 事件及其处理程序,并通过修改遮罩和局部放大图的display属性完成显示与隐藏。完成设置后,鼠标经过商品图,就会放大到只有一部分。

(3)遮罩的移动

 下面为小图添加鼠标移动事件,实现遮罩跟着鼠标移动的效果,具体代码如下

$('smal1Box').onmousemove - function (event) ( 
var event = event ll window.event;
// 鼠标在页面中的坐标 
var pageX-event.pageX || event.clientx + document.documentElement.scrollLeft.
var pageY-event.pageY || event.clientY + document.documentElement.scrollTop; 
// 计算鼠标的位置距盒子的距离 
var boxx - pagex - $("box') .offsetleft;
var boxY = pageY - $('box').offsetTop; 
// 计算迷罩的位置 
var maskx - boxx - $(mask'l.offsetwidth / 2; 
var masky = boxY - $('mask').offsetHeight / 2;
// 修改遮罩的显示位置 
('mask').style.left = maskX + 'px'; 
$('mask').style.top = masky + 'px';
};

  上述第 4~8行代码用于计算鼠标移动时距商品图左上角的距离(left和top值)。同时为了查看鼠标经过周围区域的图片,通过第1011行代码,利用鼠标距离图片的位置减去遮罩宽高的二分之一的方式,计算鼠标经过后遮罩的显示位置。第 13~14行代码用于鼠标移动,修改造罩的显示位置。

(4)限定遮罩的可移动范围

从效果图可以看出,鼠标在移动时,遮罩会移出图片的显示区域。因此,接来需要对遮罩的可移动范围进行限定。在第(3)步的第 11 行下添加以下代码。

if(maskx<0)1 // 限定遮罩横向最小的可移动距离为0
maskX=0;
}
//限定横向最大的移动距离不能不超过图片的宽度减去遮罩的宽度
if (maskX >$('smallBox').offsetWidth - $('mask’).offsetwidth) {
maskX - $('smallBox').offsetWidth - s(mask') .offsetwidth
}
if(maskY<0){ //限定遮罩纵向最小的可移动距离为0 
masky=0;10
}
//限定纵向最大的移动离不能不超过图片的高度减去遮罩的高度
if (maskY > $(smallBox').offsetHeight - $('mask").offsetheight){
maskY -$('smallBox').offsetHeight -$('mask').offsetHeight;
}

  上述第1~3行和第8~10行代码用于鼠标滑过商品图左侧和顶部边缘时,限定遮罩在商品图上最小的可移动距离。效果如图 8-23 左侧所示。上述第5~7和第12~14行代码用于设置鼠标滑过商品图右侧和底部边缘时,限定遮罩在商品图上最大的可移动距离。

(5)按照比例移动大图

最后,按照遮罩在商品图(小图)中的显示位置,按比例地在大图中完成相应区域的展示。接下来,在第(3)步的第14行后添加以下代码

//大图片能够移动的总距离=大图的宽度-大盒子的宽度
var bigImgToMove = $('bigImg').offsetwidth - $(bigBox') .offsetwidt	
//遮罩能够移动的总距离=小盒子的宽度-遮罩的宽度
var maskToMove = $('smallBox') .offsetWidth -$('mask').offsetwidth;
//计算移动比例rate=大图片能够移动的总距离/遮罩能够移动的总距离
var rate=bigImgToMove/ maskToMove;
//设置大图片当前的位置=rate*遮罩当前的位置
$('bigImg') .style.left = - rate * maskX + 'px';
$('bigImg') .style.top = - rate * maskY + 'px';

  上述第1~6行代码用于计算大图与遮罩可移动距离的比例值rate第8~9行代码根据与遮罩的位置计算出大图的显示位置。需要注意的是,遮罩与大图的移动方向相反,因此在时需要添加负号(-)。完成上述操作后,移动鼠标,即可看到图片放大特效。

posted @ 2022-05-12 14:41  一马当先G  阅读(641)  评论(0编辑  收藏  举报