当前位置:首页 > 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样式

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

js实现放大镜效果

.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';
});

高级优化方案

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

js实现放大镜效果

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优化动画性能:

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);
  }
});

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

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

相关文章

vue实现翻页效果

vue实现翻页效果

Vue实现翻页效果的方法 使用v-for和计算属性 通过计算属性动态计算当前页显示的数据,结合v-for渲染分页内容。定义currentPage和pageSize控制分页逻辑。 <templa…

h5如何实现vr效果

h5如何实现vr效果

使用WebXR API实现VR效果 WebXR是浏览器中实现VR/AR的核心API,支持设备姿态追踪、渲染交互等功能。需在支持WebXR的设备(如Oculus、HTC Vive)或浏览器模拟环境中运行…

vue实现弹幕效果

vue实现弹幕效果

实现弹幕效果的基本思路 在Vue中实现弹幕效果,通常需要结合CSS动画和动态数据渲染。弹幕的核心是让文字从右向左平滑移动,同时支持多行显示和碰撞检测。 使用CSS动画实现移动效果 通过CSS的@ke…

vue实现多选效果

vue实现多选效果

Vue 实现多选效果的方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选效果。适用于复选框组(checkbox)或下拉多选(select multi…

vue实现分页效果

vue实现分页效果

使用Element UI实现分页 安装Element UI库后,可以直接使用el-pagination组件。需要在Vue项目中引入并注册Element UI。 <template>…

vue实现选中效果

vue实现选中效果

实现选中效果的方法 在Vue中实现选中效果可以通过多种方式,常见的有使用v-bind:class动态绑定类名、利用v-model与表单元素结合,或通过状态管理控制选中样式。以下是几种典型实现方案:…