js拖拽效果
拖拽实现步骤:
鼠标按下 开始拖拽
鼠标移动 拖拽过程
鼠标松开 结束
然后在移动过程中,将偏移值赋值给拖拽的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | var params = { left: 0, top: 0, currentX: 0, //开始时的x坐标 currentY: 0, //开始时的y坐标 flag: false //标记鼠标按下或松开 }; //获取相关CSS属性 //o是移动对象 var getCss = function (o, key) { //兼容ie的currentStyle和其他浏览器支持的getComputedStyle方法 return o.currentStyle ? o.currentStyle[key] : document.defaultView.getComputedStyle(o, false)[key]; }; //拖拽的实现 var startDrag = function (bar, target, callback) { if (getCss(target, "left") !== "auto") { params.left = getCss(target, "left"); } if (getCss(target, "top") !== "auto") { params.top = getCss(target, "top"); } //触发拖拽的对象发生鼠标按下事件 bar.onmousedown = function (event) { params.flag = true; //兼容ie if (!event) { event = window.event; //防止IE文字选中 bar.onselectstart = function () { return false; } } var e = event; //传入初始坐标 params.currentX = e.clientX; params.currentY = e.clientY; }; document.onmouseup = function () { params.flag = false; if (getCss(target, "left") !== "auto") { //获取移动后的x params.left = getCss(target, "left"); } if (getCss(target, "top") !== "auto") { //获取移动后的y params.top = getCss(target, "top"); } }; document.onmousemove = function (event) { var e = event ? event : window.event; //鼠标还在按下状态 if (params.flag) { //获取现在的坐标 var nowX = e.clientX, nowY = e.clientY; //鼠标移动路径 var disX = nowX, disY = nowY; //将移动后的坐标传给target target.style.left = disX + "px"; target.style.top = disY + "px"; if (event.preventDefault) { event.preventDefault(); } return false; } if (typeof callback == "function") { callback(parseInt(params.left) + disX, parseInt(params.top) + disY); } } }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通