解析vue界面中可拖动<div>、<img>

在界面中拖拽某个元素,用户经历的过程是:点击,拖动,松开,即onmousedown、onmousemove、onmouseup。

div的拖动

若要拖动div,首先应在div上添加绑定事件@mousedown=“mousedown”,这样当点击div时可触发相应函数。

 <div
   width="150px" height="150px"
     @mousedown="mousedown" 
     :style="'position:fixed;left:'+left+'px;top:'+top+'px;'"/>
 </div>

在mousedown函数中首先要继续监听当前标签的onmousemove事件,当用户点击并移动时触发。此时去监控鼠标的点击位置,获取鼠标点击的窗口坐标clientX,clientY与鼠标在标签内的坐标offsetX,offsetY,通过相减即可得到标签在浏览器中的坐标(clientX-offsetX,clientY-offsetY)。并把这个坐标动态赋值给div,即实现了拖动div。最后当鼠标抬起时onmouseup销毁onmousemove事件。

public left:number=0;
public top:number=0;
 public  mousedown(e:any){
      document.onmousemove = (e2) => {
        this.left=e2.clientX-e.offsetX;
        this.top=e2.clientY-e.offsetY;
      };
      document.onmouseup = ()=> {
          document.onmousemove=null;
          document.onmousedown=null;
      };
  }

img的拖动

img标签的拖动与div的拖动思路是一样的,只是作为img标签在拖动时需要禁用浏览器默认事件。在onmousedown中引用下方函数即可

 public pauseEvent(e:any){
    if(e.stopPropagation) e.stopPropagation();//阻止把事件分派到其他节点。
    if(e.preventDefault) e.preventDefault();//阻止默认事件
    e.cancelBubble=true;//阻止冒泡
	e.returnValue=false;//阻止IE的默认事件
	return false;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,需要在vue2项目安装hammer.js库:`npm install --save hammerjs` 然后在需要使用双指缩放功能的组件引入hammer.js和vue2-hammer库: ```javascript import Hammer from 'hammerjs' import VueHammer from 'vue2-hammer' ``` 在组件注册VueHammer: ```javascript export default { name: 'ImageDisplay', directives: { VueHammer }, ... } ``` 接下来,在mounted钩子函数初始化hammer.js,并添加双指缩放功能: ```javascript mounted() { // 初始化hammer.js const mc = new Hammer.Manager(this.$el) // 添加pan和pinch事件 mc.add(new Hammer.Pan({ threshold: 0, pointers: 0 })) mc.add(new Hammer.Pinch({ threshold: 0 })).recognizeWith([mc.get('pan')]) // 定义初始状态 let posX = 0 let posY = 0 let scale = 1 let lastScale = 1 let lastPosX = 0 let lastPosY = 0 let maxPosX = 0 let maxPosY = 0 let transform = '' // 监听pan事件 mc.on('pan', (e) => { posX = e.deltaX + lastPosX posY = e.deltaY + lastPosY maxPosX = Math.ceil((scale - 1) * this.$el.clientWidth / 2) maxPosY = Math.ceil((scale - 1) * this.$el.clientHeight / 2) if (posX > maxPosX) { posX = maxPosX } if (posX < -maxPosX) { posX = -maxPosX } if (posY > maxPosY) { posY = maxPosY } if (posY < -maxPosY) { posY = -maxPosY } transform = `translate3d(${posX}px, ${posY}px, 0) scale3d(${scale}, ${scale}, 1)` this.$refs[this.list[this.listIndex].id].style.transform = transform }) // 监听pinch事件 mc.on('pinch', (e) => { scale = Math.max(.5, Math.min(lastScale * (e.scale), 5)) transform = `translate3d(${posX}px, ${posY}px, 0) scale3d(${scale}, ${scale}, 1)` this.$refs[this.list[this.listIndex].id].style.transform = transform }) // 监听pan结束事件 mc.on('panend', () => { lastPosX = posX < maxPosX ? posX : maxPosX lastPosY = posY < maxPosY ? posY : maxPosY }) // 监听pinch结束事件 mc.on('pinchend', () => { lastScale = scale }) } ``` 最后,在需要使用双指缩放功能的模板添加VueHammer指令: ```html <template> <div class="home"> <div class="box" @mouseout="out" @mouseover="over" v-vue-hammer> <div style="width: 100%;height: 100%;"> <img v-for="(item,index) in list" :ref="item.id" v-show="listIndex === index" :key="index" :src="item.url" alt="" /> </div> <p class="left1" @click="changePage(prevIndex)"> < </p> <ul> <li :class="{color:index == listIndex}" v-for="(item,index) in list" @click="changePage(index)" :key="index" /> </ul> <p class="right1" @click="changePage(nextIndex)"> > </p> </div> </div> </template> ``` 这样,双指缩放功能就被添加到了图片展示组件。需要注意的是,在mounted钩子函数添加双指缩放功能时,需要根据实际情况修改transform变量的值,以实现正确的图片缩放和拖动效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值