我的编程空间,编程开发者的网络收藏夹
学习永远不晚

react如何实现缩放

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

react如何实现缩放

这篇文章主要讲解了“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         class="lazy" data-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         class="lazy" data-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         class="lazy" data-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如何实现缩放这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

react如何实现缩放

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

下载Word文档

猜你喜欢

react如何实现缩放

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

react怎么实现缩放

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

CSS如何实现圆形缩放动画

这篇文章将为大家详细讲解有关CSS如何实现圆形缩放动画,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近在做公司的登录页,UE同学希望第三方登录的图标在hover的时候有一个圆形的缩放效果(原话是波纹效果
2023-06-08

opencv如何实现图像缩放效果

这篇文章主要介绍了opencv如何实现图像缩放效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。图像缩放:图像缩放即对图像的大小进行调整,即放大或者缩小cv2.resize(
2023-06-14

C语言如何实现图片放大缩小

这篇文章主要介绍“C语言如何实现图片放大缩小”,在日常操作中,相信很多人在C语言如何实现图片放大缩小问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言如何实现图片放大缩小”的疑惑有所帮助!接下来,请跟着小编
2023-06-30

如何通过纯CSS实现图片的缩放放大效果

在现代网页设计中,图片的缩放放大效果常常被使用。通过CSS,我们可以轻松地实现这一效果,而无需使用JavaScript或其他编程语言。本文将介绍如何使用纯CSS来实现图片的缩放放大效果,并提供具体的代码示例。实现图片的缩放放大效果可以使用C
2023-10-21

Swift如何实现缩放并填充图片功能

小编给大家分享一下Swift如何实现缩放并填充图片功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现先看代码,然后再分析:func rescaleAndPad
2023-06-25

如何用js实现手指缩放图片功能

这篇“如何用js实现手指缩放图片功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用js实现手指缩放图片功能”文章吧。需
2023-06-26

Python如何实现简单图像缩放与旋转

这篇文章主要介绍Python如何实现简单图像缩放与旋转,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 图像缩放1.2. 使用命令import cv2# 缩放def resize(img, k, inter):
2023-06-26

如何使用CSS实现图片的缩放效果

如何使用CSS实现图片的缩放效果在网页设计中,图片的缩放效果是常见的需求之一。通过CSS的相关属性和技巧,我们可以轻松地实现图片的缩放效果。下面,将为大家详细介绍如何使用CSS来实现图片的缩放效果,并给出具体的代码示例。使用transfor
如何使用CSS实现图片的缩放效果
2023-11-21

如何使用JavaScript实现一个拖拽缩放效果

这篇文章主要介绍“如何使用JavaScript实现一个拖拽缩放效果”,在日常操作中,相信很多人在如何使用JavaScript实现一个拖拽缩放效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用JavaS
2023-06-30

基于Python如何实现批量缩放图片尺寸

今天小编给大家分享一下基于Python如何实现批量缩放图片尺寸的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方法一在 Pil
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录