JS函数封装实现控件拖拽
js脚本
export function dragBox(drag, wrap) {
// 用于获取父容器的样式属性值
function getCss(ele, prop) {
// getComputedStyle返回值是带单位的字符串,所以得parseInt
return parseInt(window.getComputedStyle(ele)[prop]);
}
// 鼠标点击位置的屏幕x,y坐标
let initX;
let initY;
// 父容器的屏幕x,y坐标
let wrapLeft;
let wrapRight;
// 用于判断鼠标按住与松开
let dragable = false;
// 给子容器绑定mousedown事件
drag.addEventListener(
"mousedown",
function (e) {
dragable = true;
wrapLeft = getCss(wrap, "left");
wrapRight = getCss(wrap, "top");
initX = e.clientX;
initY = e.clientY;
},
false
);
// 给子容器绑定mouseup事件
drag.addEventListener(
"mouseup",
function (e) {
dragable = false;
},
false
);
// 页面绑定mousemove事件
document.addEventListener("mousemove", function (e) {
if (dragable === true) {
let nowX = e.clientX;
let nowY = e.clientY;
let disX = nowX - initX;
let disY = nowY - initY;
wrap.style.left = wrapLeft + disX + "px";
wrap.style.top = wrapRight + disY + "px";
}
});
}
vue页面使用
<template>
<div id="father">
<div id="son"/>
......
</div>
</template>
<script>
import { dragBox } from '@/utils/controls'
export default {
.....
mounted(){
this.$nextTick(()=>{
dragBox(document.querySelector('.son'),document.querySelector('#father'))
})
},
......
}
</script>
<style>
#father{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 15px;
#son{
cursor: move;
}
......
}
</style>
注意这里的函数会形成闭包,变量会一直保存在内存
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!