vue实现可拖拽移动悬浮球

warning: 这篇文章距离上次修改已过202天,其中的内容可能已经有所变动。

在Vue中实现一个可拖拽移动的悬浮球可以通过组合API和原生DOM事件来完成。以下是一个简单的示例:




<template>
  <div id="app">
    <div
      class="draggable"
      :style="{ top: ballPosition.y + 'px', left: ballPosition.x + 'px' }"
      @mousedown="handleMouseDown"
      @touchstart="handleTouchStart"
    >
      拖动我
    </div>
  </div>
</template>
 
<script>
import { reactive, toRefs } from 'vue';
 
export default {
  setup() {
    const state = reactive({
      isDragging: false,
      ballPosition: { x: 0, y: 0 },
    });
 
    const handleMouseMove = (event) => {
      if (state.isDragging) {
        state.ballPosition.x = event.clientX - 25;
        state.ballPosition.y = event.clientY - 25;
      }
    };
 
    const handleMouseUp = () => {
      state.isDragging = false;
      document.removeEventListener('mousemove', handleMouseMove);
      document.removeEventListener('mouseup', handleMouseUp);
    };
 
    const handleMouseDown = (event) => {
      state.isDragging = true;
      handleMouseMove(event);
      document.addEventListener('mousemove', handleMouseMove);
      document.addEventListener('mouseup', handleMouseUp);
    };
 
    const handleTouchMove = (event) => {
      if (state.isDragging) {
        state.ballPosition.x = event.touches[0].clientX - 25;
        state.ballPosition.y = event.touches[0].clientY - 25;
      }
    };
 
    const handleTouchEnd = () => {
      state.isDragging = false;
      document.removeEventListener('touchmove', handleTouchMove);
      document.removeEventListener('touchend', handleTouchEnd);
    };
 
    const handleTouchStart = (event) => {
      state.isDragging = true;
      handleTouchMove(event);
      document.addEventListener('touchmove', handleTouchMove);
      document.addEventListener('touchend', handleTouchEnd);
    };
 
    return {
      ...toRefs(state),
      handleMouseDown,
      handleTouchStart,
    };
  },
};
</script>
 
<style>
.draggable {
  width: 50px;
  height: 50px;
  position: absolute;
  cursor: pointer;
  background-color: #3498db;
  border-radius: 50%;
  color: white;
  text-align: center;
  line-height: 50px;
  z-index: 1000;
  user-select: none;
}
</style>

在这个示例中,.draggable 元素是悬浮球,它绑定了 mousedowntouchstart 事件处理函数,以便在用户开始拖动时进行响应。handleMouseMovehandleTouchMove 函数用于更新悬浮球的位置,handleMouseUphandleTouchEndhandleMouseDown 函数用于处理拖动结束。这些函数在 setup 函数中返回,以便它们可以作为事件处理函数使用。

VUE
最后修改于:2024年08月10日 19:02

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日