当前位置:首页 > JavaScript

js实现放大镜效果

2026-04-04 23:14:23JavaScript

实现放大镜效果的基本思路

放大镜效果通常用于电商网站展示商品细节。核心原理是通过监听鼠标移动事件,同步显示放大区域的图像。

HTML结构

创建一个包含原图和放大镜区域的容器:

<div class="magnifier-container">
  <img src="original.jpg" id="originalImg">
  <div class="magnifier"></div>
</div>

CSS样式

设置基本样式和放大镜外观:

.magnifier-container {
  position: relative;
  width: 500px;
  height: 500px;
}

#originalImg {
  width: 100%;
  height: auto;
}

.magnifier {
  position: absolute;
  width: 150px;
  height: 150px;
  border: 3px solid #fff;
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(0,0,0,0.5);
  background-repeat: no-repeat;
  display: none;
  pointer-events: none;
}

JavaScript实现

监听鼠标事件并计算放大区域:

const originalImg = document.getElementById('originalImg');
const magnifier = document.querySelector('.magnifier');
const zoomLevel = 2; // 放大倍数

originalImg.addEventListener('mousemove', (e) => {
  magnifier.style.display = 'block';

  const {left, top, width, height} = originalImg.getBoundingClientRect();
  const x = e.pageX - left;
  const y = e.pageY - top;

  // 限制放大镜不超出图像边界
  const magnifierWidth = magnifier.offsetWidth;
  const magnifierHeight = magnifier.offsetHeight;

  let posX = x - magnifierWidth/2;
  let posY = y - magnifierHeight/2;

  posX = Math.max(0, Math.min(posX, width - magnifierWidth));
  posY = Math.max(0, Math.min(posY, height - magnifierHeight));

  magnifier.style.left = `${posX}px`;
  magnifier.style.top = `${posY}px`;

  // 计算放大背景位置
  const bgX = -posX * zoomLevel;
  const bgY = -posY * zoomLevel;

  magnifier.style.backgroundImage = `url(${originalImg.src})`;
  magnifier.style.backgroundSize = `${width * zoomLevel}px ${height * zoomLevel}px`;
  magnifier.style.backgroundPosition = `${bgX}px ${bgY}px`;
});

originalImg.addEventListener('mouseleave', () => {
  magnifier.style.display = 'none';
});

高级优化方案

对于更流畅的体验,可以预加载放大后的图像:

const zoomImg = new Image();
zoomImg.src = 'large-image.jpg';

// 在mousemove事件中使用zoomImg代替originalImg
magnifier.style.backgroundImage = `url(${zoomImg.src})`;

响应式处理

添加窗口大小变化时的调整:

window.addEventListener('resize', () => {
  const {width, height} = originalImg.getBoundingClientRect();
  magnifier.style.backgroundSize = `${width * zoomLevel}px ${height * zoomLevel}px`;
});

性能优化

使用requestAnimationFrame优化动画性能:

js实现放大镜效果

let lastX = 0, lastY = 0;
let rafId = null;

const updateMagnifier = () => {
  const {left, top, width, height} = originalImg.getBoundingClientRect();
  const bgX = -lastX * zoomLevel;
  const bgY = -lastY * zoomLevel;

  magnifier.style.backgroundPosition = `${bgX}px ${bgY}px`;
  rafId = null;
};

originalImg.addEventListener('mousemove', (e) => {
  // ...其他代码

  lastX = posX;
  lastY = posY;

  if (!rafId) {
    rafId = requestAnimationFrame(updateMagnifier);
  }
});

这些代码实现了一个基础的放大镜效果,可以根据实际需求调整放大倍数、放大镜形状和尺寸等参数。

标签: 放大镜效果
分享给朋友:

相关文章

js放大镜的实现原理

js放大镜的实现原理

放大镜效果的基本原理 放大镜效果的核心是通过鼠标移动事件获取当前光标位置,动态计算放大区域的显示范围和比例。通常需要两个元素:原图容器和放大镜显示的容器。当鼠标在原图上移动时,放大镜容器显示对应位置的…

vue 实现分页效果

vue 实现分页效果

使用 Element UI 实现分页 Element UI 提供了现成的分页组件 el-pagination,适合快速集成到 Vue 项目中。 安装 Element UI: npm install…

vue 实现toogle效果

vue 实现toogle效果

使用 v-if 和 v-else 实现切换 通过 Vue 的指令 v-if 和 v-else 可以轻松实现元素的显示与隐藏切换。 <template> <button @c…

vue 实现滑动效果

vue 实现滑动效果

Vue 实现滑动效果的方法 使用 CSS Transition 通过 Vue 的 v-if 或 v-show 结合 CSS Transition 实现滑动效果。定义一个 CSS 类,利用 transf…

vue 实现动画效果

vue 实现动画效果

Vue 实现动画效果的方法 Vue 提供了多种方式实现动画效果,包括内置的过渡系统、第三方动画库以及 CSS 动画。以下是几种常见的方法: 使用 Vue 内置过渡系统 Vue 的 <trans…

vue实现gif效果

vue实现gif效果

Vue 中实现 GIF 效果的方法 在 Vue 中实现 GIF 效果可以通过多种方式完成,以下是几种常见的方法: 直接使用 GIF 图片 将 GIF 图片作为静态资源引入,直接在 Vue 模板中使用…