vue2和vue3拖拽移动div

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

直接上代码,代码可以直接运行,
vue2拖拽移动div:

<template>
    <div
      ref="draggable"
      @mousedown="dragStart"
      @mousemove="drag"
      @mouseup="dragEnd"
      style="width:100px;height:100px;background-color:red;">
      Drag me
    </div>
</template>
  
<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      moveX: 0,
      moveY: 0
    }
  },
  methods: {
    dragStart(e) {
      this.isDragging = true;
      this.startX = e.clientX - this.moveX;
      this.startY = e.clientY - this.moveY;
    },
    drag(e) {
      if (!this.isDragging) return;
      this.moveX = e.clientX - this.startX;
      this.moveY = e.clientY - this.startY;
      
      if(this.moveX < 0) {
        this.moveX = 0;
      } else if(this.moveX + this.$refs.draggable.offsetWidth > window.innerWidth) {
        this.moveX = window.innerWidth - this.$refs.draggable.offsetWidth;
      }

      if(this.moveY < 0) {
        this.moveY = 0;
      } else if(this.moveY + this.$refs.draggable.offsetHeight > window.innerHeight) {
        this.moveY = window.innerHeight - this.$refs.draggable.offsetHeight;
      }
      this.$refs.draggable.style.transform = `translate(${this.moveX}px, ${this.moveY}px)`;
    },
    dragEnd() {
      this.isDragging = false;
    }
  },
  mounted() {
    this.moveX = this.$refs.draggable.offsetLeft;
    this.moveY = this.$refs.draggable.offsetTop;
    document.addEventListener('mousemove', this.drag);
    document.addEventListener('mouseup', this.dragEnd);
  },
  beforeDestroy() {
    document.removeEventListener('mousemove', this.drag);
    document.removeEventListener('mouseup', this.dragEnd);
  }
}
</script>

vue3拖拽移动div:

<template>
    <div
      ref="draggable"
      @mousedown="dragStart"
      @mousemove="drag"
      @mouseup="dragEnd"
      style="width:100px;height:100px;background-color:red;">
      Drag me
    </div>
  </template>
  
  <script setup>
  import { ref, onMounted, onUnmounted } from 'vue';
  
      const draggable = ref(null);
      let isDragging = false;
      let startX = 0;
      let startY = 0;
      let moveX = 0;
      let moveY = 0;
  
      const dragStart = (e) => {
        isDragging = true;
        startX = e.clientX - moveX;
        startY = e.clientY - moveY;
      }
  
      const drag = (e) => {
        if (!isDragging) return;
      moveX = e.clientX - startX;
      moveY = e.clientY - startY;
      
      if(moveX < 0) {
        moveX = 0;
      } else if(moveX + draggable.value.offsetWidth > window.innerWidth) {
        moveX = window.innerWidth - draggable.value.offsetWidth;
      }

      if(moveY < 0) {
        moveY = 0;
      } else if(moveY + draggable.value.offsetHeight > window.innerHeight) {
        moveY = window.innerHeight - draggable.value.offsetHeight;
      }
        draggable.value.style.transform = `translate(${moveX}px, ${moveY}px)`;
      }
  
      const dragEnd = () => {
        isDragging = false;
      }
  
      onMounted(() => {
        moveX = draggable.value.offsetLeft;
        moveY = draggable.value.offsetTop;
        document.addEventListener('mousemove', drag);
        document.addEventListener('mouseup', dragEnd);
      });
  
      onUnmounted(() => {
        document.removeEventListener('mousemove', drag);
        document.removeEventListener('mouseup', dragEnd);
      });
  
  </script>

设置div居中后,发现一开始拖拽时,div会跑到最左边,vue3优化代码如下:文章来源地址https://www.toymoban.com/news/detail-730459.html

<template>
    <div id="scrm_phonebar_div"
      @mousedown="dragStart"
      style="position: absolute;left:50%;top:20px;transform: translateX(-50%);background-color:red;">
      Drag me
    </div>
</template>

<script setup>
import { onMounted,onBeforeUnmount} from 'vue';
  // 拖拽-----------start--------
  let isDragging = false;
  let startX = 0;
  let startY = 0;
  
  const dragStart = (e) => {
    e.preventDefault(); // 拖动过程中阻止浏览器默认事件
    if(e.button !== 0 || e.target !== document.getElementById("scrm_phonebar_div")) return;
    const iframeDiv = document.getElementById("scrm_phonebar_div");
    document.body.style.cursor = 'move';
    isDragging = true;
    startX = e.clientX - iframeDiv.offsetLeft;
    startY = e.clientY - iframeDiv.offsetTop;
    document.addEventListener('mousemove', drag);
    document.addEventListener('mouseup', dragEnd);
    window.addEventListener('blur', dragEnd);
  }

  const drag = (e) => {
    if(e.buttons === 0) {
        dragEnd()
        return
    }
    if (!isDragging ) return;
    const iframeDiv = document.getElementById("scrm_phonebar_div");
    document.body.style.cursor = 'move';
    let moveX = e.clientX - startX;
    let moveY = e.clientY - startY;
    if(moveX < iframeDiv.offsetWidth/2){
        moveX = iframeDiv.offsetWidth/2;
    }else if(moveX > window.innerWidth - iframeDiv.offsetWidth/2){
        moveX = window.innerWidth - iframeDiv.offsetWidth/2
    }
    if(moveY < 0){
        moveY = 0
    }else if(moveY > window.innerHeight - iframeDiv.offsetHeight){
        moveY =  window.innerHeight - iframeDiv.offsetHeight
    }
    iframeDiv.style.left = moveX + 'px';
    iframeDiv.style.top = moveY + 'px'
  }

  const dragEnd = () => {
    document.body.style.cursor = 'auto';
    isDragging = false;
    document.removeEventListener('mousemove', drag);
    document.removeEventListener('mouseup', dragEnd);
    window.removeEventListener('blur', dragEnd);
  }
