包含: 拖拽 + 鼠标缩放

使用方式
1. imgChange代码
import { useState, useRef, useEffect } from 'react';
import { Button, Space } from "antd";
const Index = (props: any) => {
const drag = (obj: any, set: any) => {
obj.onmousedown = (event: any) => {
event = event || window.event;
event.preventDefault();
obj.style.cursor = "grabbing";
var maxMoveX = obj.clientWidth - 100;
var maxMoveY = obj.clientHeight - 100;
var ol = event.clientX - obj.offsetLeft;
var ot = event.clientY - obj.offsetTop;
document.onmousemove = (event2) => {
event2 = event2 || window.event;
var left = event2.clientX - ol;
var top = event2.clientY - ot;
if (left >= maxMoveX) {
left = maxMoveX;
} else if (left <= (-maxMoveX)) {
left = -maxMoveX;
}
if (top >= maxMoveY) {
top = maxMoveY;
} else if (top <= (-maxMoveY)) {
top = -maxMoveY;
}
set({ left, top });
}
document.onmouseup = () => {
document.onmousemove = null;
document.onmouseup = null;
obj.style.cursor = "grab";
}
}
const scrollEvent = () => {
window.scrollTo(0, 0)
document.documentElement.style.position = 'fixed';
}
obj.addEventListener('mouseenter', () => {
document.addEventListener('scroll', scrollEvent)
})
obj.addEventListener('mouseleave', () => {
document.documentElement.style.position = 'static';
document.removeEventListener('scroll', scrollEvent)
})
obj.onmousewheel = function (event: any) {
if (event.wheelDelta > 0) {
console.log("向上滚动");
imgToSizeAdd()
}
if (event.wheelDelta < 0) {
console.log("向下滚动");
imgToSizeMinus()
}
}
}
const container = useRef(null);
const url = props.url
const [transform, setTransform] = useState('')
const [current, setCurrent] = useState(0);
const [xyzTwo, setXyzTwo] = useState({ left: 0, top: 0 });
const [zoom, setZoom] = useState('100%')
useEffect(() => {
if (container) drag(container.current, setXyzTwo);
}, [zoom]);
const imgToSizeAdd = () => {
let a = parseInt(zoom) + (4) + '%';
console.log('放大', a);
setZoom(a)
}
const imgToSizeMinus = () => {
if (zoom == '60%') return
let a = parseInt(zoom) + (-4) + '%';
console.log('缩小', zoom);
setZoom(a)
}
const restore = () => {
setZoom('100%')
setXyzTwo({ left: 0, top: 0 })
setTransform('')
setCurrent(0)
}
const imgRoll = () => {
let a = (current - 90) % 360;
setTransform('rotate(' + a + 'deg)')
setCurrent(a)
}
const imgRoll2 = () => {
let a = (current + 90) % 360;
setTransform('rotate(' + a + 'deg)')
setCurrent(a)
}
return (
<>
<div style={{ width: '100%', display: 'flex', justifyContent: 'center' }}>
<Space>
<Button onClick={imgToSizeAdd}>放大</Button>
<Button onClick={imgToSizeMinus}>缩小</Button>
<Button onClick={restore}>还原</Button>
<Button onClick={imgRoll}>左旋90度</Button>
<Button onClick={imgRoll2}>右旋90度</Button>
</Space>
</div>
<div
style={{ width: '100%', height: '400px', overflow: "hidden", textAlign: 'center' }}
>
<img
ref={container}
src={url}
style={{
height: '400px',
position: "relative",
cursor: "grab",
left: xyzTwo.left,
top: xyzTwo.top,
zoom: zoom,
transform: transform
}}
/>
</div>
</>
);
};
export default Index;
2. 使用


3. 推荐库
infeng.github.io/react-viewe…
zmage.caldis.me/