当前位置:首页 > JavaScript

用js实现放大镜效果

2026-01-30 18:07:45JavaScript

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

放大镜效果通常通过监听鼠标移动事件,动态调整放大区域的显示内容和位置。核心逻辑包括:获取鼠标位置、计算放大区域、显示放大后的图像。

HTML 结构准备

创建一个包含原始图片和放大镜容器的HTML结构。放大镜容器用于显示放大后的图像区域。

用js实现放大镜效果

<div class="image-container">
  <img id="original-image" src="your-image.jpg" alt="Original Image">
  <div class="magnifier"></div>
</div>

CSS 样式设置

设置原始图片和放大镜的样式。放大镜通常为圆形或方形,需要绝对定位并隐藏默认显示。

用js实现放大镜效果

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

#original-image {
  width: 100%;
  height: auto;
}

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

JavaScript 实现逻辑

监听鼠标事件,计算放大镜位置和放大后的图像显示。

document.addEventListener('DOMContentLoaded', function() {
  const originalImage = document.getElementById('original-image');
  const magnifier = document.querySelector('.magnifier');
  const zoomLevel = 2; // 放大倍数

  originalImage.addEventListener('mousemove', function(e) {
    // 显示放大镜
    magnifier.style.display = 'block';

    // 获取鼠标位置相对于图片的坐标
    const rect = originalImage.getBoundingClientRect();
    const x = e.pageX - rect.left;
    const y = e.pageY - rect.top;

    // 防止放大镜超出图片边界
    const magnifierWidth = magnifier.offsetWidth;
    const magnifierHeight = magnifier.offsetHeight;

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

    if (posX < 0) posX = 0;
    if (posY < 0) posY = 0;
    if (posX > rect.width - magnifierWidth) posX = rect.width - magnifierWidth;
    if (posY > rect.height - magnifierHeight) posY = rect.height - magnifierHeight;

    // 设置放大镜位置
    magnifier.style.left = `${posX}px`;
    magnifier.style.top = `${posY}px`;

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

    // 设置放大镜背景
    magnifier.style.backgroundImage = `url('${originalImage.src}')`;
    magnifier.style.backgroundSize = `${rect.width * zoomLevel}px ${rect.height * zoomLevel}px`;
    magnifier.style.backgroundPosition = `${bgX}px ${bgY}px`;
  });

  originalImage.addEventListener('mouseout', function() {
    magnifier.style.display = 'none';
  });
});

使用 Canvas 实现高性能放大镜

对于更高性能的需求,可以使用Canvas来渲染放大后的图像。

// 创建Canvas元素
const canvas = document.createElement('canvas');
canvas.className = 'magnifier';
canvas.width = 150;
canvas.height = 150;
document.querySelector('.image-container').appendChild(canvas);
const ctx = canvas.getContext('2d');

// 修改mousemove事件处理
originalImage.addEventListener('mousemove', function(e) {
  canvas.style.display = 'block';

  const rect = originalImage.getBoundingClientRect();
  const x = e.pageX - rect.left;
  const y = e.pageY - rect.top;

  // 计算绘制区域
  const sx = x - canvas.width / (2 * zoomLevel);
  const sy = y - canvas.height / (2 * zoomLevel);
  const sw = canvas.width / zoomLevel;
  const sh = canvas.height / zoomLevel;

  // 清除并重绘Canvas
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.drawImage(
    originalImage,
    sx, sy, sw, sh,
    0, 0, canvas.width, canvas.height
  );

  // 更新Canvas位置
  canvas.style.left = `${x - canvas.width/2}px`;
  canvas.style.top = `${y - canvas.height/2}px`;
});

注意事项

  • 确保图片已完全加载后再绑定事件,可在window.load事件中执行代码
  • 对于响应式设计,需要监听窗口大小变化并重新计算位置
  • 移动端实现需要考虑触摸事件(touchmove)的处理
  • 高性能场景下可使用CSS transform代替直接修改位置属性

以上代码提供了两种实现方式:CSS背景定位和Canvas绘制。CSS方式简单但性能一般,Canvas方式更灵活且性能更好,适合复杂场景。

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

相关文章

vue实现吸附效果

vue实现吸附效果

Vue实现吸附效果的方法 吸附效果通常指页面滚动时,某个元素固定在特定位置(如顶部或底部)。以下是几种实现方式: 使用CSS的position: sticky 通过CSS的sticky定位实现吸附效…

jquery 效果

jquery 效果

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。jQuery 提供了丰富的效果(Effects)功能,可以轻松实现元素的动态显…

h5所能实现的效果

h5所能实现的效果

H5能实现的效果 H5(HTML5)作为最新的HTML标准,具备强大的功能和丰富的API支持,能够实现多种现代Web应用效果。以下是H5的主要能力分类: 多媒体支持 H5原生支持音频和视频播放,无…

h5实现左右滚动效果

h5实现左右滚动效果

使用CSS实现横向滚动 在HTML5中实现左右滚动效果,可以通过CSS的overflow-x属性配合white-space或flex布局实现。以下是一个基础示例: <div class="sc…

react如何添加效果

react如何添加效果

React 添加动画效果的方法 使用 CSS 过渡动画 在 React 组件中直接通过 className 或 style 属性应用 CSS 过渡效果。定义 CSS 类包含 transition 属性…

js实现点击效果

js实现点击效果

实现点击效果的JavaScript方法 使用addEventListener绑定点击事件 通过document.getElementById或document.querySelector获取DOM元素…