首页 > 其他分享 >vue3自定义指令 拖拽 与拖拽变大小

vue3自定义指令 拖拽 与拖拽变大小

时间:2023-07-12 12:13:28浏览次数:39  
标签:el const 自定义 sty binding dragDom vue3 document 拖拽

    directives:{
      drag:{
        mounted: (el, binding) => {
          const dragDom = el;
          const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);
          el.parentElement.style.cursor = 'move';
          el.parentElement.onmousedown = (e) => {
              // const disX = e.clientX - el.parentElement.offsetLeft;
              // const disY = e.clientY - el.parentElement.offsetTop;
              const disX = e.clientX;
              const disY = e.clientY;
              let styL, styT;
              if(sty.left.includes('%')) {
                styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);
                styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
              }else {
                styL = +sty.left.replace(/\px/g, '');
                styT = +sty.top.replace(/\px/g, '');
              };
              document.onmousemove = function (e) {
                  // 通过事件委托,计算移动的距离 
                  const l = e.clientX - disX;
                  const t = e.clientY - disY;
                  // 移动当前元素  
                  dragDom.style.left = `${l + styL}px`;
                  dragDom.style.top = `${t + styT}px`;
                  //将此时的位置传出去
                  //binding.value({x:e.pageX,y:e.pageY})
              };
              document.onmouseup = function (e) {
                  document.onmousemove = null;
                  document.onmouseup = null;
              };
          } 
        }
      },
      dragWidth:{
        mounted: (el, binding) => {
          const dragDom = el.parentElement;
          el.style.cursor = 'se-resize';
          let minW = binding.value.min.w;
          let minH = binding.value.min.h;
          let maxW = binding.value.max.w;
          let maxH = binding.value.max.h;
          el.onmousedown = (e) => {
              e.stopPropagation()
              e.preventDefault()
              const mask = document.createElement('div')
              mask.setAttribute('style', 'position:fixed;top:0px;bottom:0px;left:0px;right:0px;background:rgba(0,0,0,0)')
              document.body.appendChild(mask)
              // 计算当前元素距离可视区的距离
              const disX = e.clientX - el.offsetLeft;
              const disY = e.clientY - el.offsetTop;
              document.body.onmousemove = function (e) {
                e.preventDefault() // 移动时禁用默认事件
                const l = e.clientX - disX;
                const h = e.clientY - disY;
                const wh = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
                console.log(l,h)
                if(maxW>=l && minW<=l) dragDom.style.width = `${l}px`;
                if(maxH>=h && minH<=h) dragDom.style.height = `${h}px`;
              }
              document.body.onmouseup = function (e) {
                  document.body.removeChild(mask)
                  document.body.onmousemove = null
                  document.body.onmouseup = null
              }
          }
        }
      }
    },

 

标签:el,const,自定义,sty,binding,dragDom,vue3,document,拖拽
From: https://www.cnblogs.com/zgfs/p/17547166.html

相关文章

  • 基于JavaFX的扫雷游戏实现(五)——设置和自定义控件
      它来了它来了,最后一期终于来了。理论上该讲的全都讲完了,只剩下那个拖了好几期的自定义控件和一个比较没有存在感的设置功能没有讲。所以这次就重点介绍它们俩吧。  首先我们快速浏览下设置的实现,上图:  然后是控制器代码:SettingsController.javapackagecontrollers;......
  • Vue3+.net6.0 五 类和样式绑定
    Vue3关于样式的处理跟Vue2是一样的,常用的有以下几种。1.绑定属性html部分:<div:class="{active:isActive}"></div>js部分:data(){return{isActive:true}}当isActive值为true时,div应用这个active样式,反之亦然。 2.对象方式绑定<div:class="cla......
  • 19:vue3 依赖注入
    1、通过Prop逐级透传问题(传统老的方法只能逐级传递) 传统方式代码如下:App.vue1<template>2<h3>祖宗</h3>3<Parent:msg="msg"></Parent>4</template>56<script>7importParentfrom"./components/Parent.vue"......
  • React中编写操作树形数据的自定义Hook
    什么是Hookhook即为钩子,是一种特殊的函数,它可以让你在函数式组件中使用一些react特性,目前在react中常用的hook有以下几类useState:用于在函数组件中定义和使用状态(state)。useEffect:用于在函数组件中处理副作用,也可以模拟react生命周期useContext:用于在函......
  • mapbox添加自定义控件
    需要定义一个类,然后至少重写实现onAdd、onRemove方法,示例如下<template><divref="changeViewRef"@click="changeView"class="changeViewmapboxgl-ctrl"><el-tooltipclass="box-item"effect="dark"......
  • 自定义筛选AutoFilter
    AutoFilter语法:expression.AutoFilterVBA直接输入这个是在自动筛选和关闭来回切换。AutoFilter.FilterMode属性如果工作表处于自动筛选筛选器模式,则返回 True。只读 Boolean。表达 一个代表 AutoFilter 对象的变量。语法:expression.FilterModee.g:SubClearFilter()......
  • VBA自定义排序
    SortField.clear方法清除所有 SortFields 对象。SortFields.Add方法创建新的排序字段,并返回一个SortFields 对象。语法:expression.SortFields.add(key、SortOn、 Order、 CustomOrder、 DataOption)'Key:指定排序字段的范围或单元格。'SortOn:指定排序方式。例如xl......
  • 18:vue3 异步加载
    在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件。Vue提供了 defineAsyncComponent 方法来实现此功能: 1<template>2<h3>异步加载</h3>3<KeepAlive>4<component:is="tabComponent"></component>5</KeepAlive>......
  • SignalR 外部调用自定义Hub类的方法,Clients为null
    这是因为外部调用的类的对象和你连接的Hub类的对象,这两个对象不!一!样!解决方法在自定义的Hub类中,注入IHubContext对象,然后在方法中调用IHubContext对象来向前端推送数据publicclassDataHub:AbpCommonHub,ITransientDependency{publicIOnlineClientManag......
  • 16:vue3 动态组件
    A组件1<template>2<h3>ComponentA</h3>3</template>B组件1<template>2<h3>ComponentB</h3>3</template> App.vue1<template>2<h3>动态组件(A、B两个组件动态切换)</h3>3<compo......