// 拖拽-----------end---------
    onBeforeUnmount(() => {
        dragEnd()
    });
  <script>

到了这里,关于vue2和vue3拖拽移动div的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Vue3/Vue2】判断设备是移动端还是pc端跳转不同路由router

          APP文件中写入js代码 1、首先,通过 isMobile() 函数判断用户的设备类型。该函数使用正则表达式匹配 navigator.userAgent 字符串,以确定用户是在移动设备上访问网页还是在桌面设备上访问网页 2、然后,在 onMounted() 钩子函数中,根据当前的路由路径来判断是否需要进行重定

    2024年01月16日
    浏览(62)
  • 【前端面经】Vue3和Vue2的区别

    Vue是一种非常流行的JavaScript框架,因其易用性和灵活性在开发人员中备受欢迎。Vue2是Vue框架的上一个重要版本,于2016年发布。但是,Vue3是最新版本的Vue框架,于2020年正式发布并带来了一些重大变化。本文将探讨Vue3和Vue2之间的主要区别。 Vue3的一个显着优势是其更小的代码

    2024年02月02日
    浏览(83)
  • 前端(四)——vue.js、vue、vue2、vue3

    😊博主:小猫娃来啦 😊文章核心: vue.js、vue、vue2、vue3从全局到局部 Vue.js是一款流行的JavaScript框架 vue,vue2,vue3都是vue.js的不同版本。 Vue:Vue.js的第一个版本,也称为Vue 1.x。它于2014年首次发布,并获得了广泛的应用和认可。 Vue2:Vue.js的第二个版本,也称为Vue 2.x。它在Vu

    2024年02月12日
    浏览(79)
  • 从Vue2到Vue3, 一键升级前端开发技能

    本文的目的,是为了让已经有 Vue2 开发经验的   人   ,快速掌握 Vue3 的写法。 因此,   本篇假定你已经掌握 Vue 的核心内容   ,只为你介绍编写 Vue3 代码,需要了解的内容。 首先,Vue3 新增了一个叫做组合式 api 的东西,英文名叫 Composition API 。因此 Vue3 的  script  现在支

    2024年02月08日
    浏览(76)
  • vue3.0 安卓和ios h5 移动端音频自定义圆环可拖拽播放(兼容微信浏览器)

    安装  npm install weixin-js-sdk 引入 template     div class=\\\"circle_box\\\"         div id=\\\"content\\\"/div          img class=\\\"img_0\\\" src=\\\"https://img.yzcdn.cn/vant/cat.jpeg\\\" alt=\\\"\\\"          img @click=\\\"changeType\\\" class=\\\"img_1\\\" v-show=\\\"playbool\\\" src=\\\"@/assets/decompression/pressure_audio_play.png\\\" alt=\\\"\\\"          img @click=\\\"changeType\\\"

    2023年04月23日
    浏览(102)
  • 关于前端框架vue2升级为vue3的相关说明

    一些框架需要升级 当前(202306) Vue 的最新稳定版本是 v3.3.4 。Vue 框架升级为最新的3.0版本,涉及的相关依赖变更有: 前提条件:已安装 16.0 或更高版本的Node.js(摘) 必须的变更:核心库vue@23、路由vue-router@34、状态管理vuex@34 构建工具链: Vue CLI Vite(摘) 状态管理: Vuex Pi

    2024年02月15日
    浏览(51)
  • 前端vue2、vue3去掉url路由“ # ”号——nginx配置

    大家好,我是yma16,本文分享关于vue2、vue3去掉url路由 # 号——nginx配置。 html的 hash模式 HTML的hash模式指的是URL中的锚点部分(#后面的内容)被用于在单个页面中显示不同的内容,而不是导航到不同的页面。例如: 在这个示例中, #about 部分是一个锚点,用于在页面上显示关

    2024年02月11日
    浏览(76)
  • 前端经典面试题 | 吊打面试官系列 之 Vue2和Vue3的区别

    🖥️ 前端经典面试题 吊打面试官 专栏:Vue2和Vue3的区别 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力❤️ 目录 一、回答点 二、深入回答 监测机制

    2024年01月16日
    浏览(48)
  • 【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

    gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。 当前 GoGoCode 支持解析和操作如下类型的代码: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    浏览(54)
  • vue3前端开发,感受一下组合式api和VUE2选项式的差异

    vue3前端开发,感受一下组合式api和VUE2选项式的差异!今天开始,正式开始,进入学习Vue3的内容。以后代码,案例分享,都会采用组合式api的模式为大家做展示。 今天是第一节,带大家感受一下,Vue3的组合式api和之前传统的vue2版本选项式api的差别。 首先,大家需要提前使用

    2024年01月19日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包