当前位置:首页 > JavaScript

js原声实现缩放

2026-01-30 23:29:36JavaScript

原生JavaScript实现缩放功能

通过监听鼠标事件和触摸事件,结合CSS的transform属性实现元素的缩放效果。以下代码示例展示如何实现基于鼠标滚轮和触摸手势的缩放。

HTML结构

<div id="zoom-container" style="width: 500px; height: 500px; border: 1px solid #ccc;">
  <img id="zoom-target" src="image.jpg" style="transform-origin: 0 0;">
</div>

核心JavaScript代码

js原声实现缩放

const target = document.getElementById('zoom-target');
const container = document.getElementById('zoom-container');
let scale = 1;
const minScale = 0.5;
const maxScale = 3;

// 鼠标滚轮缩放
container.addEventListener('wheel', (e) => {
  e.preventDefault();
  const delta = -e.deltaY * 0.01;
  applyZoom(delta, e.clientX, e.clientY);
});

// 触摸手势缩放(移动端)
let touchDistance = 0;
container.addEventListener('touchstart', (e) => {
  if (e.touches.length === 2) {
    touchDistance = getDistance(e.touches[0], e.touches[1]);
  }
});

container.addEventListener('touchmove', (e) => {
  if (e.touches.length === 2) {
    e.preventDefault();
    const newDistance = getDistance(e.touches[0], e.touches[1]);
    const delta = (newDistance - touchDistance) * 0.01;
    const centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2;
    const centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2;
    applyZoom(delta, centerX, centerY);
    touchDistance = newDistance;
  }
});

function getDistance(touch1, touch2) {
  return Math.hypot(
    touch2.clientX - touch1.clientX,
    touch2.clientY - touch1.clientY
  );
}

function applyZoom(delta, x, y) {
  const rect = container.getBoundingClientRect();
  const offsetX = x - rect.left;
  const offsetY = y - rect.top;

  const newScale = Math.min(maxScale, Math.max(minScale, scale + delta));
  if (newScale === scale) return;

  // 计算缩放中心点相对位置
  const originX = offsetX / scale;
  const originY = offsetY / scale;

  target.style.transform = `scale(${newScale}) translate(${(1 - newScale/scale) * originX}px, ${(1 - newScale/scale) * originY}px)`;
  scale = newScale;
}

实现原理说明

坐标转换计算 缩放时保持鼠标位置作为中心点的关键公式:

  • 计算当前鼠标位置相对于元素的比例位置: [ originX = \frac{offsetX}{currentScale} ]
  • 计算新缩放比例下的位移补偿: [ translateX = (1 - \frac{newScale}{currentScale}) \times originX ]

触摸手势处理 通过两点触摸的初始距离和移动距离差值计算缩放比例,使用两点中点作为缩放中心。

js原声实现缩放

扩展功能建议

限制平移范围 添加边界检查防止元素被完全移出视图:

function checkBoundaries() {
  const matrix = new DOMMatrix(target.style.transform);
  const currentX = matrix.m41;
  const currentY = matrix.m42;

  // 根据实际需求设置边界值
  const maxX = container.clientWidth * (1 - 1/scale);
  const maxY = container.clientHeight * (1 - 1/scale);

  target.style.transform = `scale(${scale}) translate(${Math.min(0, Math.max(-maxX, currentX))}px, ${Math.min(0, Math.max(-maxY, currentY))}px)`;
}

动画平滑过渡 添加CSS过渡效果使缩放更平滑:

#zoom-target {
  transition: transform 0.1s ease-out;
}

重置缩放按钮 添加重置功能按钮:

document.getElementById('reset-btn').addEventListener('click', () => {
  scale = 1;
  target.style.transform = 'scale(1) translate(0, 0)';
});

以上实现方案适用于大多数需要缩放功能的场景,可根据具体需求调整参数和交互细节。

标签: 缩放原声
分享给朋友:

相关文章

vue实现easyui缩放

vue实现easyui缩放

Vue 实现 EasyUI 缩放功能 要在 Vue 中实现类似 EasyUI 的缩放功能,可以通过以下步骤完成。EasyUI 是一个基于 jQuery 的 UI 框架,而 Vue 是一个现代化的前端框…

原声js实现响应式布局

原声js实现响应式布局

使用原生JavaScript实现响应式布局 响应式布局的核心是根据不同屏幕尺寸动态调整页面元素的样式。原生JavaScript可以通过监听窗口变化、操作DOM和修改CSS属性来实现。 监听窗口尺寸变…

jquery 缩放

jquery 缩放

jQuery 缩放元素的方法 使用 jQuery 实现元素的缩放可以通过 CSS transform 属性或直接调整元素的 width 和 height 属性。以下是几种常见的实现方式: 通过 CS…

uniapp 页面缩放

uniapp 页面缩放

uniapp 页面缩放实现方法 在uniapp中实现页面缩放功能,可以通过以下几种方式实现: 使用CSS transform属性 通过CSS的transform属性实现缩放效果,适用于静态页面或简单…

vue实现网页缩放

vue实现网页缩放

实现网页缩放的Vue方案 使用CSS transform缩放 通过CSS的transform: scale()属性实现整体缩放,适合需要等比缩放整个页面的场景。 <template>…

vue实现缩放插件

vue实现缩放插件

Vue实现缩放插件的方法 在Vue中实现缩放功能可以通过多种方式完成,以下是几种常见的方法: 使用CSS transform属性 通过CSS的transform: scale()属性可以实现简单的缩…