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

vue中操作dom,实现元素的拖拉拽

使用原生的操作DOM的方式,实现元素的拖拉拽功能。默认将元素绝对定位到左上角位置left为0,top为0。监听元素的移动,只需要知道元素的左上角x和y位置即可,元素的x和y的偏移量就是元素重新进行定位的left和top的数据。
getBoundingClientRect() 是 DOM 元素的一个方法,它返回一个 DOMRect 对象,提供了元素的大小及其相对于视口(viewport)的位置信息。
具体代码:

<template><divref="draggable"class="draggable-box"@mousedown="startDrag">拖拽我 (自定义实现)</div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue'const draggable = ref(null)
let isDragging = false; // 是否拖动
let offsetX = 0
let offsetY = 0const startDrag = (e) => {isDragging = true// 计算鼠标相对于元素左上角的偏移// getBoundingClientRect() 是 DOM 元素的一个方法,它返回一个 DOMRect 对象,提供了元素的大小及其相对于视口(viewport)的位置信息。const rect = draggable.value.getBoundingClientRect();// console.log(`元素距离视口左侧: ${rect.left}px`);// console.log(`元素距离视口顶部: ${rect.top}px`);offsetX = e.clientX - rect.left; offsetY = e.clientY - rect.top// 添加样式draggable.value.style.cursor = 'grabbing'draggable.value.style.userSelect = 'none'// 阻止默认行为防止文本选中e.preventDefault()
}const onMouseMove = (e) => {if (!isDragging) return// 计算新位置const x = e.clientX - offsetXconst y = e.clientY - offsetY// 应用新位置draggable.value.style.left = `${x}px`draggable.value.style.top = `${y}px`
}const stopDrag = () => {isDragging = falseif (draggable.value) {draggable.value.style.cursor = 'grab'draggable.value.style.userSelect = ''}
}onMounted(() => {// 初始位置draggable.value.style.position = 'absolute'draggable.value.style.left = '0px'draggable.value.style.top = '0px'// 添加事件监听document.addEventListener('mousemove', onMouseMove)document.addEventListener('mouseup', stopDrag)
})onUnmounted(() => {// 移除事件监听document.removeEventListener('mousemove', onMouseMove)document.removeEventListener('mouseup', stopDrag)
})
</script><style>
.draggable-box {width: 100px;height: 100px;background-color: #e74c3c;color: white;display: flex;justify-content: center;align-items: center;cursor: grab;user-select: none;
}
</style>
http://www.xdnf.cn/news/346033.html

相关文章:

  • 网络基础入门第6-7集(抓包技术)
  • PHM领域的两个阶段:状态监测与故障诊断
  • SAM详解2.1(好题1)
  • Azure Databricks:数据创新与智能决策的云端利器
  • 生成数论:三生原理与中国数学的多点突破态势?
  • 基础 Python 编程的部分公式和概念总结
  • sherpa:介绍
  • LeetCode:翻转二叉树
  • DLMS协议 —— System title 详解(作用及结构一览)
  • C——操作符详解
  • 广州AI数字人:从“虚拟”走向“现实”的变革力量
  • HOW - 在 Mac 上的 Chrome 浏览器中调试 Windows 场景下的前端页面
  • 《React Native热更新实战:用Pushy打造无缝升级体验》
  • systemd vs crontab:Linux 自动化运行系统的全面对比
  • 深入理解栈数据结构(Java实现):从原理到实战应用
  • LeetCode[226] 翻转二叉树
  • 基于Qt开发的http/https客户端
  • 电子电气架构 --- 如何有助于提安全性并减少事故
  • FEKO许可限制
  • OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorLSBP
  • 芯片笔记 - 手册参数注释
  • Spring Security(笔记)
  • 第37次CCF--机器人饲养
  • C语言自定义类型:联合与枚举详解
  • QT中的网络请求
  • Pycharm安装后打开提示:此应用无法在你的电脑上运行,若要找到合适于你的电脑的版本,请咨询发布者
  • 如何选择自己喜欢的cms
  • 【Unity中的数学】—— 四元数
  • 实时操作系统:航空电子系统的安全基石还是创新枷锁?
  • std::iota(C++)