vue中跟随鼠标移动和边界处理

这篇具有很好参考价值的文章主要介绍了vue中跟随鼠标移动和边界处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求:需要能够拖拽图片进行移动,不会超出容器边界范围

vue 鼠标移动,vue.js,javascript,ecmascript

 1.获取到鼠标移动的坐标和被点击拖拽的dom的坐标

补充前端跟坐标有关的知识点

1.pageX和pageY是整个文档开始计算的坐标, 红色表示pageX和pageY

2.offsetX和offsetY是一个鼠标在一个元素内的坐标, 蓝色表示offsetX和offsetY

3.clientX和clientY是当前屏幕可视化局域计算的坐标, 当文档不向下滚动时,红色也可以表示clientX和clientY

分析得出:当前图片已经超出可视化区域,需要使用pageX和pageY才能准确地拿到鼠标坐标

2.通过计算可以获取到当前图片左距离和上距离

这里拖拽采用的事件是:

mousedown:鼠标点击时触发

mousemove:鼠标移动时触发

mouseup:鼠标松开时触发

其中mousedown应该绑定被拖拽的元素,而mouseup就所谓了,mousemove一般通过document或者window进行监听,当然也可以是父容器。

在vue2的图片中绑定@mouseup="mouseup" @mousedown="dragImg"

dragImg(img) {
      img.preventDefault()
      this.imgObj = img
      window.addEventListener('mousemove', this.move)
}

mouseup() {
      window.removeEventListener('mousemove', this.move)
      this.getContainerH()
}
​
this.imgObj.target.style.position = 'absolute'
this.imgObj.target.style.left = pageX - this.imgObj.offsetX + 'px'
this.imgObj.target.style.top = pageY - this.imgObj.offsetY + 'px'

​

3.进行边界判断以及父容器高度处理

 首先是最简单的上边界和左边界判断:

//边界判断
if (this.imgObj.target.offsetTop <= 0) {
   this.imgObj.target.style.top = 0 + 'px'
}

if (this.imgObj.target.offsetLeft <= 0) {
   this.imgObj.target.style.left = 0 + 'px'
}

然后是右边界判断:

这里需要获取到屏幕的内在宽度,一般都作为一个工具函数,这里是通用的写法,如下代码所示:

function getClientW() {
  return {
    width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
    height:
      window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
  }
}

 通过当前元素的做距离加上当前元素的自身大小和屏幕内在宽度进行比较处理可得如下代码:

   if (
        +this.imgObj.target.style.left.split('px')[0] + this.imgObj.target.clientWidth >=
        this.client.width
      ) {
        this.imgObj.target.style.left = this.client.width - this.imgObj.target.clientWidth + 'px'
      }

最后的问题是下边界无需处理,由于元素已经脱离了标准流,会导致父元素高度塌陷,为了能够显示父元素高度以此来添加背景颜色,这里需要用给父容器实时获取最新高度。

  getContainerH() {
      const singleMvIndex = this.$refs.singleMvIndex
      singleMvIndex.style.height =
        this.imgObj.target.clientHeight + this.imgObj.target.offsetTop + this.paddingH + 'px'
      if (singleMvIndex.clientHeight < this.client.height) {
        singleMvIndex.style.height = this.client.height + 'px'
      }
    },

这里用此函数在拖拽时不断调用,singleMvIndex是容器的dom,

容器高度 = 元素内在高度 + 元素距离父容器顶端距离 + 容器自带padding

容器就会不断变大,向上拖拽时容器该需要变小,

这里的做法时容器高度如果小于屏幕内在高度就会等于屏幕内在高度就解决问题了。

这里算是对一些小的问题的解决,算是分享给大家,希望能帮助到一些人,谢谢。

最后时mousemove整体代码:文章来源地址https://www.toymoban.com/news/detail-560005.html

 move(e) {
      let { pageX, pageY } = e
      this.imgObj.target.style.position = 'absolute'
      this.imgObj.target.style.left = pageX - this.imgObj.offsetX + 'px'
      this.imgObj.target.style.top = pageY - this.imgObj.offsetY + 'px'
      //边界判断
      if (this.imgObj.target.offsetTop <= 0) {
        this.imgObj.target.style.top = 0 + 'px'
      }
      if (this.imgObj.target.offsetLeft <= 0) {
        this.imgObj.target.style.left = 0 + 'px'
      }
      if (
        +this.imgObj.target.style.left.split('px')[0] + this.imgObj.target.clientWidth >=
        this.client.width
      ) {
        this.imgObj.target.style.left = this.client.width - this.imgObj.target.clientWidth + 'px'
      }
      this.getContainerH()
    },

