原生canvas 可以实现 ,但是用的 konva 库, 不知道怎么做了就 需求是 需要想百度地图 高德地图哪种类似的 以所选区域为中心缩放 [https://codesandbox.io/s/affectionate-resonance-2f7lhn?file=/...](https://link.segmentfault.com/?enc=meYWzb9QIseAAc2IP%2BEyEQ%3D%3D.EeYvE9tlpVgDs4qT5ifROb9WCFzOYpWFWk4698k2MudaJlbOS14caLrBx4u5zf6OJPLofP%2BsWS3kVKMs%2FkrdnymE7n%2FhQ7j3RMwipYBw%2FQI%3D) import { useEffect, useRef, useState } from "react" import { useSelector } from "react-redux" import { Stage, Layer, Group, Image } from "react-konva" import { vec2 } from "gl-matrix" import styled from "styled-components" import Konva from "konva" import useImage from "use-image" import type { KonvaEventObject } from "konva/lib/Node" import type { RootState } from "@/stores" const ScStage = styled(Stage)` width: 100%; height: calc(100% - 100px); overflow: hidden; ` const StageContainer2 = () => { const { imgUrl } = useSelector((state: RootState) => state.measure) const { cursor } = useSelector((state: RootState) => state.cursor) const { lateral } = useSelector((state: RootState) => state.showPoint) const { rotate, scaleX, contrast, brightness } = useSelector((state: RootState) => state.transform) const [scale, setScale] = useState(1) const [width, setWidth] = useState(1000) const [height, setHeight] = useState(1000) const [image] = useImage(imgUrl) const stageRef = useRef(null) const layerRef = useRef(null) const imageRef = useRef(null) const [offsetX, setOffsetX] = useState(0) const [offsetY, setOffsetY] = useState(0) const max = 4 // 放大最大的比例 const min = 0.5 // 缩小最小的比例 const step = 0.03 // 每次缩放的比例 function onWheel(e: KonvaEventObject) { const x = e.evt.offsetX const y = e.evt.offsetY const offsetX = (x - layerRef.current.offsetX()) * layerRef.current.scaleX() / (layerRef.current.scaleX() - step) - (x - layerRef.current.offsetX()) const offsetY = (y - layerRef.current.offsetY()) * layerRef.current.scaleY() / (layerRef.current.scaleY() - step) - (y - layerRef.current.offsetY()) // 这里写的不是很对 if (e.evt.wheelDelta && e.evt.wheelDelta > 0) { // 放大 if (layerRef.current.scaleX() min && layerRef.current.scaleY() > min) { layerRef.current.scaleX(layerRef.current.scaleX() - step) layerRef.current.scaleY(layerRef.current.scaleY() - step) layerRef.current.move({ x: offsetX, y: offsetY }) // 跟随鼠标偏移位置 } } // const stage = e.target.getStage() // const mousePos = stage?.getPointerPosition()! // // const imagePos = imageRef.current?.position()! } useEffect(() => { const stage = stageRef.current?.getStage() const stageWrapper = stageRef.current!.attrs.container setStageSize() function setStageSize() { stage?.width(stageWrapper.clientWidth) stage?.height(stageWrapper.clientHeight) setWidth(stageWrapper.clientWidth) setHeight(stageWrapper.clientHeight) } }, [stageRef]) return ( {lateral && ( )} ) } export default StageContainer2