【Vue】vue3 v-draggable 拖拽指令封装

这篇具有很好参考价值的文章主要介绍了【Vue】vue3 v-draggable 拖拽指令封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

需求:实现一个拖拽指令,可在父元素区域任意拖拽元素,同时如果传入的值为 father,则拖拽的时候以父元素为拖拽对象

思路:
1、设置需要拖拽的元素为absolute,其父元素为relative。
2、鼠标按下(onmousedown)时记录目标元素当前的 left 和 top 值。
3、鼠标移动(onmousemove)时计算每次移动的横向距离和纵向距离的变化值,并改变元素的 left 和 top 值
4、鼠标松开(onmouseup)时完成一次拖拽

使用:在 Dom 上加上 v-draggable 即可
<div class="dialog-model" v-draggable></div>

代码

import type { Directive, DirectiveBinding } from 'vue';
interface ElType extends HTMLElement {
  parentNode: any;
}
const draggable: Directive = {
  mounted: function (el: ElType, binding: DirectiveBinding) {
    el.style.cursor = 'move';
    el.style.position = 'absolute';
    el.onmousedown = function (e) {
      let disX = e.pageX - el.offsetLeft;
      let disY = e.pageY - el.offsetTop;

      if (binding.value === 'father') {
        disX = e.pageX - el.parentNode.offsetLeft;
        disY = e.pageY - el.parentNode.offsetTop;
      } else {
        disX = e.pageX - el.offsetLeft;
        disY = e.pageY - el.offsetTop;
      }

      document.onmousemove = function (e) {
        let x = e.pageX - disX;
        let y = e.pageY - disY;
        let maxX;
        let maxY;

        if (binding.value === 'father') {
          maxX =
            el.parentNode.parentNode.offsetWidth - el.parentNode.offsetWidth;
          maxY =
            el.parentNode.parentNode.offsetHeight - el.parentNode.offsetHeight;
        } else {
          maxX = el.parentNode.offsetWidth - el.offsetWidth;
          maxY = el.parentNode.offsetHeight - el.offsetHeight;
        }

        if (x < 0) {
          x = 0;
        } else if (x > maxX) {
          x = maxX;
        }

        if (y < 0) {
          y = 0;
        } else if (y > maxY) {
          y = maxY;
        }

        if (binding.value === 'father') {
          el.parentNode.style.left = x + 'px';
          el.parentNode.style.top = y + 'px';
        } else {
          el.style.left = x + 'px';
          el.style.top = y + 'px';
        }
      };
      document.onmouseup = function () {
        document.onmousemove = document.onmouseup = null;
      };
    };
  },
};
export default draggable;

演示

      <!-- 详情弹窗 -->
      <transition name="fade">
        <div class="entity-detail-box" v-if="isShowDetail" :style="detailStyle">
          <div v-draggable="'father'" class="drag-mask"></div>
          <div class="closeBtn pointer" @click="() => (isShowDetail = false)">
            关闭
          </div>
          <slot name="detail"></slot>
        </div>
      </transition>

【Vue】vue3 v-draggable 拖拽指令封装,Vue,vue.js,javascript,ecmascript文章来源地址https://www.toymoban.com/news/detail-605162.html