到了这里,关于vue中跟随鼠标移动和边界处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VUE使用Three.js实现模型,点击交互,相机旋转视角跟随移动(Threejs中使用Tweenjs,含demo源码)

    目录 一、Three.js是什么? 二、VUE简单使用Three.js步骤 1.npm安装 2.template模板 3.引入库 4.定义全局变量 5.初始化场景 6.初始化相机 7.初始化灯光 8.初始化渲染器 9.创建模型(这里我搭建的模型是一个简单双面货架模型) 10.根据浏览器窗口自适应 11.初始化函数,页面加载完成时调用

    2024年02月03日
    浏览(69)
  • 图片跟随鼠标移动效果的抖动问题

    图片跟随鼠标移动效果的实现思路: 触发mousemove事件响应时,通过e.offsetX,e.offsetY获取到当前鼠标的位置。再修改图片的css样式中的top, left属性(图片采用绝对定位)。 代码如下: 分析问题原因 offset是相对于事件源而言的,即,鼠标在哪个元素上移动,事件的offset属性就是

    2024年02月09日
    浏览(77)
  • Unity用鼠标拖拽UI,UI跟随鼠标移动

    先上效果 继承几个拖拽的接口 IBeginDragHandler, IDragHandler,IEndDragHandler 计算下偏移量,转换下坐标系 限制下可拖拽的范围,我设置的是canvas的大小 欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。 如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~ 声明

    2024年02月06日
    浏览(81)
  • js的鼠标事件(JavaScript的鼠标事件,vue的鼠标事件)

    js鼠标事件,相关属性: vue鼠标事件,相关属性 (js鼠标事件和vue中的鼠标事件区别是省略了on字符):

    2024年02月12日
    浏览(46)
  • Fabric.js+vue 实现鼠标滚轮缩放画布+移动画布

    话不多说 直接贴代码 一、实现鼠标滚轮缩放画布 使用说明,我的canvas画布定义为 canvas,替他均不用额外设置变量。canvas = new fabric.Canvas(\\\'editorCanvas\\\', {... 二、实现鼠标按下变抓手,并可移动画布中内容 使用说明:data中定义panning: false,用来标记鼠标按下状态(是否鼠标按下)

    2024年02月09日
    浏览(54)
  • Unity【角色/摄像机移动控制】【2.角色跟随鼠标转向】

    本章代码实现基于本系列的【1.角色移动】 在前面的基础上,我们在PlayerController脚本中添加如下函数,随后在update方法中调用即可: 其中mouseSensitivity是前面自定义的一个float变量,用来调节对鼠标转向速度,至此,当我们转动鼠标,角色也会跟着转动

    2024年02月22日
    浏览(57)
  • 【Unity】摄像机跟随鼠标移动以物体为中心旋转 物体根据视线方向移动

    描述 实现摄像机根据鼠标移动跟随物体旋转,以摄像机前物体为中心,摄像机围绕物体旋转,并使摄像机时刻指向物体 实现效果 Unity 组件设置 Camera 组件设置 Body 组件设置 实现代码 CameraRotateMove.cs 摄像机跟随和旋转 move_better.cs 物体根据按键移动

    2024年02月08日
    浏览(90)
  • echarts多图联动下,提示框(tooltip)位置跟随鼠标(拐点)移动

    tooltip提示框位置有单独的字段(position),相信大家都知道 大概说一下这几种方式: 第一种: 不设置position字段 ,默认不设置时位置会跟随鼠标的位置。(但我们的需求是:提示框始终在拐点的斜上方)。 第二种: 通过数组方式,里边可以填写数字也可以填写百分比 。例

    2024年02月16日
    浏览(59)
  • untiy 连接两个UI或一段固定一段跟随鼠标移动的线段

    注意,仅适用于UI,且Canvas必须是Camera模式,不能用在3D物体上,3D物体请使用LineRenender 先创建一个图片,将锚点固定在左边 然后在脚本中添加如下内容

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包