当前位置:首页 > React

react实现图片缩放

2026-01-27 01:11:14React

使用 react-transform-zoom-pan 库

安装 react-transform-zoom-pan 库:

npm install react-transform-zoom-pan

创建一个可缩放和拖拽的图片组件:

import { TransformWrapper, TransformComponent } from "react-transform-zoom-pan";

function ZoomableImage({ src }) {
  return (
    <TransformWrapper>
      <TransformComponent>
        <img src={src} alt="zoomable" />
      </TransformComponent>
    </TransformWrapper>
  );
}

使用 CSS transform 实现缩放

通过状态管理缩放比例,使用 CSS transform 属性实现缩放效果:

react实现图片缩放

import { useState } from 'react';

function ZoomableImage({ src }) {
  const [scale, setScale] = useState(1);

  return (
    <div>
      <div style={{ transform: `scale(${scale})`, transformOrigin: '0 0' }}>
        <img src={src} alt="zoomable" />
      </div>
      <button onClick={() => setScale(scale + 0.1)}>Zoom In</button>
      <button onClick={() => setScale(scale - 0.1)}>Zoom Out</button>
    </div>
  );
}

使用 react-zoom-pan-pinch 库

安装 react-zoom-pan-pinch 库:

npm install react-zoom-pan-pinch

实现带有平移和缩放功能的图片组件:

react实现图片缩放

import { TransformWrapper, TransformComponent } from "react-zoom-pan-pinch";

function ZoomableImage({ src }) {
  return (
    <TransformWrapper>
      {({ zoomIn, zoomOut, resetTransform }) => (
        <>
          <div className="tools">
            <button onClick={() => zoomIn()}>Zoom In</button>
            <button onClick={() => zoomOut()}>Zoom Out</button>
            <button onClick={() => resetTransform()}>Reset</button>
          </div>
          <TransformComponent>
            <img src={src} alt="zoomable" />
          </TransformComponent>
        </>
      )}
    </TransformWrapper>
  );
}

实现鼠标滚轮缩放

监听 wheel 事件实现滚轮缩放效果:

import { useState, useRef } from 'react';

function ZoomableImage({ src }) {
  const [scale, setScale] = useState(1);
  const imageRef = useRef(null);

  const handleWheel = (e) => {
    e.preventDefault();
    const delta = e.deltaY > 0 ? -0.1 : 0.1;
    setScale(prev => Math.max(0.1, prev + delta));
  };

  return (
    <div onWheel={handleWheel} ref={imageRef}>
      <img 
        src={src} 
        alt="zoomable" 
        style={{ 
          transform: `scale(${scale})`,
          transformOrigin: '0 0',
          width: '100%'
        }} 
      />
    </div>
  );
}

实现双击缩放

添加双击事件实现快速缩放:

function ZoomableImage({ src }) {
  const [scale, setScale] = useState(1);

  const handleDoubleClick = () => {
    setScale(scale === 1 ? 2 : 1);
  };

  return (
    <div onDoubleClick={handleDoubleClick}>
      <img 
        src={src} 
        alt="zoomable" 
        style={{ 
          transform: `scale(${scale})`,
          transformOrigin: '0 0',
          cursor: 'zoom-in'
        }} 
      />
    </div>
  );
}

实现触摸屏捏合缩放

处理 touch 事件实现移动设备上的捏合缩放:

function ZoomableImage({ src }) {
  const [scale, setScale] = useState(1);
  const [initialDistance, setInitialDistance] = useState(null);

  const handleTouchStart = (e) => {
    if (e.touches.length === 2) {
      setInitialDistance(getDistance(e.touches[0], e.touches[1]));
    }
  };

  const handleTouchMove = (e) => {
    if (e.touches.length === 2) {
      e.preventDefault();
      const currentDistance = getDistance(e.touches[0], e.touches[1]);
      if (initialDistance) {
        const newScale = (currentDistance / initialDistance) * scale;
        setScale(Math.max(0.5, Math.min(newScale, 3)));
      }
    }
  };

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

  return (
    <div 
      onTouchStart={handleTouchStart}
      onTouchMove={handleTouchMove}
      onTouchEnd={() => setInitialDistance(null)}
    >
      <img 
        src={src} 
        alt="zoomable" 
        style={{ 
          transform: `scale(${scale})`,
          transformOrigin: '0 0',
          touchAction: 'none'
        }} 
      />
    </div>
  );
}

标签: 缩放图片
分享给朋友:

相关文章

vue实现组件循环图片

vue实现组件循环图片

Vue 实现组件循环图片的方法 在 Vue 中实现组件循环图片通常可以通过 v-for 指令结合动态数据绑定完成。以下是几种常见的实现方式: 使用静态图片路径数组 假设有一组本地图片路径,可以通过数…

react如何引用图片

react如何引用图片

在React中引用图片的方法 使用import直接引入图片 在React组件中,可以通过import语句将图片作为模块引入。这种方式适合在组件内部使用图片,Webpack会处理图片的路径和打包。 i…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

vue实现图片加载

vue实现图片加载

Vue 实现图片加载的方法 在 Vue 中实现图片加载可以通过多种方式,以下是一些常见的方法: 使用 v-bind 绑定图片路径 通过 v-bind 动态绑定图片路径,可以灵活地加载本地或远程图片。…

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…

js实现图片拖拽

js实现图片拖拽

实现图片拖拽的基本步骤 HTML 结构需要包含可拖拽的图片元素,并设置 draggable 属性为 true: <img id="dragImage" src="image.jpg" drag…