iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >react如何实现缩放
  • 947
分享到

react如何实现缩放

2023-07-04 21:07:57 947人浏览 安东尼
摘要

这篇文章主要讲解了“React如何实现缩放”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现缩放”吧!react实现缩放的方法:1、监听onWheel事件;2、设置事件对象ev

这篇文章主要讲解了“React如何实现缩放”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现缩放”吧!

react实现缩放的方法:1、监听onWheel事件;2、设置事件对象event的属性deltaY,当向上滚动时“deltaY<0”,向下滚动时“deltay>0”;3、修改每次滚动时缩放的比例,同时更改transfORM样式按比例进行缩放即可。

react图片缩放、平移(position、transform实现)

很多网页都会给文案附上一些图片补充描述,例如在说到地址时,会在旁边附上一张地图,并且在地图上标注该地址。如果附上的图片很小,很难看清楚地址的具体信息,有些产品经理会给图片设计一个可以平移、放大缩小的功能。本文将一一实现上述功能。

废话不多说,先给上效果图:

react如何实现缩放

主要三个功能点:

  • 图片平移

  • 图片缩放

  • 车站标注

图片平移

图片平移可以监听这三个事件实现:onMouseDown、onMouseMove、onMouseUp
onMouseDown事件记录每次鼠标按下的坐标位置;
onMouseMove事件计算出每次平移的距离,该距离加上拖动前图片距离父元素的距离就等于拖动后图片相对于父元素的距离;
onMouseUp事件触发时,注销或者不让执行onMouseDown、onMouseMove事件,防止只要鼠标移入图片就会平移。

这三个事件需要阻止浏览器的默认行为,不然在移动时会自动打开图片。
react如何实现缩放

