Vue实现简易拖拽菜单栏

vue3环境

自己记录一下,希望对您有帮助

<template>  
  <div class="container">  
    <el-container>  
      <!-- 左侧菜单 -->
      <el-aside :width="`${width}px`">  
        <!-- 拖拽区域 -->
        <div class="resize" @mousedown="startDrag"></div>  
      </el-aside>  
      <el-main>Main</el-main>  
    </el-container>  
  </div>  
</template> 

<script setup>

// 菜单初始宽度
const width = ref(200);  

// 鼠标按下时的初始位置  
let startX = null;

// 标记是否正在拖动  
let isDragging = false;  

// 开始拖动  
const startDrag = (event) => {  

// 阻止默认行为和冒泡  
event.preventDefault();  
event.stopPropagation();  

// 记录鼠标按下时的 X 坐标  
startX = event.clientX;  

// 标记为正在拖动  
isDragging = true;  

// 监听鼠标移动事件  
document.addEventListener('mousemove', handleMouseMove);  

// 监听鼠标释放事件  
document.addEventListener('mouseup', stopDrag);  

};  

 
// 处理鼠标移动  
const handleMouseMove = (event) => {  
if (!isDragging || !startX) return;  

// 计算鼠标移动的距离  
const moveX = event.clientX - startX;  

// 更新侧边栏宽度,并限制在一定范围内(200~400)
const newWidth = Math.max(200, Math.min(400, width.value + moveX));  
width.value = newWidth;  

// 更新起始位置为当前位置,用于连续拖动  
startX = event.clientX;  

};  


// 停止拖动  
const stopDrag = () => {  

// 移除事件监听器  
document.removeEventListener('mousemove', handleMouseMove);  
document.removeEventListener('mouseup', stopDrag);  

// 标记为非拖动状态  
isDragging = false;  
startX = null;  

};  

// 组件卸载时移除事件监听器,防止内存泄漏  
onUnmounted(() => {  
 // 这里通常不需要手动移除事件监听器,因为组件卸载后 DOM 元素也会被销毁  
 // 但如果出于某种原因需要手动清理,可以这样做:  
 // document.removeEventListener('mousemove', handleMouseMove); // 注意:这通常不是必要的  
 // document.removeEventListener('mouseup', stopDrag); // 注意:这通常不是必要的  
}); 

</script> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值