一.原生js
1、拖拽的流程动作
- 鼠标按下 触发onmousedown事件
- 鼠标移动 触发onmousemove事件
- 鼠标松开 触发onmouseup事件
2、注意事项:
- 要防止div移出可视框,要限制div移动的横纵坐标;
- 防止火狐的bug, 要在最后写上return false,阻止默认事件;
- 防止鼠标运动时移出div,所以要用document.onmousemove和document.onmouseup,不能用oDiv.onmousemove;
3、代码实现:
html:
<div id='box' style="position:relative;width:100px;height:100px;background:#ee735c;"> <!--为了设置left、top,需相对或绝对定位--> 可拖动div元素 </div>
js:
window.onload = function() { var box = document.getElementById('box') box.onmousedown = function(e) { //首先要获取鼠标相对于元素的位置 var disX = e.clientX - box.offsetLeft //clientX,Y鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标) var disY = e.clientY - box.offsetTop //offsetLeft,top是元素相对父元素的偏移宽度 document.onmousemove = function(e) { var l = e.clientX - disX var t = e.clientY - disY if(l < 0) { //防止div跑出可视框 l = 0; } else if(l > document.documentElement.clientWidth - box.offsetWidth) { l = document.documentElement.clientWidth - box.offsetWidth; } if(t < 0) { t = 0; } else if(t > document.documentElement.clientHeight - box.offsetHeight) { t = document.documentElement.clientHeight - box.offsetHeight; } box.style.left = l + 'px'; box.style.top = t + 'px'; } document.onmouseup = function() { document.onmousemove = null; document.onmouseup = null } return false } }
二.H5 drag和drop拖放
拖放是html5的标准,任何元素都能够拖放
html:
<div class="div1" ondrop="drop(event)" ondragover="allowDrop(event)"> <img src="img/2.jpg" draggable="true" ondragstart="drag(event)" id="drag1" /> //设置元素可拖放 </div> <div class="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
js:
function drag(ev) { //ondragstart拖动开始 ev.dataTransfer.setData("ok", ev.target.id); //设置元素属性 } function allowDrop(ev) { //ondragover拖动结束 ev.preventDefault(); //默认不许放置,阻止默认 } function drop(ev) { //ondrop放置 ev.preventDefault(); var data = ev.dataTransfer.getData("ok"); //加入元素 ev.target.appendChild(document.getElementById(data)); }
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 通过抓包,深入揭秘MCP协议底层通信
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· 浅谈为什么我讨厌分布式事务
· 在 .NET 中使用内存映射文件构建高性能的进程间通信队列
· 那些年我们一起追过的Java技术,现在真的别再追了!
· 一款基于 .NET 开源免费、轻量快速、跨平台的 PDF 阅读器
· 还在手写JSON调教大模型?.NET 9有新玩法
· 面试时该如何做好自我介绍呢?附带介绍样板示例!!!
· 为大模型 MCP Code Interpreter 而生:C# Runner 开源发布