前端商品放大镜效果的实现
1.预期效果
效果描述:当鼠标在商品上时,显示商品的放大图,并使其跟随鼠标移
2.代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.preview {
position: relative;
height: 398px;
width: 398px;
border: 1px solid gainsboro;
margin: 100px 100px;
}
.preview img {
position: absolute;
top: 0;
left: 0;
}
.preview .mask {
display: none;
position: absolute;
top: 0;
left: 0;
height: 200px;
width: 200px;
background-color: rgba(255, 255, 0, 0.493);
cursor: move;
}
.preview .enlarge {
display: none;
position: absolute;
top: 0;
left: 410px;
overflow: hidden;
width: 500px;
height: 500px;
border: 1px solid gainsboro;
z-index: 99;
}
.preview .enlarge img {
position: absolute;
top: 0;
left: 0;
}
</style>
</head>
<body>
<div class="preview">
<img src="images/s3.png"> <!--使用时需要自己引入图片-->
<div class="mask"></div>
<div class="enlarge">
<img src="images/big.jpg" class="enlarge_img"> <!--使用时需要自己引入图片-->
</div>
</div>
<script>
var preview = document.querySelector('.preview');
var mask = document.querySelector('.mask');
var enlarge = document.querySelector('.enlarge');
var enlarge_img = document.querySelector('.enlarge_img');
preview.addEventListener('mouseover',function(e){
mask.style.display = 'block';
enlarge.style.display = 'block';
preview.addEventListener('mousemove',function(e){
var x = e.pageX - this.offsetLeft;
var y = e.pageY - this.offsetTop;
var moveX = x - mask.offsetWidth/2;
var moveY = y - mask.offsetHeight/2;
if(moveX <= 0){
moveX = 0;
}else if (moveX >= (preview.offsetWidth - mask.offsetWidth)){
moveX = preview.offsetWidth - mask.offsetWidth;
}
if(moveY <= 0){
moveY = 0;
}else if (moveY >= (preview.offsetHeight - mask.offsetHeight)){
moveY = preview.offsetHeight - mask.offsetHeight;
}
mask.style.left = moveX + 'px';
mask.style.top = moveY + 'px';
var maskMax = preview.offsetWidth - mask.offsetWidth;
var enlargeMax = enlarge_img.offsetWidth - enlarge.offsetWidth;
var enlargeMoveX = (moveX * enlargeMax)/maskMax;
var enlargeMoveY = (moveY * enlargeMax)/maskMax;
enlarge_img.style.left = -enlargeMoveX + 'px';
enlarge_img.style.top = -enlargeMoveY + 'px';
});
});
preview.addEventListener('mouseout',function(){
mask.style.display = 'none';
enlarge.style.display = 'none';
})
</script>
</body>
</html>