首页 > 其他分享 >vue dom拖拽指令

vue dom拖拽指令

时间:2023-05-12 12:01:12浏览次数:32  
标签:el style vue dom px value scaleRates bindings 拖拽

还可以封装一下代码,不想封了,移动端pc端区别:事件不同,pc端鼠标事件移动端触摸事件;pc端直接获取e.pageX,移动端e.changedTouches[0].pageX

使用直接在dom绑定v-drag

  directives: {
    drag(el, bindings, vnode) {
      let phone = false
      let max = max || 0
      if(window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)) {
        phone = true;  // 移动端
      }
      let scaleRates = scaleRates || 1 // dom缩放比例   特殊需求预留位置

      // 移动端
      if(phone){
        el.ontouchstart = function (e) {
          if(bindings.value.cantChange !== true){
            bindings.value.style['z-index'] = max + 1
          }
          // 不能操作
          if(bindings.value.isClock === true || bindings.value.operate === false){
            return
          }
          var disx = (e.changedTouches[0].pageX / scaleRates) - el.offsetLeft
          var disy = (e.changedTouches[0].pageY / scaleRates) - el.offsetTop
          const move = (e) => {
            el.style.left = ((e.pageX / scaleRates) - disx) + 'px'
            el.style.top = ((e.pageY / scaleRates) - disy) + 'px'
            bindings.value.style.left = ((e.changedTouches[0].pageX / scaleRates) - disx) + 'px'
            bindings.value.style.top = ((e.changedTouches[0].pageY / scaleRates) - disy) + 'px'
          }
          document.ontouchmove = function(e){
            move(e)
          }

          const up = (e) => {
            document.ontouchmove = document.ontouchend = null
          }

          document.ontouchend = function (e) {
            up(e)
          }
        }
      }
      // pc端
      else{
        el.onmousedown = function (e) {
          if(bindings.value.cantChange !== true){
            bindings.value.style['z-index'] = max + 1
          }
          // 不能操作
          if(bindings.value.isClock === true || bindings.value.operate === false){
            return
          }
          var disx = (e.pageX / scaleRates) - el.offsetLeft
          var disy = (e.pageY / scaleRates) - el.offsetTop
          const move = (e) => {
            el.style.left = ((e.pageX / scaleRates) - disx) + 'px'
            el.style.top = ((e.pageY / scaleRates) - disy) + 'px'
            bindings.value.style.left = ((e.pageX / scaleRates) - disx) + 'px'
            bindings.value.style.top = ((e.pageY / scaleRates) - disy) + 'px'
          }
          document.onmousemove = function(e){
            move(e)
          }

          const up = (e) => {
            document.onmousemove = document.onmouseup = null
          }

          document.onmouseup = function (e) {
            up(e)
          }
        }
      }
    }
  },

 

标签:el,style,vue,dom,px,value,scaleRates,bindings,拖拽
From: https://www.cnblogs.com/myqinyh/p/17393694.html

相关文章

  • vue 关于element el-dialog使用心得-传参问题
    最近写一个功能用到了弹窗,在弹窗内显示一个子组件。关于el-dialog的el-dialog:visible.sync="xxx  参考https://blog.csdn.net/startyangu/article/details/128029464?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%......
  • Vue项目报错: Component name “xxx“ should always be multi-word vue/multi-word-co
    报错的意思是组件名应该始终是多单词,不应该以单个单词命名组件解决办法1:修改组件名称:例如当前的登陆组件名是login.vue修改成LoginName.vue,组件名需要以驼峰式命名至少两个单词,不一定都得是LoginName.vue可以是NameLogin.vue也可以是LoginNiu.vue总之就是以驼峰式命名......
  • Vue 打包项目出现内存溢出问题
    Vue项目打包遇到内存溢出的问题:npmiincrease-memory-limit-gincrease-memory-limit再执行npmrundev后出现以下问题: 百度了一下,在node_module下的.bin文件夹中查找这个文件: 将这个字符串的双引号去掉:再次运行npmrundev 就可以了 ......
  • vue3 父子组件传值
    父传子组件<template><div><!--通过自定义属性传递值--><Subassembly:value="doc"/></div></template><scriptsetup>import{ref}from'vue'importSubassemblyfrom'./Subassembly.vue&#......
  • vue 存储cookie 与使用
    安装cookie依赖包npmi@vueuse/integrations安装cookienpmiuniversal-cookie使用cookieimport{useCookies}from"@vueuse/integrations/useCookies"constcookie=useCookies();存取cookiecookie.set("token","123456789")获取cookiecookie.......
  • vue table 没有数据的时候展示无数据
    element-table无数据的时候,把“暂无数据”改成其他文字或图片 <el-table :data="tableData" ><el-table-columnlabel="序号"prop="amount""min-width="80"align="center"><template#default="scope">......
  • vue-element-admin安装依赖报错问题
    前言vue-element-admin中文官网要使用中文版,直接去gitgithub下载包:https://github.com/PanJiaChen/vue-element-admin/tree/i18ngitee下载包:https://gitee.com/panjiachen/vue-element-admin/tree/i18n分支记得选择这个i18n问题解决1.修改package.json文件tui-editor这......
  • vue中光标显示到指定的input框内
    给input标签内加ref="inputName"然后在想要执行的地方写this.$refs.inputName.focus() 1.如果想要打开这个页面的时让光标自动显示到input框内就在mounted里加 2.如果想在执行事件之后让光标显示到input框内就加在事件里 ......
  • vue中解析转义字符
    最近在写一个后台,后台需要展示富文本的内容,按理说使用v-htmll标签就可以,但是当我使用后,却发现页面展示的依旧是html标签,这时我仔细看了一下返回的富文本内容,发现里边包含了展示转义字符<pstyle="line-height:150%"><spanstyle=";font-family:宋体;line-height:150%;font-size:......
  • VUE
    Vue的基本常识Vue的使用方式vuejs的使用官方提供了2种方式:基于脚本导入使用,下载vue.js文件,通过script标签引入到html网页。基于项目构建工具来进行使用,需要安装项目构建工具,自动构建成一个独立的项目。目前官方推荐的项目构建工具:vue-CLI,vite。Vue调试工具VueDevtools......