vue 实现图片以鼠标为中心放大,并可以随意在div内拖动

需求:前端接收后端传过来图片渲染,并且可以直接在渲染的地方,以鼠标滚轮为中心放大图片,还可以随意拖动图片

调研:目前有很多现成的插件都是,点击图片,然后弹出遮罩层,在遮罩层里面操作,由于不符合需求,就只能自己写了。

开始使用了css3 的scale ,但是发现自由拖动有bug ,在放大后会导致左侧和上方的图片拖动不下来,类似于溢出隐藏(此出具体不做具体说明)

实现原理:

1:在img 外层套一个div ,此div 宽高固定,用来放 放大的img,然后产生滚动条。

2:计算鼠标相对于图片的位置(注意,此处有坑,不能直接用offsetX,offsetY,因为连续滚动,会导致 offsetX,offsetY 发生变化,导致计算出错)

3:放大缩小原理就是找到鼠标相对于图片的x ,y 轴的距离然后乘以倍数,动态设置图片的宽高,div 的scrollerLeft ,scrollerTop,使图片相对于div 的位置不变,从而实现效果。

4:鼠标在图片上随意拖动图片,原来就是动态的计算鼠标移动的x,y 轴的距离,然后动态的设置滚动条的位置

一:拖动组件:

const dragscroll = (el) => {
    el.onmousedown = ev => {
        const disX = ev.clientX;
        const disY = ev.clientY; // 需要上下移动可以加
        const originalScrollLeft = el.scrollLeft;
        const originalScrollTop = el.scrollTop; // 需要上下移动可以加
        const originalScrollBehavior = el.style['scroll-behavior'];
        const originalPointerEvents = el.style['pointer-events'];
        el.style['scroll-behavior'] = 'auto';
        // 鼠标移动事件是监听的整个document,这样可以使鼠标能够在元素外部移动的时候也能实现拖动
        document.onmousemove = dv => {
            dv.preventDefault();
            const distanceX = dv.clientX - disX;
       

你可能感兴趣的:(Vue,图片以鼠标放大缩小,图片随意拖拽,vue.js,javascript,前端)