到了这里,关于【Vue】vue3 v-draggable 拖拽指令封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • vue3 图片放大缩小、拖拽功能(自定义指令)

    效果 自定义 拖拽指令 vDrag.js 参考来源 https://github.com/sunzsh 使用 自定义 拖拽指令 写法二 (带传参及回调写法) vDrag.js 使用 自定义 缩放指令 vWheelScale.js 根据项目需要 我指令加了 动态参数 及 回调函数 不需要自行修改 使用 自定义 缩放指令 写法二(带传参及回调写法)

    2024年02月01日
    浏览(60)
  • vue3 封装自定义指令,监听元素宽高的变化

    最近做一个项目,涉及到echart图,要去根据父元素去自适应宽高,所以需要监听到元素的宽高变化、 因为是 监听某一元素的宽高变化 ,所以这里用的是 ResizeObserver. ResizeObserver 是可以监听到DOM元素,宽高的变化,需要注意的一点就是监听出变化结果是contentBox的宽度和高度。

    2024年02月07日
    浏览(47)
  • 低代码开发之vue.draggable的使用(进阶:组件化拖拽生成功能页面)

    效果展示: 前言:随着各公司定制化需求的不断攀升,公司对低代码、组态化的开发需求日渐迫切。也许是研发任务节点将至,也许是为顺应时代潮流,我也是去学习并实践了一番。如图所示。 功能简介: 左侧组件区域特意做了选中态,小眼睛预览浮框态等交互,右侧内容区

    2024年03月23日
    浏览(53)
  • 低代码开发之vue.draggable的使用(初阶:组件化拖拽生成简单页面)

    效果展示 vue.draggable 安装 使用 vue.draggable 相关属性 事件 Demo完整代码 更多详见draggable官网=https://www.itxst.com/vue-draggable/tutorial.html

    2024年02月19日
    浏览(40)
  • vue去掉所有输入框两边空格,封装指令去空格,支持Vue2和Vue3,ElementUI Input去空格

    就是页面很多表单输入框,期望在提交的时候,都要把用户两边的空格去掉 ❌使用 vue 的指令 .trim 去掉空格 中间会输入不了空格, 比如我想输入 你好啊 中国 , 这中间的空格输入不了,只能变成 你好啊中国 ❌在提交的时候使用 trim() 方法去两边空格 需要一个个字段的添加,

    2024年02月14日
    浏览(51)
  • 原生JS的拖拽属性draggable(详解)

    摘要 作为h5新增的属性draggable,它能够给与一切的html元素拖动的效果。而在这个属性之下,也有着关于拖动效果的各个方法。 而这一篇文章,主要就是说一下关于draggable属性的使用以及工作场景。 1.了解draggable属性的使用 对我来讲,我希望在学习一个知识的时候,最开始就

    2023年04月19日
    浏览(37)
  • axios 实战进阶练习( axios 封装篇)——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台的 axios 封装实战

    在之前的文章 axios 实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台 中,我们完成了这个 基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台 的项目,其中项目的后端接口是用 Node.js 编写的,通过 axios 来获取接口,所以这篇文章我们来对这个 axi

    2024年02月11日
    浏览(104)
  • Taro + vue3 + js + nutUI 框架中自定义tabbar的组件封装以及页面跳转的逻辑

    1.需求:   在H5 中需要封装一个自定义的tabbar 菜单跳转 通过nut-ui 进行二次封装 2. 注意点   H5 中原生的tabbar 在ios 中会出现问题 所以进行 封装tabbar 3. 代码操作 首先全部的代码  4.解析 tabList: 菜单的内容数组  根据自己菜单的数量 来决定 const tabList = reactivemenu[]([     {    

    2024年04月17日
    浏览(54)
  • vue 自定义指令(鼠标拖拽滑动)

    1、创建一个js文件 2、在main.js中引入这个js import dragscroll from \\\'@utils/directives.js\\\'; app.directive(\\\'dragscroll\\\',dragscroll); 3、在页面中使用 ul class=\\\"navBar\\\" id=\\\"nav\\\" v-dragscroll li拖动1/li li拖动2/li li拖动3/li li拖动4/li li拖动5/li li拖动6/li li拖动7/li li拖动8/li li拖动9/li li拖动10/li /ul 4、效果   参考

    2024年02月11日
    浏览(50)
  • vue3 拖拽插件 Vue3DraggableResizable

    Vue3DraggableResizable 拖拽插件的官方文档 一、Vue3DraggableResizable 的属性和事件 属性 类型 默认值 功能描述 示例 initW Number null 设置初始宽度(px) Vue3DraggableResizable :initW=“100” / initH Number null 设置初始高度(px) Vue3DraggableResizable :initH=“100” / w Number 0 组件的当前宽度(px),你

    2024年02月03日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包