当前位置: 首页 > news >正文

vue中实现元素在界面中自由拖动

这是一个使用 Vue 2 实现可拖动 div 的示例。

<!DOCTYPE html>
<html>
<head>
  <title>Vue 2 可拖动 Div</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  <style>
    #draggable-div {
      position: absolute;
      width: 200px;
      height: 200px;
      background-color: #4CAF50;
      color: white;
      text-align: center;
      line-height: 200px;
      cursor: move;
      user-select: none;
    }
  </style>
</head>
<body>
  <div id="app">
    <div 
      id="draggable-div"
      @mousedown="startDrag"
      :style="{ left: `${posX}px`, top: `${posY}px` }"
    >
      拖动我
    </div>
  </div>

  <script>
    new Vue({
      el: '#app',
      data: {
        posX: 100,
        posY: 100,
        isDragging: false,
        offsetX: 0,
        offsetY: 0
      },
      methods: {
        startDrag(event) {
          this.isDragging = true;
          // 计算鼠标点击位置与 div 左上角的偏移
          this.offsetX = event.clientX - this.posX;
          this.offsetY = event.clientY - this.posY;
          
          // 添加全局事件监听
          document.addEventListener('mousemove', this.onDrag);
          document.addEventListener('mouseup', this.stopDrag);
        },
        onDrag(event) {
          if (this.isDragging) {
            // 更新 div 位置
            this.posX = event.clientX - this.offsetX;
            this.posY = event.clientY - this.offsetY;
          }
        },
        stopDrag() {
          this.isDragging = false;
          
          // 移除全局事件监听
          document.removeEventListener('mousemove', this.onDrag);
          document.removeEventListener('mouseup', this.stopDrag);
        }
      }
    });
  </script>
</body>
</html>

这个示例实现了一个可拖动的 div,具体特点如下:

  1. 使用 Vue 2 实现拖动逻辑
  2. 通过 mousedownmousemovemouseup 事件控制拖动
  3. 添加了鼠标偏移计算,使得拖动更加自然
  4. 使用 :style 绑定 div 的位置
  5. 通过 CSS 设置 cursor: move 提示可拖动
  6. 添加 user-select: none 防止文字选中干扰拖动

主要实现步骤:

  • startDrag 方法:记录鼠标点击的初始位置和偏移
  • onDrag 方法:实时更新 div 位置
  • stopDrag 方法:结束拖动并移除事件监听

你可以直接在浏览器中打开这个 HTML 文件,就能看到可拖动的绿色 div。

需要注意的是,这是一个基础实现。对于更复杂的拖动需求,建议使用 Vue Draggable 等专业的拖动库。

相关文章:

  • Flink介绍与安装
  • 4.(vue3.x+vite)接入echarts
  • 前端工程化开篇
  • Redis 如何保证数据一致性:从原理到实践的全面解析
  • 【Flutter入门】1. 从零开始的flutter跨平台开发之旅(概述、环境搭建、第一个Flutter应用)
  • 基于微信小程序的仓储管理系统+论文源码调试
  • Linux程序性能分析
  • 蓝之洋科技以AI智能制造引领变革,推动移动电源产业迈向高端智能化!
  • vue创建子组件步骤及注意事项
  • 安装samba脚本
  • 04_JavaScript循环结构
  • kafka基础
  • 【蓝桥杯—单片机】数模电路专项 | 真题整理、解析与拓展 | 省赛题 (更新ing...)
  • 【DeepSeek大语言模型】基于DeepSeek和Python的高光谱遥感从数据到智能决策全流程实现与城市、植被、水体、地质、土壤五维一体应用
  • Docker Compose介绍
  • JavaPro
  • 【Java】readUnsignedShort()与readShort()
  • VS Code连接远程服务遇到的问题
  • 神奇的闹钟(算法题)
  • 蓝桥备赛(27)算法篇【二分算法】
  • 外交部:巴基斯坦副总理兼外长达尔5月19日至21日访华
  • “当代阿炳”甘柏林逝世,创办了国内第一所残疾人高等学府
  • 古稀之年的设计家吴国欣:重拾水彩,触摸老上海文脉
  • 国宝归来!子弹库帛书二、三卷抵达北京
  • 特朗普政府涉税改法案遭众议院预算委员会否决
  • 小雨伞保险经纪母公司手回集团通过港交所聆讯