当前位置:首页 > 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缩放图实现

vue缩放图实现

实现 Vue 缩放图功能 在 Vue 中实现图片缩放功能可以通过第三方库或自定义逻辑完成。以下是几种常见方法: 使用 vue-zoomer 库 安装依赖: npm install vue-zoo…

vue 实现展开缩放

vue 实现展开缩放

在Vue中实现展开和缩放效果可以通过多种方式完成,以下是几种常见的方法: 使用CSS过渡和Vue的v-if或v-show指令 通过结合CSS过渡效果和Vue的条件渲染指令,可以实现平滑的展开和缩放…

vue 实现页面缩放

vue 实现页面缩放

Vue 实现页面缩放的方法 使用 CSS transform 缩放 在 Vue 组件的样式中添加 transform 属性,通过 scale 控制缩放比例。可以通过动态绑定 style 或 class…

vue实现缩放插件

vue实现缩放插件

Vue 实现缩放插件的方法 使用 vue-zoomable 插件 安装 vue-zoomable 插件: npm install vue-zoomable --save 在 Vue 组件中引入并使用…

vue 实现界面缩放

vue 实现界面缩放

Vue 实现界面缩放的方法 使用 CSS transform 缩放 在 Vue 组件中,可以通过 CSS 的 transform: scale() 属性实现整体缩放效果。创建一个响应式的缩放比例变量,…

vue实现点击缩放菜单

vue实现点击缩放菜单

Vue实现点击缩放菜单的方法 使用Vue实现点击缩放菜单可以通过CSS过渡效果和Vue的数据绑定功能来实现。以下是几种常见的实现方式: 使用v-show和CSS过渡 在Vue组件中定义一个数据属性…