vue3实现拖动功能,原生js

本文介绍了如何使用Vue.js构建一个可以被鼠标拖动的视频组件,通过`mousedown`,`mousemove`,和`mouseup`事件实现视频位置的实时更新和拖放功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<template>  
  <div  
    class="video-overlay"  
    @mousedown="startDrag"  
    @mousemove="drag"  
    @mouseup="endDrag"  
    @mouseleave="endDrag"  
    ref="draggableDiv"  
  >  
    <video class="draggable-video" controls loop src="../../assets/rabbit320.mp4" alt="景点视频"></video>  
  </div>  
</template>  
  
<script setup lang="ts">  
import { ref, onMounted, onUnmounted } from 'vue';  
  
const draggableDiv = ref<HTMLElement | null>(null);  
  
let dragging = false;  
let currentX = 0;  
let currentY = 0;  
let initialX = 0;  
let initialY = 0;  
let offsetX = 0;  
let offsetY = 0;  
  
const startDrag = (event: MouseEvent) => {  
  dragging = true;  
  initialX = event.clientX - offsetX;  
  initialY = event.clientY - offsetY;  
};  
  
const drag = (event: MouseEvent) => {  
  if (dragging) {  
    event.preventDefault();  
    const newX = event.clientX - initialX;  
    const newY = event.clientY - initialY;  
    offsetX = newX;  
    offsetY = newY;  
    setTranslate(newX, newY);  
  }  
};  
  
const endDrag = () => {  
  dragging = false;  
};  
  
const setTranslate = (xPos: number, yPos: number) => {  
  if (draggableDiv.value) {  
    draggableDiv.value.style.transform = `translate(${xPos}px, ${yPos}px)`;  
  }  
};  
  
onMounted(() => {  
  // 确保在组件挂载后绑定事件  
  document.addEventListener('mousemove', drag);  
  document.addEventListener('mouseup', endDrag);  
  document.addEventListener('mouseleave', endDrag);  
});  
  
onUnmounted(() => {  
  // 组件卸载时移除事件监听器  
  document.removeEventListener('mousemove', drag);  
  document.removeEventListener('mouseup', endDrag);  
  document.removeEventListener('mouseleave', endDrag);  
});  
</script>  
  
<style scoped>  
.video-overlay {  
  position: absolute;  
  cursor: move;  
  /* 其他样式 */  
}  
  
.draggable-video {  
  /* 视频样式 */  
}  
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值