来源:用房管理系统
作用:大图片小窗口查看时可以用左右上下拖动
框架:React
UI 库:ant design
客户需要展示楼层图,但是楼层图的大小不一,为了页面布局,展示时是适应的宽高,图片是变形的,且太小。
本来寻找了一个放大镜插件,向淘宝的图片展示一样的。
组件
使用方法
1 | import ReactImageMagnify from 'React-image-magnify'; |
优点:效果很好,交互性好
缺点:smallImage 宽高必须写死,或者 isFluidWidth: true,展示的效果其实都不太好。
具体可看开源项目
调好大图小图的宽高,展示效果还好,结果客户不满意,还是要弹框展示楼层原图,并且要拖动图片查看。
然后我百度到一堆原生 js 的方法,根据坐标的变化,改变图的位置的方法,写成了一个 React 的组件。
组件直接用的 antd 的 modal 弹框
该组件也用到了原生的方法获取元素设置位置,这个是我作为菜鸟想到的唯一方法
主要代码
1 | <img |
主要为图片绑定了三个事件,
onMouseDown:按下鼠标
onMouseUp:松开按住鼠标
onMouseMove:按住并移动鼠标
字面意思构够详细了吧
鼠标按下时的方法
offsetLeft:是当前元素左边框相对于 body 的偏移量,
clientLeft:clientleft=offsetleft-该对象的 border 值。
目前没弄太懂这俩的区别,看了好多介绍文章, 可能空间想象能力不太好,还是没看懂。
按照上面的额 概念,如果元素没有 border 两个是相等的,但是这里使用 client, 每次 选中图片 ,图片不会在上次移动后的位置基础上移动,而是复原到初始状态再移动。。
1 | handlerMouseDown=(e)=>{ |
松开按住鼠标的 方法
1 | handlerMouseUp=()=>{ |
鼠标移动时的方法
1 | handlerMouseMove=(e)=>{ |
下面是整个组件的代码
1 | import React ,{ Component } from 'React' |
使用
1 | < DragImg name="图片名称" img={Img}> |
img 传入的是图片信息,可以是路径或是处理好的 base64 编码的图片信息