const WIDTH = 1200;const HEIGHT = 900;const DynamicStyle= () => {      const imgRef = React.createRef<htmlImageElement>();      const [imgStyle, setImgStyle] = useState<React.CSSProperties>({});    const [mouseDowmFlag, setMouseDowmFlag] = useState(false);    const [mouseDowmPos, setMouseDowmPos] = useState<{x: number, y: number}>({x: 0, y: 0})    useEffect(() => {    document.onmouseover = () => {      if (mouseDowmFlag) {        setMouseDowmFlag(false);      }    };    return () => {      document.onmouseover = null;    };  }, [mouseDowmFlag])    const handleMouseDown = (event: React.MouseEvent<HTMLImageElement>) => {    const { clientX, clientY } = event;    event.stopPropagation();    event.preventDefault(); // 阻止浏览器默认行为,拖动会打开图片    setMouseDowmFlag(true); // 控制只有在鼠标按下后才会执行mousemove    setMouseDowmPos({      x: clientX,      y: clientY,    });  };  const handleMouseMove = (event: React.MouseEvent<HTMLImageElement>) => {    event.stopPropagation();    event.preventDefault();    const { clientX, clientY } = event;    const diffX = clientX - mouseDowmPos.x;    const diffY = clientY - mouseDowmPos.y;    if (!mouseDowmFlag || (diffX === 0 && diffY === 0)) return;    const { offsetLeft, offsetTop } = imgRef.current as HTMLImageElement;    const offsetX = parseInt(`${diffX + offsetLeft}`, 10);    const offsetY = parseInt(`${diffY + offsetTop}`, 10);    setMouseDowmPos({      x: clientX,      y: clientY,    });    setImgStyle({      ...imgStyle,      left: offsetX,      top: offsetY,    });  };  const handleMouseUp = (event: React.MouseEvent<HTMLImageElement>) => {    event.stopPropagation();    event.preventDefault();    setMouseDowmFlag(false);  };  return (    <div className={styles.imgArea}>      <img         src={mapimg}         alt='part'        ref={imgRef}        height={HEIGHT}         style={imgStyle}        onMouseDown={handleMouseDown}        onMouseMove={handleMouseMove}        onMouseUp={handleMouseUp}      >      </img>    </div>  )}

图片缩放

图片缩放可以监听onWheel事件,事件对象event有一个记录滚轮滚动的属性deltaY,当向上滚动时deltaY<0,向下滚动时deltaY>0。每次滚动修改其缩放的比例,同时更改transform样式按比例进行缩放。

react如何实现缩放

const WIDTH = 1200;const HEIGHT = 900;const SCALE = 0.2;const DynamicStyle= () => {  const imgRef = React.createRef<HTMLImageElement>();    const [rate, setRate] = useState(1);    const [imgStyle, setImgStyle] = useState<React.CSSProperties>({});    const [mouseDowmFlag, setMouseDowmFlag] = useState(false);    const [mouseDowmPos, setMouseDowmPos] = useState<{x: number, y: number}>({x: 0, y: 0})    const [initial, setInitial] = useState<{width: number, height: number}>({width: WIDTH, height: HEIGHT});  useEffect(() => {    const { naturalWidth, naturalHeight, width, height } = imgRef.current as HTMLImageElement;    setInitial({ width, height });    // eslint-disable-next-line react-hooks/exhaustive-deps  }, [])  // console.log(natural, initial)  useEffect(() => {    document.onmouseover = () => {      if (mouseDowmFlag) {        setMouseDowmFlag(false);      }    };    return () => {      document.onmouseover = null;    };  }, [mouseDowmFlag])    const handleWheelImage = (event: React.WheelEvent<HTMLImageElement>) => {    // 向上为负,向下为正    const bigger = event.deltaY > 0 ? -1 : 1;    // transform偏移量    const transformX = -initial.width / 2;    const transformY = -initial.height / 2;    if (bigger > 0 && rate < 2) {      const enlargeRate = rate + SCALE;      setImgStyle({        ...imgStyle,        transform: `matrix(${enlargeRate}, 0, 0, ${enlargeRate}, ${transformX}, ${transformY})`, // 默认以图片中心为原点进行缩放      });      setRate(enlargeRate);    } else if (bigger < 0 && rate > 1) {      const shrinkRate = rate - SCALE;      setImgStyle({        ...imgStyle,        transform: `matrix(${shrinkRate}, 0, 0, ${shrinkRate}, ${transformX}, ${transformY})`,      });      setRate(shrinkRate);    }  }    const handleMouseDown = (event: React.MouseEvent<HTMLImageElement>) => {    const { clientX, clientY } = event;    event.stopPropagation();    event.preventDefault(); // 阻止浏览器默认行为,拖动会打开图片    setMouseDowmFlag(true); // 控制只有在鼠标按下后才会执行mousemove    setMouseDowmPos({      x: clientX,      y: clientY,    });  };  const handleMouseMove = (event: React.MouseEvent<HTMLImageElement>) => {    event.stopPropagation();    event.preventDefault();    const { clientX, clientY } = event;    const diffX = clientX - mouseDowmPos.x;    const diffY = clientY - mouseDowmPos.y;    if (!mouseDowmFlag || (diffX === 0 && diffY === 0)) return;    const { offsetLeft, offsetTop } = imgRef.current as HTMLImageElement;    const offsetX = parseInt(`${diffX + offsetLeft}`, 10);    const offsetY = parseInt(`${diffY + offsetTop}`, 10);    setMouseDowmPos({      x: clientX,      y: clientY,    });    setImgStyle({      ...imgStyle,      left: offsetX,      top: offsetY,    });  };  const handleMouseUp = (event: React.MouseEvent<HTMLImageElement>) => {    event.stopPropagation();    event.preventDefault();    setMouseDowmFlag(false);  };  return (    <div className={styles.imgArea}>      <img         src={mapImg}         alt='part'         height={HEIGHT}         style={imgStyle}        ref={imgRef}        onWheel={handleWheelImage}        onMouseDown={handleMouseDown}        onMouseMove={handleMouseMove}        onMouseUp={handleMouseUp}      >      </img>    </div>  )}
.imgArea {  position: relative;  width: 1200px;  height: 900px;  margin: auto;  border: 1px solid #da2727;  overflow: hidden;  & > img {    position: absolute;    left: 50%;    top: 50%;    transform: translate(-50%, -50%);    cursor: move;  }}

如果没有设置transformOrigin,默认是相对于图片中心进行缩放,但是在初始为了让图片在可视区域内水平垂直居中,使用了transform: translate(-50%, -50%);,因此为了缩放时相对于图片中心点,需要设置matrix的第5、6个参数矫正transformOrigintransform: matrix(${shrinkRate}, 0, 0, ${shrinkRate}, ${transformX}, ${transformY})

车站标注

首先,定义一个常量表示图标的坐标,这个坐标是相对于原始图片左上角的定位。

const imgInfo = {  lableLeft: "1900",  lableTop: "2000",}

这里,解释一下原始图的概念:
react如何实现缩放

随便在网上查看一个图片元素,比如上面。1200 x 900是页面定的图片大小,但图片还有一个真实大小4535 x 3402。

要计算图标在没有平移缩放时的初始坐标之前,需要算出图片的缩放比例(不是上面的rate):

const [natural, setNatural] = useState<{width: number, height: number}>({width: 1, height: 1});const [initial, setInitial] = useState<{width: number, height: number}>({width: WIDTH, height: HEIGHT});useEffect(() => {    const { naturalWidth, naturalHeight, width, height } = imgRef.current as HTMLImageElement;    setNatural({ width: naturalWidth, height: naturalHeight });    setInitial({ width, height });    // eslint-disable-next-line react-hooks/exhaustive-deps}, [])  // 初始图片缩放比例(图片有原始的图片大小)const imgScaleRateX = initial.width / natural.width;const imgScaleRateY = initial.height / natural.height;

图标初始的坐标就可以计算出:

const labelLeft = parseInt(`${imgInfo.lableLeft}`, 10) * imgScaleRateX;const labelTop = parseInt(`${imgInfo.lableTop}`, 10) * imgScaleRateY;

当图片平移时,图标也需要跟着平移,这是的坐标计算:

// 图标相对父元素坐标 = 图标位置坐标 + 图片坐标const labelLeft = parseInt(`${imgInfo.lableLeft}`, 10) * imgScaleRateX + Number(imgStyle.left || WIDTH / 2);const labelTop = parseInt(`${imgInfo.lableTop}`, 10) * imgScaleRateY + Number(imgStyle.top || HEIGHT / 2);

react如何实现缩放

当图片缩放时,图标需要随着图片一起缩放。如果没有对图标设置transformOrigin,默认时相对图标的中心缩放的。为了保证图标随着图片一起缩放,那就必须使得图片和图标的缩放参照原点相同,图标的transformOrigin应该设置为相对于图片原点的距离。

const labelTransformOrigin = () => {    return `${initial.width / 2 - Number(imgInfo.lableLeft) * imgScaleRateX}px ${        initial.height / 2 - Number(imgInfo.lableTop) * imgScaleRateY    }px`;}

react如何实现缩放

整体代码示例:

const imgInfo = {  lableLeft: "1900",  lableTop: "2000",}const WIDTH = 1200;const HEIGHT = 900;const SCALE = 0.2;const DynamicStyle= () => {  const imgRef = React.createRef<HTMLImageElement>();    const [rate, setRate] = useState(1);    const [imgStyle, setImgStyle] = useState<React.CSSProperties>({});    const [mouseDowmFlag, setMouseDowmFlag] = useState(false);    const [mouseDowmPos, setMouseDowmPos] = useState<{x: number, y: number}>({x: 0, y: 0})    const [natural, setNatural] = useState<{width: number, height: number}>({width: 1, height: 1});    const [initial, setInitial] = useState<{width: number, height: number}>({width: WIDTH, height: HEIGHT});  useEffect(() => {    const { naturalWidth, naturalHeight, width, height } = imgRef.current as HTMLImageElement;    setNatural({ width: naturalWidth, height: naturalHeight });    setInitial({ width, height });    // eslint-disable-next-line react-hooks/exhaustive-deps  }, [])  useEffect(() => {    document.onmouseover = () => {      if (mouseDowmFlag) {        setMouseDowmFlag(false);      }    };    return () => {      document.onmouseover = null;    };  }, [mouseDowmFlag])    const handleWheelImage = (event: React.WheelEvent<HTMLImageElement>) => {    // 向上为负,向下为正    const bigger = event.deltaY > 0 ? -1 : 1;    // transform偏移量    const transformX = -initial.width / 2;    const transformY = -initial.height / 2;    if (bigger > 0 && rate < 2) {      const enlargeRate = rate + SCALE;      setImgStyle({        ...imgStyle,        transform: `matrix(${enlargeRate}, 0, 0, ${enlargeRate}, ${transformX}, ${transformY})`, // 默认以图片中心为原点进行缩放      });      setRate(enlargeRate);    } else if (bigger < 0 && rate > 1) {      const shrinkRate = rate - SCALE;      setImgStyle({        ...imgStyle,        transform: `matrix(${shrinkRate}, 0, 0, ${shrinkRate}, ${transformX}, ${transformY})`,      });      setRate(shrinkRate);    }  }    const handleMouseDown = (event: React.MouseEvent<HTMLImageElement>) => {    const { clientX, clientY } = event;    event.stopPropagation();    event.preventDefault(); // 阻止浏览器默认行为,拖动会打开图片    setMouseDowmFlag(true); // 控制只有在鼠标按下后才会执行mousemove    setMouseDowmPos({      x: clientX,      y: clientY,    });  };  const handleMouseMove = (event: React.MouseEvent<HTMLImageElement>) => {    event.stopPropagation();    event.preventDefault();    const { clientX, clientY } = event;    const diffX = clientX - mouseDowmPos.x;    const diffY = clientY - mouseDowmPos.y;    if (!mouseDowmFlag || (diffX === 0 && diffY === 0)) return;    const { offsetLeft, offsetTop } = imgRef.current as HTMLImageElement;    const offsetX = parseInt(`${diffX + offsetLeft}`, 10);    const offsetY = parseInt(`${diffY + offsetTop}`, 10);    setMouseDowmPos({      x: clientX,      y: clientY,    });    setImgStyle({      ...imgStyle,      left: offsetX,      top: offsetY,    });  };  const handleMouseUp = (event: React.MouseEvent<HTMLImageElement>) => {    event.stopPropagation();    event.preventDefault();    setMouseDowmFlag(false);  };  // 初始图片缩放比例(图片有原始的图片大小)  const imgScaleRateX = initial.width / natural.width;  const imgScaleRateY = initial.height / natural.height;  const labelTransformOrigin = () => {    return `${initial.width / 2 - Number(imgInfo.lableLeft) * imgScaleRateX}px ${      initial.height / 2 - Number(imgInfo.lableTop) * imgScaleRateY    }px`;  }    const labelStyle = (): React.CSSProperties => {    const transformX = -initial.width / 2;    const transformY = -initial.height / 2;    // 图标相对父元素坐标 = 图标初始位置坐标 + 平移量    const labelLeft = parseInt(`${imgInfo.lableLeft}`, 10) * imgScaleRateX + Number(imgStyle.left || WIDTH / 2);    const labelTop = parseInt(`${imgInfo.lableTop}`, 10) * imgScaleRateY + Number(imgStyle.top || HEIGHT / 2);    return {      left: labelLeft,      top: labelTop,      transformOrigin: labelTransformOrigin(),      transform: `matrix(${rate}, 0, 0, ${rate}, ${transformX}, ${transformY})`,    }  }  return (    <div className={styles.imgArea}>      <img         src={mapImg}         alt='part'         height={HEIGHT}         style={imgStyle}        ref={imgRef}        onWheel={handleWheelImage}        onMouseDown={handleMouseDown}        onMouseMove={handleMouseMove}        onMouseUp={handleMouseUp}      >      </img>      <span className={styles.label} style={labelStyle()}></span>    </div>  )}

感谢各位的阅读,以上就是“react如何实现缩放”的内容了,经过本文的学习后,相信大家对react如何实现缩放这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: react如何实现缩放

本文链接: https://www.lsjlt.com/news/347576.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • react如何实现缩放
    这篇文章主要讲解了“react如何实现缩放”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现缩放”吧!react实现缩放的方法:1、监听onWheel事件;2、设置事件对象ev...
    99+
    2023-07-04
  • react怎么实现缩放
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react怎么实现缩放?react图片缩放、平移(position、transform实现)很多网页都会给文案附上一些图片补充描述,例如在说到地址时,会在...
    99+
    2023-05-14
    React
  • javascript如何实现禁止缩放
    这篇文章给大家分享的是有关javascript如何实现禁止缩放的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 javascript实现禁止缩放的方法:...
    99+
    2022-10-19
  • HTML5如何实现可缩放时钟
    这篇文章主要为大家展示了“HTML5如何实现可缩放时钟”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML5如何实现可缩放时钟”这篇文章吧。具体代码如下所示:...
    99+
    2022-10-19
  • opencv如何实现图像缩放效果
    这篇文章主要介绍了opencv如何实现图像缩放效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。图像缩放:图像缩放即对图像的大小进行调整,即放大或者缩小cv2.resize(...
    99+
    2023-06-14
  • HTML5 Canvas如何实现旋转和缩放
    小编给大家分享一下HTML5 Canvas如何实现旋转和缩放,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! Canvas旋转 ...
    99+
    2022-10-19
  • CSS如何实现圆形缩放动画
    这篇文章将为大家详细讲解有关CSS如何实现圆形缩放动画,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近在做公司的登录页,UE同学希望第三方登录的图标在hover的时候有一个圆形的缩放效果(原话是波纹效果...
    99+
    2023-06-08
  • Android实现缩放动画
    本文实例为大家分享了Android实现缩放动画的具体代码,供大家参考,具体内容如下 核心方法 public void startAnimation(Animation animati...
    99+
    2022-11-13
  • HTML5 Canvas如何实现图片缩放比例
    小编给大家分享一下HTML5 Canvas如何实现图片缩放比例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! drawImage方法的又一变种是增加了两个用于控制图像在canvas中缩放...
    99+
    2022-10-19
  • 如何通过纯CSS实现图片的缩放放大效果
    在现代网页设计中,图片的缩放放大效果常常被使用。通过CSS,我们可以轻松地实现这一效果,而无需使用JavaScript或其他编程语言。本文将介绍如何使用纯CSS来实现图片的缩放放大效果,并提供具体的代码示例。实现图片的缩放放大效果可以使用C...
    99+
    2023-10-21
    放大 CSS 缩放
  • css如何实现图片放大缩小动画
    这篇“css如何实现图片放大缩小动画”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“css如何实现图片放大缩小动画”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希...
    99+
    2022-10-19
  • css3如何实现旋转缩放动画效果
    这篇文章主要介绍了css3如何实现旋转缩放动画效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 方法:1、利用...
    99+
    2022-10-19
  • css3如何实现字体放大缩小动画
    这篇文章主要讲解了“css3如何实现字体放大缩小动画”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css3如何实现字体放大缩小动画”吧! ...
    99+
    2022-10-19
  • C语言如何实现图片放大缩小
    这篇文章主要介绍“C语言如何实现图片放大缩小”,在日常操作中,相信很多人在C语言如何实现图片放大缩小问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言如何实现图片放大缩小”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • winform自动缩放怎么实现
    在WinForm中,可以通过设置`AutoScaleMode`属性来实现窗体的自动缩放。`AutoScaleMode`属性有以下几个...
    99+
    2023-10-27
    winform
  • Java实现图片比率缩放
    本文实例为大家分享了Java实现图片比率缩放的具体代码,供大家参考,具体内容如下 通过Thumbnails实现图片缩放 需要导入pom依赖,可以到中央仓库获取最小的工具包 <d...
    99+
    2022-11-13
  • opencv实现图像缩放效果
    本文实例为大家分享了opencv实现图像缩放效果的具体代码,供大家参考,具体内容如下 图像缩放: 图像缩放即对图像的大小进行调整,即放大或者缩小 cv2.resize(src,d...
    99+
    2022-11-11
  • Android实现图片双指缩放
    本文实例为大家分享了Android实现图片双指缩放的具体代码,供大家参考,具体内容如下 展示 源码 using Android.App; using Android.OS; u...
    99+
    2022-11-12
  • vue怎么实现图片缩放
    这篇“vue怎么实现图片缩放”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现图片缩放”文章吧。实现效果如下这几天...
    99+
    2023-06-30
  • Swift如何实现缩放并填充图片功能
    小编给大家分享一下Swift如何实现缩放并填充图片功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现先看代码,然后再分析:func rescaleA...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作