沃梦达 / IT编程 / 前端开发 / 正文

JavaScript实现图片放大镜效果

下面我将为您详细讲解如何用JavaScript实现图片放大镜效果。

下面我将为您详细讲解如何用JavaScript实现图片放大镜效果。

1. 需求分析

首先,我们需要分析一下需要实现的效果和要实现的功能。放大镜效果通常是这样的:当鼠标悬浮在图片上时,图片中心出现一个放大的镜头,显示鼠标所在位置周围的图像细节。因此,我们需要实现以下功能:

  1. 鼠标在图片上移动时,更新放大镜镜头的位置和内容;
  2. 根据鼠标位置,在放大镜镜头周围显示放大的图片区域。

2. HTML布局

我们需要在HTML中定义图片元素和放大镜镜头元素。示例代码如下:

<div class="container">
  <div class="img-container">
    <img src="image.jpg" alt="">
    <div class="zoom"></div>
  </div>
  <div class="zoomed">
    <img src="image.jpg" alt="">
  </div>
</div>

其中,img-container是包含图片和放大镜的容器,zoom是放大镜镜头元素,zoomed是显示放大图片的容器。

3. CSS样式

我们需要用CSS对上述HTML元素进行样式设置。示例代码如下:

.container {
  position: relative;
  width: 500px;
  height: 400px;
}
.img-container {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.zoom {
  position: absolute;
  width: 100px;
  height: 100px;
  border-radius: 50%;
  border: 2px solid #fff;
  opacity: 0;
  pointer-events: none;
}
.zoomed {
  position: absolute;
  width: 300px;
  height: 300px;
  overflow: hidden;
  top: 0;
  left: 520px;
  border: 2px solid #fff;
  border-radius: 5px;
  box-shadow: 0 0 5px 2px rgba(0,0,0,0.2);
}
.zoomed img {
  position: absolute;
  top: 0;
  left: 0;
}

其中,给图片容器设置overflow: hidden可以保证放大镜镜头显示在容器内,并隐藏周围的放大后图片区域;放大镜镜头设置opacity: 0可以使其一开始不可见;放大后图片容器通过position: absoluteleft属性进行定位。

4. JavaScript实现

接下来,我们需要用JavaScript对HTML元素进行操作,实现放大镜效果。示例代码如下:

var container = document.querySelector('.container');
var imgContainer = document.querySelector('.img-container');
var zoom = document.querySelector('.zoom');
var zoomed = document.querySelector('.zoomed');
var zoomedImg = document.querySelector('.zoomed img');
var imgWidth = imgContainer.offsetWidth;
var imgHeight = imgContainer.offsetHeight;
var zoomWidth = zoom.offsetWidth;
var zoomHeight = zoom.offsetHeight;
var zoomedWidth = zoomed.offsetWidth;
var zoomedHeight = zoomed.offsetHeight;

imgContainer.addEventListener('mousemove', function(e) {
  // 计算放大镜镜头位置
  var posX = e.pageX - container.offsetLeft;
  var posY = e.pageY - container.offsetTop;
  var xPercent = posX / imgWidth;
  var yPercent = posY / imgHeight;
  var zoomX = posX - zoomWidth / 2;
  var zoomY = posY - zoomHeight / 2;

  // 更新放大镜镜头位置和内容
  zoom.style.left = zoomX + 'px';
  zoom.style.top = zoomY + 'px';
  zoom.style.opacity = 1;
  zoomedImg.style.left = -xPercent * (zoomedWidth - zoomWidth) + 'px';
  zoomedImg.style.top = -yPercent * (zoomedHeight - zoomHeight) + 'px';
});

imgContainer.addEventListener('mouseleave', function(e) {
  // 鼠标离开图片容器时隐藏放大镜
  zoom.style.opacity = 0;
});

这段JavaScript代码实现了以下功能:

  1. 监听图片容器的mousemove事件,实时计算放大镜镜头位置,更新放大镜镜头和放大后的图片区域;
  2. 监听图片容器的mouseleave事件,隐藏放大镜。

5. 示例说明

下面,我们通过两个示例对这个图片放大镜效果进行演示。

示例一:木板样式

HTML代码:

<div class="container">
  <div class="img-container">
    <img src="https://i.ibb.co/Rp8LxnT/wood.jpg" alt="">
    <div class="zoom"></div>
  </div>
  <div class="zoomed">
    <img src="https://i.ibb.co/Rp8LxnT/wood.jpg" alt="">
  </div>
</div>

CSS代码:

.container {
  position: relative;
  width: 500px;
  height: 400px;
}
.img-container {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.zoom {
  position: absolute;
  width: 100px;
  height: 100px;
  border-radius: 50%;
  border: 2px solid #f5c299;
  opacity: 0;
  pointer-events: none;
}
.zoomed {
  position: absolute;
  width: 300px;
  height: 300px;
  overflow: hidden;
  top: 0;
  left: 520px;
  border: 2px solid #f5c299;
  border-radius: 5px;
  box-shadow: 0 0 5px 2px rgba(0,0,0,0.2);
}
.zoomed img {
  position: absolute;
  top: 0;
  left: 0;
}

效果演示:https://codepen.io/lovelykevin/pen/xxWZVXK

示例二:各类糖果

HTML代码:

<div class="container">
  <div class="img-container">
    <img src="https://i.ibb.co/RQ8G5Vt/candies.jpg" alt="">
    <div class="zoom"></div>
  </div>
  <div class="zoomed">
    <img src="https://i.ibb.co/RQ8G5Vt/candies.jpg" alt="">
  </div>
</div>

CSS代码:

.container {
  position: relative;
  width: 500px;
  height: 400px;
}
.img-container {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.zoom {
  position: absolute;
  width: 100px;
  height: 100px;
  border-radius: 50%;
  border: 2px solid #e6478b;
  opacity: 0;
  pointer-events: none;
}
.zoomed {
  position: absolute;
  width: 300px;
  height: 300px;
  overflow: hidden;
  top: 0;
  left: 520px;
  border: 2px solid #e6478b;
  border-radius: 5px;
  box-shadow: 0 0 5px 2px rgba(0,0,0,0.2);
}
.zoomed img {
  position: absolute;
  top: 0;
  left: 0;
}

效果演示:https://codepen.io/lovelykevin/pen/bGRaxeP

6. 结束语

通过以上的实现,我们成功地用JavaScript实现了图片放大镜效果,并在线上两个示例中展示了效果。随着一步步地理解,你也可以更好地掌握这个效果,根据自己的需求进行代码的调整和扩展。

本文标题为:JavaScript实现图片放大镜效果